Flight mode
This commit is contained in:
+32
-3
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user