From 845835caa0062d913dce059de1444d20c9f3ad5d Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Sun, 15 Jan 2023 21:36:09 +0100 Subject: [PATCH] better listener --- src/Listener.cpp | 13 +++++++++++++ src/Listener.h | 27 +++++++++++++++++---------- src/Player.cpp | 16 ++++------------ src/Player.h | 10 ++++------ src/Queue.h | 3 +-- src/main.cpp | 5 ++++- 6 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 src/Listener.cpp diff --git a/src/Listener.cpp b/src/Listener.cpp new file mode 100644 index 0000000..8ea4288 --- /dev/null +++ b/src/Listener.cpp @@ -0,0 +1,13 @@ +#include "Listener.h" + +void GameListener::accept(GameEvent *event) { + if (auto coinEvent = dynamic_cast(event)) + OnCoinCollect(coinEvent); + + if (auto dmgEvent = dynamic_cast(event)) + OnDamage(dmgEvent); +} + +void InputListener::accept(InputEvent *event) { + OnMouseClicked(); +} diff --git a/src/Listener.h b/src/Listener.h index 0765a61..86b88a5 100644 --- a/src/Listener.h +++ b/src/Listener.h @@ -1,17 +1,24 @@ #pragma once +#include "Event.h" + template class Listener { -protected: - template - bool isType(EventType * event) { - return cast(event); - } - template - T * cast(EventType * event) { - return dynamic_cast(event); - } public: - virtual bool wantsEvent(EventType *) { return true; } virtual void accept(EventType *) {} +}; + +class InputListener : public Listener { +public: + void accept(InputEvent * event) override; +protected: + virtual void OnMouseClicked() {}; +}; + +class GameListener : public Listener { +public: + void accept(GameEvent * event) override; +protected: + virtual void OnCoinCollect(CoinCollectEvent * event) {}; + virtual void OnDamage(DamageEvent * event) {}; }; \ No newline at end of file diff --git a/src/Player.cpp b/src/Player.cpp index df0de27..e140eae 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -1,18 +1,6 @@ #include "Player.h" #include -bool Player::wantsEvent(GameEvent * event) { - return isType(event) || isType(event); -} - -void Player::accept(GameEvent *event) { - if (auto coinEvent = cast(event)) - OnCoinCollect(coinEvent); - - if (auto dmgEvent = cast(event)) - OnDamage(dmgEvent); -} - void Player::OnCoinCollect(CoinCollectEvent *event) { std::cout << event->value << std::endl; } @@ -20,3 +8,7 @@ void Player::OnCoinCollect(CoinCollectEvent *event) { void Player::OnDamage(DamageEvent *event) { std::cout << event->amount << std::endl; } + +void Player::OnMouseClicked() { + std::cout << "Mouse clicked\n"; +} diff --git a/src/Player.h b/src/Player.h index 484f416..36bf97e 100644 --- a/src/Player.h +++ b/src/Player.h @@ -3,11 +3,9 @@ #include "Listener.h" #include "Event.h" -class Player : public Listener { -public: - bool wantsEvent(GameEvent * event) override; - void accept(GameEvent * event) override; +class Player : public GameListener, public InputListener { protected: - void OnCoinCollect(CoinCollectEvent * event); - void OnDamage(DamageEvent * event); + void OnCoinCollect(CoinCollectEvent * event) override; + void OnDamage(DamageEvent * event) override; + void OnMouseClicked() override; }; \ No newline at end of file diff --git a/src/Queue.h b/src/Queue.h index 332bca1..c4af517 100644 --- a/src/Queue.h +++ b/src/Queue.h @@ -52,8 +52,7 @@ class EventQueue : protected Queue{ EventType * event = this->pop(); for (auto listener : listeners) - if (listener->wantsEvent(event)) - listener->accept(event); + listener->accept(event); delete event; } diff --git a/src/main.cpp b/src/main.cpp index 3da9f10..4efc0fb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,10 +31,13 @@ int main(int argc, char * argv[]){ */ auto player = new Player; + + inputQueue->registerListener(player); + inputQueue->submitEvent(new InputEvent); + gameQueue->registerListener(player); gameQueue->submitEvent(new CoinCollectEvent); gameQueue->submitEvent(new DamageEvent); - inputQueue->submitEvent(new InputEvent); QWidget window; window.show();