Exploring raycasters and possibly make a little "doom like" game based on it.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
raycaster/gui/event_router.cpp

116 lines
2.9 KiB

#define FSM_DEBUG 1
#include "event_router.hpp"
#include "dbc.hpp"
#include "events.hpp"
namespace gui {
namespace routing {
using enum Event;
using enum State;
gui::Event Router::process_event(std::optional<sf::Event> ev) {
$next_event = gui::Event::TICK;
if(ev->is<sf::Event::Closed>()) {
return gui::Event::QUIT;
}
if(const auto* mouse = ev->getIf<sf::Event::MouseButtonPressed>()) {
if(mouse->button == sf::Mouse::Button::Left) {
position = mouse->position;
event(MOUSE_DOWN);
}
} else if(const auto* mouse = ev->getIf<sf::Event::MouseButtonReleased>()) {
if(mouse->button == sf::Mouse::Button::Left) {
position = mouse->position;
event(MOUSE_UP);
}
} else if(const auto* mouse = ev->getIf<sf::Event::MouseMoved>()) {
position = mouse->position;
event(MOUSE_MOVE);
}
if(const auto* key = ev->getIf<sf::Event::KeyPressed>()) {
scancode = key->scancode;
event(KEY_PRESS);
}
return $next_event;
}
void Router::event(Event ev) {
switch($state) {
FSM_STATE(State, START, ev);
FSM_STATE(State, IDLE, ev);
FSM_STATE(State, MOUSE_ACTIVE, ev);
FSM_STATE(State, MOUSE_MOVING, ev);
}
}
void Router::START(Event ) {
state(State::IDLE);
}
void Router::IDLE(Event ev) {
switch(ev) {
case MOUSE_DOWN:
set_event(gui::Event::TICK);
state(State::MOUSE_ACTIVE);
break;
case MOUSE_UP:
dbc::log("mouse up in IDLE");
break;
case MOUSE_MOVE:
dbc::log("mouse move, send moved event");
break;
case KEY_PRESS:
dbc::log("key pressed");
break;
default:
dbc::sentinel("invalid event");
}
}
void Router::MOUSE_ACTIVE(Event ev) {
switch(ev) {
case MOUSE_DOWN:
dbc::log("mouse down in MOUSE_ACTIVE");
break;
case MOUSE_UP:
dbc::log("mouse up, send click event");
state(State::IDLE);
break;
case MOUSE_MOVE:
state(State::MOUSE_MOVING);
break;
case KEY_PRESS:
dbc::log("send the key but cancel");
state(State::IDLE);
break;
default:
dbc::sentinel("invalid event");
}
}
void Router::MOUSE_MOVING(Event ev) {
switch(ev) {
case MOUSE_DOWN:
dbc::log("mouse down in MOUSE_MOVING state");
break;
case MOUSE_UP:
dbc::log("mouse up, send drop event");
state(State::IDLE);
break;
case MOUSE_MOVE:
dbc::log("mouse move, send drag event");
break;
case KEY_PRESS:
dbc::log("send the key but cancel");
state(State::IDLE);
break;
default:
dbc::sentinel("invalid event");
}
}
}
}