Flight mode

This commit is contained in:
2025-06-07 13:52:28 +02:00
parent d37be08c82
commit 55ba42f19b
3 changed files with 56 additions and 3 deletions
+32 -3
View File
@@ -26,6 +26,32 @@ evt_pred_flag (SDL_Event *event, void *data)
return flags_get (flag);
}
bool
evt_cpred_and (SDL_Event *event, void *data)
{
CompositePredicate *cp = data;
return cp->a (event, cp->a_data) && cp->b (event, cp->b_data);
}
bool
evt_cpred_or (SDL_Event *event, void *data)
{
CompositePredicate *cp = data;
return cp->a (event, cp->a_data) || cp->b (event, cp->b_data);
}
CompositePredicate *
evt_pred_compose (bool (*a) (SDL_Event *sdl_event, void *userdata), void *a_data,
bool (*b) (SDL_Event *sdl_event, void *userdata), void *b_data)
{
CompositePredicate *out = g_new (CompositePredicate, 1);
out->a = a;
out->a_data = a_data;
out->b = b;
out->b_data = b_data;
return out;
}
bool
evt_cb_rotate_camera (SDL_Event *event, void *userdata)
{
@@ -68,8 +94,6 @@ void
evtman_init ()
{
#define KEY(k) GINT_TO_POINTER(k)
evtman_add_handler (2, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY(SDLK_F1), evt_cb_flag_switch, "wireframe_enabled");
/* The UI effectively eats most SDL events, as it needs it for it's
own calculations. */
evtman_add_handler (1, SDL_EVENT_KEY_DOWN, evt_pred_flag, "ui_has_focus", uiman_cb_key_down, NULL);
@@ -90,7 +114,12 @@ evtman_init ()
evtman_add_handler (0, SDL_EVENT_KEY_UP, evt_pred_key, KEY (SDLK_D), evt_cb_flag_off, "moving_right");
evtman_add_handler (0, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY (SDLK_TAB), uiman_cb_switch_focus, NULL);
evtman_add_handler (0, SDL_EVENT_MOUSE_MOTION, NULL, NULL, evt_cb_rotate_camera, NULL);
evtman_add_handler (0, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY (SDLK_SPACE), evt_cb_flag_on, "flying_up");
evtman_add_handler (0, SDL_EVENT_KEY_UP, evt_pred_key, KEY (SDLK_SPACE), evt_cb_flag_off, "flying_up");
evtman_add_handler (0, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY (SDLK_LSHIFT), evt_cb_flag_on, "flying_down");
evtman_add_handler (0, SDL_EVENT_KEY_UP, evt_pred_key, KEY (SDLK_LSHIFT), evt_cb_flag_off, "flying_down");
#undef KEY
}
+8
View File
@@ -9,6 +9,14 @@
#include "../flags.h"
#include "../ui/uiman.h"
typedef struct CompositePredicate
{
bool (*a) (SDL_Event *sdl_event, void *userdata);
void *a_data;
bool (*b) (SDL_Event *sdl_event, void *userdata);
void *b_data;
} CompositePredicate;
void evtman_init ();
void evtman_add_handler (int priority, unsigned int filter,
+16
View File
@@ -66,4 +66,20 @@ game_state_tick (int ticks)
glm_vec3_sub (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("flying_up") && flags_get ("flight_enabled"))
{
vec3 change, new_pos;
glm_vec3_scale (GLM_YUP, delta_time * 5, change);
glm_vec3_add (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("flying_down") && flags_get ("flight_enabled"))
{
vec3 change, new_pos;
glm_vec3_scale (GLM_YUP, delta_time * 5, change);
glm_vec3_sub (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
}