Skip to content
Snippets Groups Projects
Commit dfd44c84 authored by Tomas Vybiral's avatar Tomas Vybiral
Browse files

events redesign and document

parent 4ab9b21f
No related branches found
No related tags found
No related merge requests found
......@@ -97,22 +97,22 @@ void game::process_events() {
 
void game::process_event(const event& e) {
do_event<quit_game>(e, [&](auto&) { is_running = false; });
do_event<change_player_angle>(e, [&](const auto& cpa){
player_angle_delta += cpa.delta;
player_angle_delta = min(change_player_angle::DEFAULT,
max(-change_player_angle::DEFAULT,
do_event<change<player_angle>>(e, [&](const auto& cpa){
player_angle_delta += cpa.data.value;
player_angle_delta = min(player_angle::DEFAULT,
max(-player_angle::DEFAULT,
player_angle_delta));
});
do_event<change_player_force>(e, [&](const auto& cpf){
player_force_delta += cpf.delta;
player_force_delta = min(change_player_force::DEFAULT,
max(-change_player_force::DEFAULT,
do_event<change<player_force>>(e, [&](const auto& cpf){
player_force_delta += cpf.data.value;
player_force_delta = min(player_force::DEFAULT,
max(-player_force::DEFAULT,
player_force_delta));
});
do_event<change_move_vector>(e, [&](const auto& cmv) {
player_position_delta += cmv.delta; // FIXME: Use ranged value here;
player_position_delta = min(change_move_vector::DEFAULT,
max(-change_move_vector::DEFAULT,
do_event<change<move_vector>>(e, [&](const auto& cmv) {
player_position_delta += cmv.data.value; // FIXME: Use ranged value here;
player_position_delta = min(move_vector::DEFAULT,
max(-move_vector::DEFAULT,
player_position_delta));
});
do_event<push_state>(e, [&](auto&) {
......@@ -124,10 +124,10 @@ void game::process_event(const event& e) {
current_state = std::move(state::pop());
});
do_event<shoot_event>(e, [&](auto&) {shoot = true;});
do_event<switch_controller>(e, [&](const auto& sc) {
do_event<change<shooting_controller>>(e, [&](const auto& sc) {
if (shoot_control->can_switch()) {
delete shoot_control;
switch(sc.mode) {
switch(sc.data.mode) {
case shooting_mode::SINGLE:
shoot_control = new single_shot();
break;
......
......@@ -4,45 +4,64 @@
#include <variant>
#include <cstdint>
 
/// Event that represents data change
template<typename T>
struct change {
T data;
};
 
struct change_move_vector {
/// Move vector data that are applied during changing/setting values
struct move_vector {
constexpr static int32_t DEFAULT = 5;
int32_t delta;
int32_t value;
};
 
struct change_player_angle {
/// Player angle data that are applied during changing/setting values
struct player_angle {
constexpr static double DEFAULT = 0.05;
double delta;
double value;
};
 
struct change_player_force {
/// Player force data that are applied during changing/setting values
struct player_force {
constexpr static double DEFAULT = 0.1;
double delta;
double value;
};
 
struct push_state {};
struct pop_state {};
struct quit_game {};
struct shoot_event {};
/// All posible shooting modes
enum class shooting_mode {
SINGLE,
MULTIPLE
};
 
struct switch_controller {
/// Shooting controller data that are applied during changing/setting values
struct shooting_controller {
shooting_mode mode;
};
 
/// Event that pushes current state
struct push_state {};
/// Pops latest state and replaces it
struct pop_state {};
/// Quit game event - stops game loop
struct quit_game {};
/// Shoot event that represents user pushing shooting button
struct shoot_event {};
/// Changes debug status
struct switch_debug {};
 
typedef std::variant<switch_debug, switch_controller, change_player_force, change_move_vector, change_player_angle, push_state, pop_state, quit_game, shoot_event> event;
/// Generic all event data storage - saves memory, autotype deduction
typedef std::variant<change<player_force>,
change<move_vector>,
change<player_angle>,
change<shooting_controller>,
push_state, pop_state,
quit_game, shoot_event,
switch_debug> event;
 
#endif//EVENTS_HPP
\ No newline at end of file
......@@ -25,47 +25,47 @@ void sdl_input::process_key_event(const SDL_Event& e) {
switch (e.key.keysym.sym) {
case SDLK_w:
if (pressed)
events.emplace_back(change_move_vector{-change_move_vector::DEFAULT});
events.emplace_back(change<move_vector>{-move_vector::DEFAULT});
else
events.emplace_back(change_move_vector{change_move_vector::DEFAULT});
events.emplace_back(change<move_vector>{move_vector::DEFAULT});
break;
case SDLK_s:
if (pressed)
events.emplace_back(change_move_vector{change_move_vector::DEFAULT});
events.emplace_back(change<move_vector>{move_vector::DEFAULT});
else
events.emplace_back(change_move_vector{-change_move_vector::DEFAULT});
events.emplace_back(change<move_vector>{-move_vector::DEFAULT});
break;
case SDLK_a:
if (pressed)
events.emplace_back(change_player_angle{change_player_angle::DEFAULT});
events.emplace_back(change<player_angle>{player_angle::DEFAULT});
else
events.emplace_back(change_player_angle{-change_player_angle::DEFAULT});
events.emplace_back(change<player_angle>{-player_angle::DEFAULT});
break;
case SDLK_d:
if (pressed)
events.emplace_back(change_player_angle{-change_player_angle::DEFAULT});
events.emplace_back(change<player_angle>{-player_angle::DEFAULT});
else
events.emplace_back(change_player_angle{change_player_angle::DEFAULT});
events.emplace_back(change<player_angle>{player_angle::DEFAULT});
break;
case SDLK_e:
if (pressed)
events.emplace_back(change_player_force{change_player_force::DEFAULT});
events.emplace_back(change<player_force>{player_force::DEFAULT});
else
events.emplace_back(change_player_force{-change_player_force::DEFAULT});
events.emplace_back(change<player_force>{-player_force::DEFAULT});
break;
case SDLK_q:
if (pressed)
events.emplace_back(change_player_force{-change_player_force::DEFAULT});
events.emplace_back(change<player_force>{-player_force::DEFAULT});
else
events.emplace_back(change_player_force{change_player_force::DEFAULT});
events.emplace_back(change<player_force>{player_force::DEFAULT});
break;
case SDLK_1:
if (pressed)
events.emplace_back(switch_controller{shooting_mode::SINGLE});
events.emplace_back(change<shooting_controller>{shooting_mode::SINGLE});
break;
case SDLK_2:
if (pressed)
events.emplace_back(switch_controller{shooting_mode::MULTIPLE});
events.emplace_back(change<shooting_controller>{shooting_mode::MULTIPLE});
break;
case SDLK_SPACE:
if (pressed)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment