From 0044b05130b1a659806e0de982143beded4ea21e Mon Sep 17 00:00:00 2001 From: doyle Date: Tue, 17 Oct 2023 23:49:20 +1100 Subject: [PATCH] fp: Add camera smoothing movement --- feely_pona.cpp | 27 +++++++++++++++------------ feely_pona_game.h | 1 + 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/feely_pona.cpp b/feely_pona.cpp index 187f629..2ca0d6f 100644 --- a/feely_pona.cpp +++ b/feely_pona.cpp @@ -1995,8 +1995,8 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input } if (entity->flags & FP_GameEntityFlag_CameraTracking) { - FP_GameCamera *camera = &game->play.camera; - camera->world_pos = FP_Game_CalcEntityWorldPos(game, entity->handle) * camera->scale; + FP_GameCamera *camera = &game->play.camera; + camera->world_pos_target = FP_Game_CalcEntityWorldPos(game, entity->handle) * camera->scale; } FP_GamePlaceableBuilding placeable_building = PLACEABLE_BUILDINGS[game->play.build_mode_building_index]; @@ -2290,11 +2290,12 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input } } + // NOTE: Camera ================================================================================ + FP_GamePlay *play = &game->play; + FP_GameCamera *camera = &play->camera; if (!FP_Game_IsNilEntityHandle(game, game->play.clicked_entity)) { Dqn_V2 window_size = Dqn_V2_InitV2I(platform->core.window_size); - FP_GamePlay *play = &game->play; - FP_GameCamera *camera = &play->camera; camera->scale = window_size / camera->size; Dqn_V2 camera_size_screen = camera->size * camera->scale; @@ -2302,12 +2303,13 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input Dqn_V2 map_screen_size = map_world_size * camera->scale; Dqn_V2 half_map_screen_size = map_screen_size * .5f; - camera->world_pos.x = DQN_MIN(camera->world_pos.x, half_map_screen_size.w - (camera_size_screen.w * .5f)); - camera->world_pos.x = DQN_MAX(camera->world_pos.x, -half_map_screen_size.w + (camera_size_screen.w * .5f)); - camera->world_pos.y = DQN_MAX(camera->world_pos.y, -half_map_screen_size.h + (camera_size_screen.h * .5f)); - camera->world_pos.y = DQN_MIN(camera->world_pos.y, half_map_screen_size.h - (camera_size_screen.h * .5f)); + camera->world_pos_target.x = DQN_MIN(camera->world_pos_target.x, half_map_screen_size.w - (camera_size_screen.w * .5f)); + camera->world_pos_target.x = DQN_MAX(camera->world_pos_target.x, -half_map_screen_size.w + (camera_size_screen.w * .5f)); + camera->world_pos_target.y = DQN_MAX(camera->world_pos_target.y, -half_map_screen_size.h + (camera_size_screen.h * .5f)); + camera->world_pos_target.y = DQN_MIN(camera->world_pos_target.y, half_map_screen_size.h - (camera_size_screen.h * .5f)); } + camera->world_pos += (camera->world_pos_target - camera->world_pos) * (5.f * DQN_CAST(Dqn_f32)input->delta_s); Dqn_Profiler_EndZone(update_zone); } @@ -3600,8 +3602,8 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F9 %s god mode", game->play.god_mode ? "Disable" : "Enable"); draw_p.y += TELY_Render_FontHeight(renderer, assets); TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F10 %s noclip", player->flags & FP_GameEntityFlag_NoClip ? "Disable" : "Enable"); draw_p.y += TELY_Render_FontHeight(renderer, assets); TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F11 Building inventory +1"); draw_p.y += TELY_Render_FontHeight(renderer, assets); - TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F12 %s by enemies", player->faction == FP_GameEntityFaction_Nil ? "Attacked" : "Ignored"); draw_p.y += TELY_Render_FontHeight(renderer, assets); TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " 1 %s HUD", game->play.debug_hide_hud ? "Show" : "Hide"); draw_p.y += TELY_Render_FontHeight(renderer, assets); + TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " 2 %s by enemies", player->faction == FP_GameEntityFaction_Nil ? "Attacked" : "Ignored"); draw_p.y += TELY_Render_FontHeight(renderer, assets); TELY_Render_PopFont(renderer); TELY_Render_PopColourV4(renderer); @@ -3656,14 +3658,15 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, player->inventory.kennels += 1; } - if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_F12)) { + if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_1)) + game->play.debug_hide_hud = !game->play.debug_hide_hud; + + if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_2)) { player->faction = player->faction == FP_GameEntityFaction_Nil ? FP_GameEntityFaction_Friendly : FP_GameEntityFaction_Nil; } - if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_1)) - game->play.debug_hide_hud = !game->play.debug_hide_hud; } } diff --git a/feely_pona_game.h b/feely_pona_game.h index 52e0733..7bd115b 100644 --- a/feely_pona_game.h +++ b/feely_pona_game.h @@ -257,6 +257,7 @@ struct FP_GameCamera { Dqn_V2 size; Dqn_V2 world_pos; + Dqn_V2 world_pos_target; Dqn_f32 rotate_rads; Dqn_V2 scale; };