Move fields to player state component
Changelog: - Move level scene data related to player to playerstate component - Update system related to player state to use the playerstate componentscene_man
parent
25870309c0
commit
68bb9f941c
|
@ -59,7 +59,9 @@ typedef enum PlayerState
|
||||||
|
|
||||||
typedef struct _CPlayerState_t
|
typedef struct _CPlayerState_t
|
||||||
{
|
{
|
||||||
unsigned int is_crouch: 1;
|
Vector2 player_dir;
|
||||||
|
uint8_t jump_pressed: 1;
|
||||||
|
uint8_t is_crouch: 1;
|
||||||
}CPlayerState_t;
|
}CPlayerState_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
54
scene_impl.c
54
scene_impl.c
|
@ -248,34 +248,33 @@ static void player_movement_input_system(Scene_t* scene)
|
||||||
TileGrid_t tilemap = data->tilemap;
|
TileGrid_t tilemap = data->tilemap;
|
||||||
|
|
||||||
// Deal with player acceleration/velocity via inputs first
|
// Deal with player acceleration/velocity via inputs first
|
||||||
float mag = Vector2Length(data->player_dir);
|
CPlayerState_t* p_pstate;
|
||||||
mag = (mag == 0)? 1 : mag;
|
unsigned int ent_idx;
|
||||||
Entity_t * p_player;
|
sc_map_foreach(&scene->ent_manager.component_map[CPLAYERSTATE_T], ent_idx, p_pstate)
|
||||||
sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player)
|
|
||||||
{
|
{
|
||||||
|
float mag = Vector2Length(p_pstate->player_dir);
|
||||||
|
mag = (mag == 0)? 1 : mag;
|
||||||
|
Entity_t * p_player = get_entity(&scene->ent_manager, ent_idx);
|
||||||
CTransform_t* p_ctransform = get_component(&scene->ent_manager, p_player, CTRANSFORM_COMP_T);
|
CTransform_t* p_ctransform = get_component(&scene->ent_manager, p_player, CTRANSFORM_COMP_T);
|
||||||
//CBBox_t* p_bbox = get_component(&scene->ent_manager, p_player, CBBOX_COMP_T);
|
|
||||||
CJump_t* p_cjump = get_component(&scene->ent_manager, p_player, CJUMP_COMP_T);
|
CJump_t* p_cjump = get_component(&scene->ent_manager, p_player, CJUMP_COMP_T);
|
||||||
CPlayerState_t* p_pstate = get_component(&scene->ent_manager, p_player, CPLAYERSTATE_T);
|
|
||||||
p_pstate->is_crouch = data->crouch_pressed;
|
|
||||||
p_ctransform->accel.x = 0;
|
p_ctransform->accel.x = 0;
|
||||||
p_ctransform->accel.y = 0;
|
p_ctransform->accel.y = 0;
|
||||||
|
|
||||||
bool in_water = (p_ctransform->water_state & 1);
|
bool in_water = (p_ctransform->water_state & 1);
|
||||||
if (!in_water)
|
if (!in_water)
|
||||||
{
|
{
|
||||||
data->player_dir.y = 0;
|
p_pstate->player_dir.y = 0;
|
||||||
p_ctransform->accel = Vector2Scale(Vector2Normalize(data->player_dir), MOVE_ACCEL/1.2);
|
p_ctransform->accel = Vector2Scale(Vector2Normalize(p_pstate->player_dir), MOVE_ACCEL/1.2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p_ctransform->accel = Vector2Scale(Vector2Normalize(data->player_dir), MOVE_ACCEL);
|
p_ctransform->accel = Vector2Scale(Vector2Normalize(p_pstate->player_dir), MOVE_ACCEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Short Hop
|
// Short Hop
|
||||||
if (p_cjump->jumped && p_ctransform->velocity.y < 0)
|
if (p_cjump->jumped && p_ctransform->velocity.y < 0)
|
||||||
{
|
{
|
||||||
if (!data->jumped_pressed && !p_cjump->short_hop)
|
if (!p_pstate->jump_pressed && !p_cjump->short_hop)
|
||||||
{
|
{
|
||||||
p_cjump->short_hop = true;
|
p_cjump->short_hop = true;
|
||||||
p_ctransform->velocity.y /= 2;
|
p_ctransform->velocity.y /= 2;
|
||||||
|
@ -289,12 +288,12 @@ static void player_movement_input_system(Scene_t* scene)
|
||||||
// Jumps is possible as long as you have a jump
|
// Jumps is possible as long as you have a jump
|
||||||
|
|
||||||
// Check if possible to jump when jump is pressed
|
// Check if possible to jump when jump is pressed
|
||||||
if (data->jumped_pressed && p_cjump->jumps > 0 && p_cjump->cooldown_timer == 0)
|
if (p_pstate->jump_pressed && p_cjump->jumps > 0 && p_cjump->cooldown_timer == 0)
|
||||||
{
|
{
|
||||||
bool jump_valid = true;
|
bool jump_valid = true;
|
||||||
|
|
||||||
// Check Jump from crouch
|
// Check Jump from crouch
|
||||||
if(data->crouch_pressed)
|
if(p_pstate->is_crouch)
|
||||||
{
|
{
|
||||||
Vector2 test_pos = p_ctransform->position;
|
Vector2 test_pos = p_ctransform->position;
|
||||||
Vector2 test_bbox = {PLAYER_WIDTH, PLAYER_HEIGHT};
|
Vector2 test_bbox = {PLAYER_WIDTH, PLAYER_HEIGHT};
|
||||||
|
@ -342,10 +341,9 @@ static void player_movement_input_system(Scene_t* scene)
|
||||||
p_ctransform->accel.x += p_ctransform->velocity.x * -3.3;
|
p_ctransform->accel.x += p_ctransform->velocity.x * -3.3;
|
||||||
p_ctransform->accel.y += p_ctransform->velocity.y * -1;
|
p_ctransform->accel.y += p_ctransform->velocity.y * -1;
|
||||||
}
|
}
|
||||||
|
p_pstate->player_dir.x = 0;
|
||||||
|
p_pstate->player_dir.y = 0;
|
||||||
}
|
}
|
||||||
data->player_dir.x = 0;
|
|
||||||
data->player_dir.y = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void player_bbox_update_system(Scene_t *scene)
|
static void player_bbox_update_system(Scene_t *scene)
|
||||||
|
@ -358,7 +356,7 @@ static void player_bbox_update_system(Scene_t *scene)
|
||||||
{
|
{
|
||||||
CTransform_t* p_ctransform = get_component(&scene->ent_manager, p_player, CTRANSFORM_COMP_T);
|
CTransform_t* p_ctransform = get_component(&scene->ent_manager, p_player, CTRANSFORM_COMP_T);
|
||||||
CBBox_t* p_bbox = get_component(&scene->ent_manager, p_player, CBBOX_COMP_T);
|
CBBox_t* p_bbox = get_component(&scene->ent_manager, p_player, CBBOX_COMP_T);
|
||||||
//CPlayerState_t* p_pstate = get_component(&scene->ent_manager, p_player, CPLAYERSTATE_T);
|
CPlayerState_t* p_pstate = get_component(&scene->ent_manager, p_player, CPLAYERSTATE_T);
|
||||||
if (p_ctransform->ground_state & 1)
|
if (p_ctransform->ground_state & 1)
|
||||||
{
|
{
|
||||||
AnchorPoint_t anchor = AP_BOT_CENTER;
|
AnchorPoint_t anchor = AP_BOT_CENTER;
|
||||||
|
@ -382,7 +380,7 @@ static void player_bbox_update_system(Scene_t *scene)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Vector2 new_bbox;
|
Vector2 new_bbox;
|
||||||
if(data->crouch_pressed)
|
if(p_pstate->is_crouch)
|
||||||
{
|
{
|
||||||
new_bbox.x = PLAYER_C_WIDTH;
|
new_bbox.x = PLAYER_C_WIDTH;
|
||||||
new_bbox.y = PLAYER_C_HEIGHT;
|
new_bbox.y = PLAYER_C_HEIGHT;
|
||||||
|
@ -750,35 +748,35 @@ static void toggle_block_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;
|
CPlayerState_t *p_playerstate;
|
||||||
|
sc_map_foreach_value(&scene->ent_manager.component_map[CPLAYERSTATE_T], p_playerstate)
|
||||||
|
{
|
||||||
switch(action)
|
switch(action)
|
||||||
{
|
{
|
||||||
case ACTION_UP:
|
case ACTION_UP:
|
||||||
data->player_dir.y = (pressed)? -1 : 0;
|
p_playerstate->player_dir.y = (pressed)? -1 : 0;
|
||||||
break;
|
break;
|
||||||
case ACTION_DOWN:
|
case ACTION_DOWN:
|
||||||
data->player_dir.y = (pressed)? 1 : 0;
|
p_playerstate->player_dir.y = (pressed)? 1 : 0;
|
||||||
data->crouch_pressed = pressed;
|
p_playerstate->is_crouch = pressed;
|
||||||
break;
|
break;
|
||||||
case ACTION_LEFT:
|
case ACTION_LEFT:
|
||||||
data->player_dir.x = (pressed)? -1 : 0;
|
p_playerstate->player_dir.x = (pressed)? -1 : 0;
|
||||||
break;
|
break;
|
||||||
case ACTION_RIGHT:
|
case ACTION_RIGHT:
|
||||||
data->player_dir.x = (pressed)? 1 : 0;
|
p_playerstate->player_dir.x = (pressed)? 1 : 0;
|
||||||
break;
|
break;
|
||||||
case ACTION_JUMP:
|
case ACTION_JUMP:
|
||||||
data->jumped_pressed = pressed;
|
p_playerstate->jump_pressed = pressed;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void init_level_scene(LevelScene_t *scene)
|
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.jumped_pressed = false;
|
|
||||||
scene->data.crouch_pressed = false;
|
|
||||||
memset(&scene->data.player_dir, 0, sizeof(Vector2));
|
|
||||||
|
|
||||||
// insert level scene systems
|
// insert level scene systems
|
||||||
sc_array_add(&scene->scene.systems, &player_movement_input_system);
|
sc_array_add(&scene->scene.systems, &player_movement_input_system);
|
||||||
|
|
|
@ -22,10 +22,7 @@ typedef struct TileGrid
|
||||||
|
|
||||||
typedef struct LevelSceneData
|
typedef struct LevelSceneData
|
||||||
{
|
{
|
||||||
Vector2 player_dir;
|
|
||||||
TileGrid_t tilemap;
|
TileGrid_t tilemap;
|
||||||
bool jumped_pressed;
|
|
||||||
bool crouch_pressed;
|
|
||||||
}LevelSceneData_t;
|
}LevelSceneData_t;
|
||||||
|
|
||||||
typedef struct LevelScene
|
typedef struct LevelScene
|
||||||
|
|
Loading…
Reference in New Issue