From 0c3eb015219358469b8f6ad83c6b2187b660abc7 Mon Sep 17 00:00:00 2001 From: ShadesAndGrays Date: Tue, 14 Jul 2026 21:06:08 +0100 Subject: [PATCH] add fruit reaction --- src/asset.cpp | 6 ++--- src/fruit.cpp | 42 +++++++++++++++++++++++++--------- src/include/components.hpp | 7 ++++++ src/include/locator.hpp | 3 +++ src/include/math_util.hpp | 21 +++++++++++++++++ src/locator.cpp | 3 +++ src/movement.cpp | 2 ++ src/player.cpp | 31 ++++++++++--------------- src/render.cpp | 41 +++++++++++++++++++++++++++------ src/scenes/game_play_scene.cpp | 2 +- 10 files changed, 117 insertions(+), 41 deletions(-) create mode 100644 src/include/locator.hpp create mode 100644 src/include/math_util.hpp create mode 100644 src/locator.cpp diff --git a/src/asset.cpp b/src/asset.cpp index 2d17898..2b14586 100644 --- a/src/asset.cpp +++ b/src/asset.cpp @@ -1,16 +1,16 @@ - -#include - #include + #include #include +#include #include #include #include #include + namespace fs = std::filesystem; // Helper to determine if the asset path implies streaming music diff --git a/src/fruit.cpp b/src/fruit.cpp index f0abf38..577b16b 100644 --- a/src/fruit.cpp +++ b/src/fruit.cpp @@ -1,30 +1,50 @@ // src\fruit.cpp -// -#include -#include +#include -#include +#include +#include +#include +#include + +#include +#include +// #include entt::entity fruit; +// File Base Helper Function +Position get_player_position(entt::registry& registry){ + auto player_view = registry.view(); + if (player_view.empty()) return {}; + + entt::entity player_entity = player_view.front(); + return registry.get(player_entity); +} +void change_position(Position& pos){ + pos.x = Math::RandomRange(30, GetScreenWidth()-30); + pos.y = Math::RandomRange(30, GetScreenHeight()-30); +}; + + + void create_fruit(entt::registry& registry,Texture* texture){ const auto entity = registry.create(); registry.emplace(entity,100.0f,0.0f); registry.emplace(entity); - registry.emplace(entity,texture); + registry.emplace(entity,texture,0.0f,0.0f,30.f,30.0f,false,false,0.0f); } void update_fruit_system(entt::registry& registry,float dt){ - auto view = registry.view(); + auto view = registry.view(); + const Position player_pos = get_player_position(registry); for (entt::entity entity : view){ - - const Position& pos = view.get(entity); - Velocity& vel = view.get(entity); - + Position& pos = view.get(entity); + if (abs(pos.x - player_pos.x) < 35 && abs(pos.y - player_pos.y) < 35 ){ + change_position(pos); + } } - } diff --git a/src/include/components.hpp b/src/include/components.hpp index f95ab1f..cfb4bd1 100644 --- a/src/include/components.hpp +++ b/src/include/components.hpp @@ -17,4 +17,11 @@ struct Fruit{}; struct Sprite{ Texture *texture; + float offset_x; + float offset_y; + float width; + float height; + bool flip_h; + bool flip_v; + float rotation; }; diff --git a/src/include/locator.hpp b/src/include/locator.hpp new file mode 100644 index 0000000..e8383a6 --- /dev/null +++ b/src/include/locator.hpp @@ -0,0 +1,3 @@ +#pragma once + +class ServiceLocator{}; diff --git a/src/include/math_util.hpp b/src/include/math_util.hpp new file mode 100644 index 0000000..5848c78 --- /dev/null +++ b/src/include/math_util.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace Math { + // Generate a random float between min and max + inline float RandomRange(float min, float max) { + static std::random_device rd; + static std::mt19937 gen(rd()); + std::uniform_real_distribution dist(min, max); + return dist(gen); + } + + // Generate a random int between min and max + inline int RandomRange(int min, int max) { + static std::random_device rd; + static std::mt19937 gen(rd()); + std::uniform_int_distribution dist(min, max); + return dist(gen); + } +} diff --git a/src/locator.cpp b/src/locator.cpp new file mode 100644 index 0000000..c495774 --- /dev/null +++ b/src/locator.cpp @@ -0,0 +1,3 @@ +#include + +// Will contain definition of service locator class diff --git a/src/movement.cpp b/src/movement.cpp index 25dbd77..94c086a 100644 --- a/src/movement.cpp +++ b/src/movement.cpp @@ -1,4 +1,6 @@ // src\movement.cpp +#include + #include #include diff --git a/src/player.cpp b/src/player.cpp index 91d3fb2..51173ea 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1,4 +1,6 @@ // src\player.cpp +#include + #include #include @@ -6,28 +8,24 @@ entt::entity player; +const float SPEED = 300.0f; void create_player(entt::registry& registry,Texture* texture){ const auto entity = registry.create(); registry.emplace(entity,100.0f,0.0f); - registry.emplace(entity,300.0f,0.0f); + registry.emplace(entity,SPEED,0.0f); registry.emplace(entity); - registry.emplace(entity,texture); + registry.emplace(entity,texture,0.0f,0.0f,70.0f,70.0f,false,false,0.0f); } void update_player_system(entt::registry& registry,float dt){ - auto view = registry.view(); - - // Constants for fine-tuning game feel - // const float GRAVITY = 900.0f; // Constant downward pull (pixels/sec^2) - // const float JUMP_FORCE = -350.0f; // Negative force to burst UPWARD - + auto view = registry.view(); for (entt::entity entity : view){ const Position& pos = view.get(entity); Velocity& vel = view.get(entity); - const float SPEED = 350; + Sprite& sprite = view.get(entity); if (IsKeyPressed(KEY_W)){ if (vel.dy > 0) @@ -52,16 +50,11 @@ void update_player_system(entt::registry& registry,float dt){ vel.dy = 0; } - // if (pos.x < -50 && vel.dx < 0){ - // vel.dx *= -1; - // } else if (pos.x > (GetScreenWidth()-250) && vel.dx > 0){ - // vel.dx *= -1; - // } - - // if (IsKeyPressed(KEY_SPACE)){ - // vel.dy = JUMP_FORCE; - // } - // vel.dy += GRAVITY * dt; + if (vel.dx != 0.0f || vel.dy != 0.0f) { + // atan2 returns radians. Convert to degrees if your renderer expects it! + float radians = std::atan2(vel.dy, vel.dx); + sprite.rotation = radians * (180.0f / 3.14159265f); + } } } diff --git a/src/render.cpp b/src/render.cpp index 3fcf617..5b60784 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -8,11 +8,38 @@ void update_render_system(entt::registry ®istry){ auto view = registry.view(); - view.each([] (const auto &sprite, const auto &position){ - if (sprite.texture){ - DrawTexture(*(sprite.texture),position.x,position.y,WHITE); - }else{ - DrawRectangle(position.x,position.y,50, 70,BLACK); - } - }); + for (entt::entity entity : view){ + const Sprite &sprite = view.get(entity); + const Position &pos = view.get(entity); + + if (sprite.texture){ + DrawTexturePro( + *(sprite.texture), + Rectangle{ + 0, + 0, + (float)sprite.texture->width, + (float)sprite.texture->height, + }, + Rectangle { + sprite.offset_x + pos.x, + sprite.offset_y + pos.y, + sprite.width, + sprite.height + }, + Vector2 {sprite.width * 0.5f, sprite.height*0.5f}, + sprite.rotation, + WHITE); + + // DrawTexture( + // *(sprite.texture), + // pos.x + sprite.offset_x, + // pos.y + sprite.offset_y, + // WHITE + // ); + }else{ + DrawRectangle(pos.x,pos.y,100, 100,PURPLE); + } + } + } diff --git a/src/scenes/game_play_scene.cpp b/src/scenes/game_play_scene.cpp index f4ec0a7..0a7d392 100644 --- a/src/scenes/game_play_scene.cpp +++ b/src/scenes/game_play_scene.cpp @@ -54,6 +54,6 @@ void GamePlayScene::ui() { } GamePlayScene::~GamePlayScene(){ - asset_loader.unload_asset("assets/bird.png"); asset_loader.unload_asset("assets/snake_head.png"); + asset_loader.unload_asset("assets/fruit.png"); }