fp: Add walls to avoid going OOB

This commit is contained in:
doyle 2023-10-01 21:15:05 +11:00
parent 4f4868efb0
commit c5a76e6b97
2 changed files with 34 additions and 10 deletions

View File

@ -280,7 +280,7 @@ void TELY_DLL_Init(void *user_data)
game->root_entity = Dqn_VArray_Make(&game->entities, Dqn_ZeroMem_No); game->root_entity = Dqn_VArray_Make(&game->entities, Dqn_ZeroMem_No);
Dqn_FArray_Add(&game->parent_entity_stack, game->root_entity->handle); Dqn_FArray_Add(&game->parent_entity_stack, game->root_entity->handle);
// NOTE: Map // NOTE: Map ===================================================================================
{ {
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.map); TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.map);
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index]; Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
@ -299,7 +299,35 @@ void TELY_DLL_Init(void *user_data)
game->map = entity; game->map = entity;
} }
// NOTE: Hero // NOTE: Map walls =============================================================================
{
FP_GameEntity const *map = game->map;
Dqn_Rect map_hit_box = FP_Game_CalcEntityWorldHitBox(game, map->handle);
Dqn_f32 wall_thickness = FP_Game_MetersToPixelsNx1(game, 1.f);
Dqn_f32 half_wall_thickness = wall_thickness * .5f;
FP_Entity_CreateWallAtPos(game,
DQN_STRING8("Left Wall"),
Dqn_Rect_InterpolatedPoint(map_hit_box, Dqn_V2_InitNx2(0.f, 0.5f)) - Dqn_V2_InitNx2(half_wall_thickness, 0.f),
Dqn_V2_InitNx2(wall_thickness, map_hit_box.size.h));
FP_Entity_CreateWallAtPos(game,
DQN_STRING8("Right Wall"),
Dqn_Rect_InterpolatedPoint(map_hit_box, Dqn_V2_InitNx2(1.f, 0.5f)) + Dqn_V2_InitNx2(half_wall_thickness, 0.f),
Dqn_V2_InitNx2(wall_thickness, map_hit_box.size.h));
FP_Entity_CreateWallAtPos(game,
DQN_STRING8("Top Wall"),
Dqn_Rect_InterpolatedPoint(map_hit_box, Dqn_V2_InitNx2(0.5f, 0.f)) - Dqn_V2_InitNx2(0.f, half_wall_thickness),
Dqn_V2_InitNx2(map_hit_box.size.w, wall_thickness));
FP_Entity_CreateWallAtPos(game,
DQN_STRING8("Bottom Wall"),
Dqn_Rect_InterpolatedPoint(map_hit_box, Dqn_V2_InitNx2(0.5f, 1.f)) + Dqn_V2_InitNx2(0.f, half_wall_thickness),
Dqn_V2_InitNx2(map_hit_box.size.w, wall_thickness));
}
// NOTE: Hero ==================================================================================
{ {
FP_GameEntityHandle terry = FP_Entity_CreateTerry(game, Dqn_V2_InitNx2(1434, 11), "Terry"); FP_GameEntityHandle terry = FP_Entity_CreateTerry(game, Dqn_V2_InitNx2(1434, 11), "Terry");
game->clicked_entity = terry; game->clicked_entity = terry;

View File

@ -87,16 +87,12 @@ static FP_GameEntityHandle FP_Entity_CreateSmoochie(FP_Game *game, Dqn_V2 pos, D
return result; return result;
} }
static FP_GameEntityHandle FP_Entity_CreateWallAtTile(FP_Game *game, Dqn_String8 name, Dqn_V2I tile_pos, Dqn_V2I size_in_tiles) static FP_GameEntityHandle FP_Entity_CreateWallAtPos(FP_Game *game, Dqn_String8 name, Dqn_V2 pos, Dqn_V2 size)
{ {
Dqn_V2 size = Dqn_V2_InitV2I(size_in_tiles * DQN_CAST(int32_t) game->tile_size);
Dqn_V2 world_pos = FP_Game_TilePosToWorldPos(game, tile_pos);
world_pos += size * .5f;
FP_GameEntity *entity = FP_Game_MakeEntityPointerF(game, name.data); FP_GameEntity *entity = FP_Game_MakeEntityPointerF(game, name.data);
FP_GameEntityHandle result = entity->handle; FP_GameEntityHandle result = entity->handle;
entity->local_pos = world_pos; entity->local_pos = pos;
entity->local_hit_box_size = Dqn_V2_InitV2I(size_in_tiles * DQN_CAST(int32_t)game->tile_size); entity->local_hit_box_size = size;
FP_Entity_AddDebugEditorFlags(game, entity->handle); FP_Entity_AddDebugEditorFlags(game, entity->handle);
entity->flags |= FP_GameEntityFlag_NonTraversable; entity->flags |= FP_GameEntityFlag_NonTraversable;