Fix incorrect player input processing
Changelog: - Store player dir input in LevelScene Data instead of pointer, to avoid use-after-free (non-fatal as mempool is used, but can cause unintended behaviour) - Only process player movement in system update. This is done in the movement update system - Normalise before apply acceleration, duhscene_man
parent
3a99dafcd4
commit
3e6a53b097
27
scene_impl.c
27
scene_impl.c
|
@ -17,6 +17,19 @@ static void level_scene_render_func(Scene_t* scene)
|
||||||
|
|
||||||
static void movement_update_system(Scene_t* scene)
|
static void movement_update_system(Scene_t* scene)
|
||||||
{
|
{
|
||||||
|
LevelSceneData_t *data = (LevelSceneData_t *)scene->scene_data;
|
||||||
|
float mag = Vector2Length(data->player_dir);
|
||||||
|
mag = (mag == 0)? 1 : mag;
|
||||||
|
Entity_t * p_player;
|
||||||
|
sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player)
|
||||||
|
{
|
||||||
|
CTransform_t* p_ctransform = get_component(&scene->ent_manager, p_player, CTRANSFORM_COMP_T);
|
||||||
|
p_ctransform->accel.x = data->player_dir.x * 200 * 1.0 / mag;
|
||||||
|
p_ctransform->accel.y = data->player_dir.y * 200 * 1.0 / mag;
|
||||||
|
}
|
||||||
|
data->player_dir.x = 0;
|
||||||
|
data->player_dir.y = 0;
|
||||||
|
|
||||||
float delta_time = GetFrameTime();
|
float delta_time = GetFrameTime();
|
||||||
CTransform_t * p_ctransform;
|
CTransform_t * p_ctransform;
|
||||||
sc_map_foreach_value(&scene->ent_manager.component_map[CTRANSFORM_COMP_T], p_ctransform)
|
sc_map_foreach_value(&scene->ent_manager.component_map[CTRANSFORM_COMP_T], p_ctransform)
|
||||||
|
@ -61,28 +74,24 @@ static void screen_bounce_system(Scene_t *scene)
|
||||||
void level_do_action(Scene_t *scene, ActionType_t action, bool pressed)
|
void level_do_action(Scene_t *scene, ActionType_t action, bool pressed)
|
||||||
{
|
{
|
||||||
LevelSceneData_t *data = (LevelSceneData_t *)scene->scene_data;
|
LevelSceneData_t *data = (LevelSceneData_t *)scene->scene_data;
|
||||||
CTransform_t *p_ctransform = get_component(&scene->ent_manager, data->player, CTRANSFORM_COMP_T);
|
|
||||||
Vector2 dir = {0, 0};
|
|
||||||
if (pressed)
|
if (pressed)
|
||||||
{
|
{
|
||||||
switch(action)
|
switch(action)
|
||||||
{
|
{
|
||||||
case ACTION_UP:
|
case ACTION_UP:
|
||||||
dir.y -= 1;
|
data->player_dir.y = -1;
|
||||||
break;
|
break;
|
||||||
case ACTION_DOWN:
|
case ACTION_DOWN:
|
||||||
dir.y += 1;
|
data->player_dir.y = 1;
|
||||||
break;
|
break;
|
||||||
case ACTION_LEFT:
|
case ACTION_LEFT:
|
||||||
dir.x -= 1;
|
data->player_dir.x = -1;
|
||||||
break;
|
break;
|
||||||
case ACTION_RIGHT:
|
case ACTION_RIGHT:
|
||||||
dir.x += 1;
|
data->player_dir.x = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p_ctransform->accel.x = dir.x * 500;
|
|
||||||
p_ctransform->accel.y = dir.y * 500;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +99,7 @@ void init_level_scene(LevelScene_t *scene)
|
||||||
{
|
{
|
||||||
init_scene(&scene->scene, LEVEL_SCENE, &level_scene_render_func, &level_do_action);
|
init_scene(&scene->scene, LEVEL_SCENE, &level_scene_render_func, &level_do_action);
|
||||||
scene->scene.scene_data = &scene->data;
|
scene->scene.scene_data = &scene->data;
|
||||||
scene->data.player = NULL;
|
memset(&scene->data.player_dir, 0, sizeof(Vector2));
|
||||||
|
|
||||||
// insert level scene systems
|
// insert level scene systems
|
||||||
sc_array_add(&scene->scene.systems, &movement_update_system);
|
sc_array_add(&scene->scene.systems, &movement_update_system);
|
||||||
|
|
|
@ -20,7 +20,7 @@ typedef struct TileGrid
|
||||||
|
|
||||||
typedef struct LevelSceneData
|
typedef struct LevelSceneData
|
||||||
{
|
{
|
||||||
Entity_t * player;
|
Vector2 player_dir;
|
||||||
TileGrid_t tilemap;
|
TileGrid_t tilemap;
|
||||||
}LevelSceneData_t;
|
}LevelSceneData_t;
|
||||||
|
|
||||||
|
|
|
@ -19,14 +19,14 @@ int main(void)
|
||||||
LevelScene_t scene;
|
LevelScene_t scene;
|
||||||
init_level_scene(&scene);
|
init_level_scene(&scene);
|
||||||
Entity_t *p_ent = add_entity(&scene.scene.ent_manager, PLAYER_ENT_TAG);
|
Entity_t *p_ent = add_entity(&scene.scene.ent_manager, PLAYER_ENT_TAG);
|
||||||
scene.data.player = p_ent;
|
|
||||||
|
|
||||||
CBBox_t *p_bbox = add_component(&scene.scene.ent_manager, p_ent, CBBOX_COMP_T);
|
CBBox_t *p_bbox = add_component(&scene.scene.ent_manager, p_ent, CBBOX_COMP_T);
|
||||||
p_bbox->size.x = 30;
|
p_bbox->size.x = 30;
|
||||||
p_bbox->size.y = 30;
|
p_bbox->size.y = 30;
|
||||||
add_component(&scene.scene.ent_manager, p_ent, CTRANSFORM_COMP_T);
|
add_component(&scene.scene.ent_manager, p_ent, CTRANSFORM_COMP_T);
|
||||||
update_entity_manager(&scene.scene.ent_manager);
|
update_entity_manager(&scene.scene.ent_manager);
|
||||||
for (size_t step = 0; step < 6000; step++)
|
//for (size_t step = 0; step < 6000; step++)
|
||||||
|
while(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
// This entire key processing relies on the assumption that a pressed key will
|
// This entire key processing relies on the assumption that a pressed key will
|
||||||
|
@ -68,7 +68,6 @@ int main(void)
|
||||||
next_keybuf = tmp;
|
next_keybuf = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Step %lu\n", step);
|
|
||||||
update_scene(&scene.scene);
|
update_scene(&scene.scene);
|
||||||
// This is needed to advance time delta
|
// This is needed to advance time delta
|
||||||
BeginDrawing();
|
BeginDrawing();
|
||||||
|
|
Loading…
Reference in New Issue