More work on the event system, sf::Events are completely wrapped now.
This commit is contained in:
@@ -2,9 +2,9 @@
|
||||
#include <SFML/System/Vector3.hpp>
|
||||
#include <SFML/System/Vector2.hpp>
|
||||
#include "util.hpp"
|
||||
#include "Pub_Sub.hpp"
|
||||
#include "Pub_Sub.h"
|
||||
|
||||
class Camera : public SfEventSubscriber{
|
||||
class Camera : public VrEventSubscriber{
|
||||
public:
|
||||
|
||||
enum DIRECTION { FORWARD, REARWARD, LEFT, RIGHT, UP, DOWN };
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
sf::Vector2f get_direction();
|
||||
|
||||
|
||||
virtual void update(SfEventPublisher* p, sf::Event e) override;
|
||||
void update(VrEventPublisher* p, vr::Event e) override;
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <SFML/Window/Mouse.hpp>
|
||||
#include <SFML/Window/Joystick.hpp>
|
||||
#include <SFML/Window/Sensor.hpp>
|
||||
#include <GL/glew.h>
|
||||
|
||||
|
||||
|
||||
namespace vr {
|
||||
@@ -125,7 +125,7 @@ namespace vr {
|
||||
|
||||
class MouseWheelScrolled : public Event {
|
||||
public:
|
||||
MouseWheelScrolled(sf::Mouse::Wheel wheel, bool delta, bool x, bool y) :
|
||||
MouseWheelScrolled(sf::Mouse::Wheel wheel, float delta, int x, int y) :
|
||||
wheel(wheel), delta(delta), x(x), y(y), Event(vr::Event::EventType::MouseWheelScrolled) {};
|
||||
|
||||
sf::Mouse::Wheel wheel;
|
||||
@@ -136,7 +136,7 @@ namespace vr {
|
||||
|
||||
class MouseButtonPressed : public Event {
|
||||
public:
|
||||
MouseButtonPressed(sf::Mouse::Button button, bool x, bool y) :
|
||||
MouseButtonPressed(sf::Mouse::Button button, int x, int y) :
|
||||
button(button), x(x), y(y), Event(vr::Event::EventType::MouseButtonPressed) {};
|
||||
|
||||
sf::Mouse::Button button;
|
||||
@@ -146,7 +146,7 @@ namespace vr {
|
||||
|
||||
class MouseButtonReleased : public Event {
|
||||
public:
|
||||
MouseButtonReleased(sf::Mouse::Button button, bool x, bool y) :
|
||||
MouseButtonReleased(sf::Mouse::Button button, int x, int y) :
|
||||
button(button), x(x), y(y), Event(vr::Event::EventType::MouseButtonReleased) {};
|
||||
|
||||
sf::Mouse::Button button;
|
||||
@@ -156,7 +156,7 @@ namespace vr {
|
||||
|
||||
class MouseMoved : public Event {
|
||||
public:
|
||||
MouseMoved(bool x, bool y) :
|
||||
MouseMoved(int x, int y) :
|
||||
x(x), y(y), Event(vr::Event::EventType::MouseMoved) {};
|
||||
|
||||
int x;
|
||||
@@ -165,7 +165,7 @@ namespace vr {
|
||||
|
||||
class MouseEntered : public Event {
|
||||
public:
|
||||
MouseEntered(bool x, bool y) :
|
||||
MouseEntered(int x, int y) :
|
||||
x(x), y(y), Event(vr::Event::EventType::MouseEntered) {};
|
||||
|
||||
int x;
|
||||
@@ -174,7 +174,7 @@ namespace vr {
|
||||
|
||||
class MouseLeft : public Event {
|
||||
public:
|
||||
MouseLeft(bool x, bool y) :
|
||||
MouseLeft(int x, int y) :
|
||||
x(x), y(y), Event(vr::Event::EventType::MouseLeft) {};
|
||||
|
||||
int x;
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#pragma once
|
||||
#include <SFML/Graphics.hpp>
|
||||
#include <list>
|
||||
#include "Pub_Sub.hpp"
|
||||
#include "Event.hpp"
|
||||
#include <memory>
|
||||
#include "Pub_Sub.h"
|
||||
|
||||
|
||||
class Input : public SfEventPublisher {
|
||||
class Input : public VrEventPublisher {
|
||||
public:
|
||||
|
||||
Input();
|
||||
@@ -34,6 +35,6 @@ private:
|
||||
|
||||
private:
|
||||
|
||||
std::list<vr::Event> event_queue;
|
||||
std::list<std::unique_ptr<vr::Event>> event_queue;
|
||||
|
||||
};
|
||||
|
||||
32
include/Pub_Sub.h
Normal file
32
include/Pub_Sub.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
#include <SFML/Graphics.hpp>
|
||||
#include <iostream>
|
||||
#include "Event.hpp"
|
||||
|
||||
|
||||
class VrEventPublisher;
|
||||
|
||||
class VrEventSubscriber {
|
||||
public:
|
||||
virtual ~VrEventSubscriber() {};
|
||||
virtual void update(VrEventPublisher* p, vr::Event e) = 0;
|
||||
void subscribe(VrEventPublisher* publisher, vr::Event::EventType type);
|
||||
void subscribe(VrEventPublisher* publisher, std::vector<vr::Event::EventType> type);
|
||||
protected:
|
||||
std::vector<vr::Event::EventType> subscribed_event_types;
|
||||
};
|
||||
|
||||
|
||||
class VrEventPublisher {
|
||||
public:
|
||||
|
||||
virtual ~VrEventPublisher() {};
|
||||
virtual void subscribe(VrEventSubscriber *subscriber, vr::Event::EventType type);
|
||||
virtual void subscribe(VrEventSubscriber *subscriber, std::vector<vr::Event::EventType> type);
|
||||
virtual void unsubscribe(VrEventSubscriber *s, vr::Event::EventType c);
|
||||
virtual void notify(vr::Event e);
|
||||
private:
|
||||
std::map<vr::Event::EventType, std::vector<VrEventSubscriber*>> subscribers;
|
||||
|
||||
};
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
#pragma once
|
||||
#include <SFML/Graphics.hpp>
|
||||
|
||||
|
||||
class SfEventPublisher;
|
||||
|
||||
class SfEventSubscriber {
|
||||
public:
|
||||
virtual ~SfEventSubscriber() {};
|
||||
virtual void update(SfEventPublisher* p, sf::Event e) = 0;
|
||||
};
|
||||
|
||||
class SfEventPublisher {
|
||||
public:
|
||||
|
||||
// Allows the subscription to classes of events
|
||||
enum Event_Class {
|
||||
JoystickButtonEvent,
|
||||
JoystickConnectEvent,
|
||||
JoystickMoveEvent,
|
||||
KeyEvent,
|
||||
MouseButtonEvent,
|
||||
MouseMoveEvent,
|
||||
MouseWheelEvent,
|
||||
MouseWheelScrollEvent,
|
||||
SensorEvent,
|
||||
SizeEvent,
|
||||
TextEvent,
|
||||
TouchEvent,
|
||||
WindowEvent
|
||||
};
|
||||
|
||||
virtual ~SfEventPublisher() {};
|
||||
virtual void subscribe(SfEventSubscriber *s, Event_Class c) {
|
||||
subscribers[c].push_back(s);
|
||||
};
|
||||
virtual void unsubscribe(SfEventSubscriber *s, Event_Class c) {
|
||||
std::remove(subscribers[c].begin(), subscribers[c].end(), s);
|
||||
};
|
||||
virtual void notify(sf::Event e) {
|
||||
|
||||
// I don't quite like that some event classes contained multiple types of events:
|
||||
// KeyPressed, and KeyReleased under KeyEvent for example.
|
||||
// While others are not represented by classes:
|
||||
// Closed, LostFocus, and GainedFocus have no representing class.
|
||||
// So, we'll add another "class", WindowEvent which contains those previously mentioned,
|
||||
// and use those new identifiers to group our events
|
||||
|
||||
// This will also make it a bit easier when subscribing to certain events
|
||||
|
||||
Event_Class event_class;
|
||||
|
||||
if (e.type == sf::Event::Closed ||
|
||||
e.type == sf::Event::LostFocus ||
|
||||
e.type == sf::Event::GainedFocus ){
|
||||
|
||||
event_class = Event_Class::WindowEvent;
|
||||
}
|
||||
|
||||
// Preserve a little of sfml's default behavior and separate resized event
|
||||
else if (e.type == sf::Event::Resized) {
|
||||
event_class = Event_Class::SizeEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::TextEntered) {
|
||||
event_class = Event_Class::TextEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::KeyPressed ||
|
||||
e.type == sf::Event::KeyReleased ){
|
||||
|
||||
event_class = Event_Class::KeyEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::MouseWheelMoved ||
|
||||
e.type == sf::Event::MouseWheelScrolled ){
|
||||
|
||||
event_class = Event_Class::MouseWheelScrollEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::MouseButtonPressed ||
|
||||
e.type == sf::Event::MouseButtonReleased ){
|
||||
|
||||
event_class = Event_Class::MouseButtonEvent;
|
||||
}
|
||||
|
||||
// Is this a good idea, mixing events that contain data, and don't contain data?
|
||||
else if (e.type == sf::Event::MouseMoved ||
|
||||
e.type == sf::Event::MouseEntered ||
|
||||
e.type == sf::Event::MouseLeft ){
|
||||
|
||||
event_class = Event_Class::MouseMoveEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::JoystickButtonPressed ||
|
||||
e.type == sf::Event::JoystickButtonReleased ){
|
||||
|
||||
event_class = Event_Class::JoystickButtonEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::JoystickMoved) {
|
||||
event_class = Event_Class::JoystickMoveEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::JoystickConnected ||
|
||||
e.type == sf::Event::JoystickDisconnected ){
|
||||
|
||||
event_class = Event_Class::JoystickConnectEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::TouchBegan ||
|
||||
e.type == sf::Event::TouchEnded ||
|
||||
e.type == sf::Event::TouchMoved ){
|
||||
|
||||
event_class = Event_Class::TouchEvent;
|
||||
}
|
||||
|
||||
else if (e.type == sf::Event::SensorChanged) {
|
||||
event_class = Event_Class::SensorEvent;
|
||||
}
|
||||
|
||||
else {
|
||||
std::cout << "Unable to classify sf::Event into Event_Class";
|
||||
abort();
|
||||
}
|
||||
|
||||
// get the bucket containing subscribers to that Event_Class
|
||||
std::vector<SfEventSubscriber*> *event_type_bucket = &subscribers[event_class];
|
||||
|
||||
// Send them the event
|
||||
for (auto s : *event_type_bucket) {
|
||||
s->update(this, e);
|
||||
}
|
||||
};
|
||||
private:
|
||||
std::map<Event_Class, std::vector<SfEventSubscriber*>> subscribers;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user