better events

main
Benjamin Kraft 2 years ago
parent 84a07e4b21
commit 7c59819ec5
  1. 41
      src/Event.h
  2. 29
      src/InputWindow.cpp
  3. 17
      src/InputWindow.h
  4. 15
      src/Listener.cpp
  5. 9
      src/Listener.h
  6. 16
      src/Player.cpp
  7. 5
      src/Player.h
  8. 4
      src/Window.cpp
  9. 14
      src/Window.h
  10. 20
      src/main.cpp

@ -4,7 +4,46 @@
#include <QEvent>
#include <QInputEvent>
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;

@ -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()));
}

@ -0,0 +1,17 @@
#pragma once
#include <QWidget>
#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;
};

@ -9,5 +9,18 @@ void GameListener::accept(GameEvent *event) {
}
void InputListener::accept(InputEvent *event) {
// TODO distinguish QEvent Type
if (auto mousePress = dynamic_cast<MousePressEvent *>(event))
mousePressed(mousePress);
if (auto mouseRelease = dynamic_cast<MouseReleaseEvent *>(event))
mouseReleased(mouseRelease);
if (auto mouseDoubleClick = dynamic_cast<MouseDoubleClickEvent *>(event))
mouseDoubleClicked(mouseDoubleClick);
if (auto mouseMove = dynamic_cast<MouseMoveEvent *>(event))
mouseMoved(mouseMove);
if (auto keyPress = dynamic_cast<KeyPressEvent *>(event))
keyPressed(keyPress);
if (auto keyRelease = dynamic_cast<KeyReleaseEvent *>(event))
keyReleased(keyRelease);
if (auto wheel = dynamic_cast<WheelEvent *>(event))
mouseWheel(wheel);
}

@ -1,5 +1,6 @@
#pragma once
#include <iostream>
#include "Event.h"
template <typename EventType>
@ -12,7 +13,13 @@ class InputListener : public Listener<InputEvent> {
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<GameEvent> {

@ -1,6 +1,18 @@
#include "Player.h"
#include <iostream>
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;
}

@ -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;
};

@ -1,5 +1,3 @@
#include "Window.h"
void Window::mousePressEvent(QMouseEvent *event) {
InputQueue->submitEvent(event);
}

@ -1,16 +1,14 @@
#pragma once
#include <QWidget>
#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;
};

@ -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<CoinCollectEvent>(new CoinCollectEvent);
Window::GameQueue->submitEvent<DamageEvent>(new DamageEvent);
w.gameQueue->registerListener(player);
w.gameQueue->submitEvent<CoinCollectEvent>(new CoinCollectEvent);
w.gameQueue->submitEvent<DamageEvent>(new DamageEvent);
return QApplication::exec();
}
Loading…
Cancel
Save