diff --git a/src/Event.h b/src/Event.h index 7ba9cc7..be3327e 100644 --- a/src/Event.h +++ b/src/Event.h @@ -4,7 +4,46 @@ #include #include -using InputEvent = QInputEvent; +struct InputEvent { + virtual void print() {} +}; + +struct MouseEvent : InputEvent { + MouseEvent(Qt::MouseButton b, QPoint pos) : button(b), pos(pos) {}; + Qt::MouseButton button; + QPoint pos; +}; + +struct MousePressEvent : MouseEvent { + MousePressEvent(Qt::MouseButton b, QPoint pos) : MouseEvent(b, pos) {}; +}; +struct MouseReleaseEvent : MouseEvent { + MouseReleaseEvent(Qt::MouseButton b, QPoint pos) : MouseEvent(b, pos) {}; +}; +struct MouseDoubleClickEvent : MouseEvent { + MouseDoubleClickEvent(Qt::MouseButton b, QPoint pos) : MouseEvent(b, pos) {}; +}; +struct MouseMoveEvent : MouseEvent { + MouseMoveEvent(Qt::MouseButton b, QPoint pos) : MouseEvent(b, pos) {}; +}; + +struct KeyEvent : InputEvent { + explicit KeyEvent(int key) : key(key) {} + int key; +}; + +struct KeyPressEvent : KeyEvent { + explicit KeyPressEvent(int key) : KeyEvent(key) {}; +}; +struct KeyReleaseEvent : KeyEvent { + explicit KeyReleaseEvent(int key) : KeyEvent(key) {}; +}; + +struct WheelEvent : InputEvent { + explicit WheelEvent(int delta) : delta(delta) {} + int delta; +}; + struct GameEvent { int time = 0; diff --git a/src/InputWindow.cpp b/src/InputWindow.cpp new file mode 100644 index 0000000..25ee65c --- /dev/null +++ b/src/InputWindow.cpp @@ -0,0 +1,29 @@ +#include "InputWindow.h" + +void InputWindow::mousePressEvent(QMouseEvent *event) { + inputQueue->submitEvent(new MousePressEvent(event->button(), event->pos())); +} + +void InputWindow::mouseReleaseEvent(QMouseEvent *event) { + inputQueue->submitEvent(new MouseReleaseEvent(event->button(), event->pos())); +} + +void InputWindow::mouseDoubleClickEvent(QMouseEvent *event) { + inputQueue->submitEvent(new MouseDoubleClickEvent(event->button(), event->pos())); +} + +void InputWindow::mouseMoveEvent(QMouseEvent *event) { + inputQueue->submitEvent(new MouseMoveEvent(event->button(), event->pos())); +} + +void InputWindow::wheelEvent(QWheelEvent *event) { + inputQueue->submitEvent(new WheelEvent(event->angleDelta().y())); +} + +void InputWindow::keyPressEvent(QKeyEvent *event) { + inputQueue->submitEvent(new KeyPressEvent(event->key())); +} + +void InputWindow::keyReleaseEvent(QKeyEvent *event) { + inputQueue->submitEvent(new KeyReleaseEvent(event->key())); +} \ No newline at end of file diff --git a/src/InputWindow.h b/src/InputWindow.h new file mode 100644 index 0000000..cee2f50 --- /dev/null +++ b/src/InputWindow.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include "Queue.h" + +class InputWindow : public QWidget { +public: + InputQueue * inputQueue; +protected: + void mousePressEvent(QMouseEvent * event) override; + void mouseReleaseEvent(QMouseEvent * event) override; + void mouseDoubleClickEvent(QMouseEvent * event) override; + void mouseMoveEvent(QMouseEvent * event) override; + void wheelEvent(QWheelEvent * event) override; + void keyPressEvent(QKeyEvent * event) override; + void keyReleaseEvent(QKeyEvent * event) override; +}; diff --git a/src/Listener.cpp b/src/Listener.cpp index 0daf606..b0e98d0 100644 --- a/src/Listener.cpp +++ b/src/Listener.cpp @@ -9,5 +9,18 @@ void GameListener::accept(GameEvent *event) { } void InputListener::accept(InputEvent *event) { - // TODO distinguish QEvent Type + if (auto mousePress = dynamic_cast(event)) + mousePressed(mousePress); + if (auto mouseRelease = dynamic_cast(event)) + mouseReleased(mouseRelease); + if (auto mouseDoubleClick = dynamic_cast(event)) + mouseDoubleClicked(mouseDoubleClick); + if (auto mouseMove = dynamic_cast(event)) + mouseMoved(mouseMove); + if (auto keyPress = dynamic_cast(event)) + keyPressed(keyPress); + if (auto keyRelease = dynamic_cast(event)) + keyReleased(keyRelease); + if (auto wheel = dynamic_cast(event)) + mouseWheel(wheel); } diff --git a/src/Listener.h b/src/Listener.h index 86b88a5..4d7fc5b 100644 --- a/src/Listener.h +++ b/src/Listener.h @@ -1,5 +1,6 @@ #pragma once +#include #include "Event.h" template @@ -12,7 +13,13 @@ class InputListener : public Listener { public: void accept(InputEvent * event) override; protected: - virtual void OnMouseClicked() {}; + virtual void mousePressed(MouseEvent *) {}; + virtual void mouseReleased(MouseEvent *) {}; + virtual void mouseDoubleClicked(MouseEvent *) {}; + virtual void mouseMoved(MouseEvent *) {}; + virtual void keyPressed(KeyEvent * e) {}; + virtual void keyReleased(KeyEvent * e) {}; + virtual void mouseWheel(WheelEvent * e) {}; }; class GameListener : public Listener { diff --git a/src/Player.cpp b/src/Player.cpp index 081178d..3daf971 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -1,6 +1,18 @@ #include "Player.h" #include -void Player::OnMouseClicked() { - std::cout << "Mouse clicked\n"; +void Player::mousePressed(MouseEvent *event) { + std::cout << event->pos.x() << " pressed\n"; +} + +void Player::mouseReleased(MouseEvent *event) { + std::cout << event->pos.x() << " released\n"; +} + +void Player::mouseDoubleClicked(MouseEvent * event) { + std::cout << event->pos.x() << " double clicked\n"; +} + +void Player::mouseWheel(WheelEvent * event) { + std::cout << event->delta << " wheel" << std::endl; } diff --git a/src/Player.h b/src/Player.h index 241e8b4..37e4bf5 100644 --- a/src/Player.h +++ b/src/Player.h @@ -6,5 +6,8 @@ class Player : public Entity, public GameListener, public InputListener { protected: - void OnMouseClicked() override; + void mousePressed(MouseEvent *) override; + void mouseReleased(MouseEvent *) override; + void mouseDoubleClicked(MouseEvent *) override; + void mouseWheel(WheelEvent *) override; }; \ No newline at end of file diff --git a/src/Window.cpp b/src/Window.cpp index 62114f9..b20e462 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -1,5 +1,3 @@ #include "Window.h" -void Window::mousePressEvent(QMouseEvent *event) { - InputQueue->submitEvent(event); -} + diff --git a/src/Window.h b/src/Window.h index 4ee1619..cb89f7d 100644 --- a/src/Window.h +++ b/src/Window.h @@ -1,16 +1,14 @@ #pragma once -#include #include "Queue.h" #include "Audio.h" #include "FileManager.h" +#include "InputWindow.h" -class Window : public QWidget { + +class Window : public InputWindow { public: - static InputQueue * InputQueue; - static GameQueue * GameQueue; - static Audio * AudioManager; - static FileManager * FileManager; -protected: - void mousePressEvent(QMouseEvent *event) override; + GameQueue * gameQueue; + Audio * AudioManager; + FileManager * fileManager; }; diff --git a/src/main.cpp b/src/main.cpp index 29685ef..410c0a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,21 +25,21 @@ int main(int argc, char * argv[]){ } */ - Window::InputQueue = new InputQueue; - Window::GameQueue = new GameQueue; - Window::AudioManager = new Audio; - Window::FileManager = new FileManager; + Window w; + w.show(); - Window window; - window.show(); + w.inputQueue = new InputQueue; + w.gameQueue = new GameQueue; + w.AudioManager = new Audio; + w.fileManager = new FileManager; auto player = new Player; - Window::InputQueue->registerListener(player); + w.inputQueue->registerListener(player); - Window::GameQueue->registerListener(player); - Window::GameQueue->submitEvent(new CoinCollectEvent); - Window::GameQueue->submitEvent(new DamageEvent); + w.gameQueue->registerListener(player); + w.gameQueue->submitEvent(new CoinCollectEvent); + w.gameQueue->submitEvent(new DamageEvent); return QApplication::exec(); } \ No newline at end of file