better listener

main
Benjamin Kraft 2 years ago
parent 17acf0a45a
commit 845835caa0
  1. 13
      src/Listener.cpp
  2. 27
      src/Listener.h
  3. 16
      src/Player.cpp
  4. 10
      src/Player.h
  5. 3
      src/Queue.h
  6. 5
      src/main.cpp

@ -0,0 +1,13 @@
#include "Listener.h"
void GameListener::accept(GameEvent *event) {
if (auto coinEvent = dynamic_cast<CoinCollectEvent *>(event))
OnCoinCollect(coinEvent);
if (auto dmgEvent = dynamic_cast<DamageEvent *>(event))
OnDamage(dmgEvent);
}
void InputListener::accept(InputEvent *event) {
OnMouseClicked();
}

@ -1,17 +1,24 @@
#pragma once
#include "Event.h"
template <typename EventType>
class Listener {
protected:
template <typename T>
bool isType(EventType * event) {
return cast<T>(event);
}
template <typename T>
T * cast(EventType * event) {
return dynamic_cast<T *>(event);
}
public:
virtual bool wantsEvent(EventType *) { return true; }
virtual void accept(EventType *) {}
};
class InputListener : public Listener<InputEvent> {
public:
void accept(InputEvent * event) override;
protected:
virtual void OnMouseClicked() {};
};
class GameListener : public Listener<GameEvent> {
public:
void accept(GameEvent * event) override;
protected:
virtual void OnCoinCollect(CoinCollectEvent * event) {};
virtual void OnDamage(DamageEvent * event) {};
};

@ -1,18 +1,6 @@
#include "Player.h"
#include <iostream>
bool Player::wantsEvent(GameEvent * event) {
return isType<CoinCollectEvent>(event) || isType<DamageEvent>(event);
}
void Player::accept(GameEvent *event) {
if (auto coinEvent = cast<CoinCollectEvent>(event))
OnCoinCollect(coinEvent);
if (auto dmgEvent = cast<DamageEvent>(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";
}

@ -3,11 +3,9 @@
#include "Listener.h"
#include "Event.h"
class Player : public Listener<GameEvent> {
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;
};

@ -52,8 +52,7 @@ class EventQueue : protected Queue<EventType>{
EventType * event = this->pop();
for (auto listener : listeners)
if (listener->wantsEvent(event))
listener->accept(event);
listener->accept(event);
delete event;
}

@ -31,10 +31,13 @@ int main(int argc, char * argv[]){
*/
auto player = new Player;
inputQueue->registerListener(player);
inputQueue->submitEvent<InputEvent>(new InputEvent);
gameQueue->registerListener(player);
gameQueue->submitEvent<CoinCollectEvent>(new CoinCollectEvent);
gameQueue->submitEvent<DamageEvent>(new DamageEvent);
inputQueue->submitEvent<InputEvent>(new InputEvent);
QWidget window;
window.show();

Loading…
Cancel
Save