diff --git a/engine.build.lua b/engine.build.lua index ba05810..a6ddf21 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -27,7 +27,7 @@ local system_module = Module("source/System", { "Path.cpp", "MessageHandler.cpp", "MessageQueue.cpp", - "SystemEvent.cpp", + "Event.cpp", "Log.cpp" }) diff --git a/include/Spectre/System/Event.h b/include/Spectre/System/Event.h new file mode 100644 index 0000000..657e461 --- /dev/null +++ b/include/Spectre/System/Event.h @@ -0,0 +1,74 @@ + +#ifndef SPECTRE_SYSTEM_EVENT_H +#define SPECTRE_SYSTEM_EVENT_H + +#include +#include + +namespace sp { + +class Display; + +struct Event +{ +public : + + enum Type { + None, + Quit, + Size, + Key, + MouseButton, + MouseMove + }; + + struct KeyEvent { + Keyboard::Key code; + bool pressed; /* true if pressed, false if released. */ + + std::string getKeyName() const; /* Get the key name */ + }; + + struct MouseButtonEvent { + Mouse::Button button; + bool pressed; /* true if pressed, false if released. */ + + std::string getName() const; + }; + + struct MouseMoveEvent { + unsigned int x; + unsigned int y; + }; + + struct SizeEvent + { + Display *display; + int width; + int height; + }; + + Type type; + union { + struct SizeEvent size; + struct KeyEvent key; + struct MouseMoveEvent mouseMove; + struct MouseButtonEvent mouseButton; + }; + + Event(Type type = None); + + // Helper methods + + static Event createSize(Display *display, int width, int height); + + static Event createKey(Keyboard::Key code, bool pressed); + + static Event createMouseButton(Mouse::Button button, bool pressed); + + static Event createMouseMove(unsigned int x, unsigned int y); +}; + +} // namespace sp + +#endif /* SPECTRE_SYSTEM_EVENT_H */ diff --git a/include/Spectre/System/MessageHandler.h b/include/Spectre/System/MessageHandler.h index 759ae3e..9b593f3 100644 --- a/include/Spectre/System/MessageHandler.h +++ b/include/Spectre/System/MessageHandler.h @@ -2,7 +2,7 @@ #ifndef SPECTRE_SYSTEM_MESSAGEHANDLER_H #define SPECTRE_SYSTEM_MESSAGEHANDLER_H -#include "SystemEvent.h" +#include namespace sp { diff --git a/include/Spectre/System/MessageQueue.h b/include/Spectre/System/MessageQueue.h index de89c04..c105889 100644 --- a/include/Spectre/System/MessageQueue.h +++ b/include/Spectre/System/MessageQueue.h @@ -2,7 +2,7 @@ #ifndef SPECTRE_MESSAGE_QUEUE_H #define SPECTRE_MESSAGE_QUEUE_H -#include +#include #include namespace sp { @@ -15,14 +15,14 @@ public : MessageQueue(); ~MessageQueue(); - void postEvent(SysEvent event); + void postEvent(Event event); - bool pollEvent(SysEvent& event); + bool pollEvent(Event& event); bool isEmpty() const; protected : - std::deque m_queue; + std::deque m_queue; PlatformEventQueue* m_impl; }; diff --git a/include/Spectre/System/SystemEvent.h b/include/Spectre/System/SystemEvent.h deleted file mode 100644 index e802634..0000000 --- a/include/Spectre/System/SystemEvent.h +++ /dev/null @@ -1,41 +0,0 @@ - -#ifndef SYSTEM_EVENT_H -#define SYSTEM_EVENT_H - -namespace sp { - -class Display; - -struct SysEvent -{ -public : - - enum Type { - None, - Quit, - Size, - }; - - Type type; - - struct Size - { - Display *display; - int width; - int height; - }; - - union { - struct Size size; - }; - - SysEvent(Type type = None); - - // Helper methods - - static SysEvent sizeEvent(Display *display, int width, int height); -}; - -} // namespace sp - -#endif /* SYSTEM_EVENT_H */ diff --git a/source/Game.cpp b/source/Game.cpp index 4178c46..1d408ee 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -56,6 +56,9 @@ void Game::gameLoop() processEvents(); + // Update input. + getInput()->update(); + if (time.beginFrame()) { while(time.tick()) { @@ -71,18 +74,18 @@ void Game::gameLoop() void Game::processEvents() { MessageQueue& queue = m_platform->getMessageQueue(); - SysEvent event; + Event event; while(queue.pollEvent(event)) { - if (event.type == SysEvent::Quit) { + if (event.type == Event::Quit) { exit(); break; } // Call message handler. - if (event.type == SysEvent::Size) { + if (event.type == Event::Size) { m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height); } } diff --git a/source/Platform/PlatformEventQueue.h b/source/Platform/PlatformEventQueue.h index 8a443e6..706a816 100644 --- a/source/Platform/PlatformEventQueue.h +++ b/source/Platform/PlatformEventQueue.h @@ -3,7 +3,7 @@ namespace sp { -struct SysEvent; +struct Event; // Interface for platform specific event queue. class PlatformEventQueue @@ -13,7 +13,7 @@ public : // Poll one event from the platform's event queue. // Returns false if there was no events. // NOTE: This method is guaranteed to be non-blocking. - virtual bool poll(SysEvent& event) = 0; + virtual bool poll(Event& event) = 0; }; } // namespace sp diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index 12af985..c2b6b74 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -6,7 +6,7 @@ namespace sp { -bool Win32EventQueue::poll(SysEvent& event) +bool Win32EventQueue::poll(Event& event) { MSG msg; @@ -19,11 +19,11 @@ bool Win32EventQueue::poll(SysEvent& event) return false; } -LRESULT Win32EventQueue::processMessage(MSG msg, SysEvent& event) +LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) { switch(msg.message) { case WM_QUIT : - event.type = SysEvent::Quit; + event.type = Event::Quit; return 0; // Input, Forward to devices. case WM_KEYDOWN : diff --git a/source/Platform/Win32/Win32EventQueue.h b/source/Platform/Win32/Win32EventQueue.h index 9b3578d..503f5fc 100644 --- a/source/Platform/Win32/Win32EventQueue.h +++ b/source/Platform/Win32/Win32EventQueue.h @@ -2,7 +2,7 @@ #define PLATFORM_WIN32_EVENT_QUEUE_H #include -#include +#include #include namespace sp { @@ -10,11 +10,11 @@ namespace sp { class Win32EventQueue : public PlatformEventQueue { public : - virtual bool poll(SysEvent& event); + virtual bool poll(Event& event); private : - LRESULT processMessage(MSG msg, SysEvent& event); + LRESULT processMessage(MSG msg, Event& event); }; } // namespace sp diff --git a/source/System/Event.cpp b/source/System/Event.cpp new file mode 100644 index 0000000..43dee46 --- /dev/null +++ b/source/System/Event.cpp @@ -0,0 +1,56 @@ + +#include + +namespace sp { + +Event::Event(Type type) : +type (type) +{ +} + +std::string Event::KeyEvent::getKeyName() const +{ + return Keyboard::getKeyName(code); +} + +std::string Event::MouseButtonEvent::getName() const +{ + return Mouse::getButtonName(button); +} + +// Helper methods + +Event Event::createSize(Display *display, int width, int height) +{ + Event event(Size); + event.size.display = display; + event.size.width = width; + event.size.height = height; + return event; +} + +Event Event::createKey(Keyboard::Key code, bool pressed) +{ + Event event(Key); + event.key.code = code; + event.key.pressed = pressed; + return event; +} + +Event Event::createMouseButton(Mouse::Button button, bool pressed) +{ + Event event(MouseButton); + event.mouseButton.button = button; + event.mouseButton.pressed = pressed; + return event; +} + +Event Event::createMouseMove(unsigned int x, unsigned int y) +{ + Event event(MouseMove); + event.mouseMove.x = x; + event.mouseMove.y = y; + return event; +} + +} // namespace sp diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index b8d76c4..8ff7a3b 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -21,12 +21,12 @@ MessageQueue::~MessageQueue() delete m_impl; } -void MessageQueue::postEvent(SysEvent event) +void MessageQueue::postEvent(Event event) { m_queue.push_back(event); } -bool MessageQueue::pollEvent(SysEvent& event) +bool MessageQueue::pollEvent(Event& event) { // Process platform events first. if (m_impl->poll(event)) { diff --git a/source/System/SystemEvent.cpp b/source/System/SystemEvent.cpp deleted file mode 100644 index 2d625be..0000000 --- a/source/System/SystemEvent.cpp +++ /dev/null @@ -1,20 +0,0 @@ - -#include - -namespace sp { - -SysEvent::SysEvent(Type type) : -type (type) -{ -} - -SysEvent SysEvent::sizeEvent(Display *display, int width, int height) -{ - SysEvent event(Size); - event.size.display = display; - event.size.width = width; - event.size.height = height; - return event; -} - -} // namespace sp