yupplemayham/YuppleMayham/include/utility/events.h
Ethan Adams 1f38730c96 Added normal parameter for easier knockback implemention script-side
Moved scripts to more descriptive location
2024-06-25 15:40:17 -04:00

74 lines
No EOL
2 KiB
C++

#ifndef _H_EVENTS_H
#define _H_EVENTS_H
#include <string>
#include <memory>
#include <functional>
#include <unordered_map>
#include "utility/direction.h"
class Bullet;
struct PhysicsComponent;
class Event {
public:
virtual ~Event() { };
virtual std::string getType() const = 0;
};
class BulletFiredEvent : public Event {
public:
BulletFiredEvent(const std::shared_ptr<Bullet>& bullet) : bullet(bullet) {};
std::string getType() const override { return "OnBulletFired"; }
std::shared_ptr<Bullet> bullet;
};
class BulletDiedEvent : public Event {
public:
BulletDiedEvent(const std::shared_ptr<PhysicsComponent>& physObj) : physObj(physObj) {};
std::string getType() const override { return "OnBulletDied"; }
std::shared_ptr<PhysicsComponent> physObj;
};
class BulletCollideEvent : public Event {
public:
BulletCollideEvent(const unsigned int ownerID, const unsigned int victimID, const std::shared_ptr<PhysicsComponent>& bullet, const glm::vec2& normal)
: ownerID(ownerID), victimID(victimID), bullet(bullet), normal(normal){}
std::string getType() const override { return "OnBulletCollide"; }
unsigned int ownerID;
unsigned int victimID;
std::shared_ptr<PhysicsComponent> bullet;
glm::vec2 normal;
};
class DirectionChangeEvent : public Event {
public:
DirectionChangeEvent(const int actorid, Direction direction) : actorid(actorid), direction(direction) {}
std::string getType() const override { return "OnDirectionChange"; }
Direction direction;
int actorid;
};
class EventManager {
public:
using EventCallback = std::function<void(std::shared_ptr<Event>)>;
void subscribe(std::string eventType, EventCallback callback) {
listeners[eventType].push_back(callback);
}
void notify(const std::shared_ptr<Event>& event) {
auto iterator = listeners.find(event->getType());
if (iterator != listeners.end())
{
for (auto& callback : iterator->second)
{
callback(event);
}
}
}
private:
std::unordered_map <std::string, std::vector <EventCallback>> listeners;
};
#endif //_H_EVENTS_H