Преглед изворни кода

update player/enemy collision/attack

On collision:
- a player attack: Press OK, facing enemy, and enemy not facing player
- an enemy attack: enemy facing player
jblanked пре 1 година
родитељ
комит
5ad6b8c65c
3 измењених фајлова са 15 додато и 17 уклоњено
  1. 5 8
      game/enemy.c
  2. 6 6
      game/player.c
  3. 4 3
      game/player.h

+ 5 - 8
game/enemy.c

@@ -149,7 +149,7 @@ static void enemy_render(Entity *self, GameManager *manager, Canvas *canvas, voi
     draw_user_stats(canvas, (Vector){0, 50}, manager);
 
     // draw player username from GameContext
-    Vector posi = entity_pos_get(game_context->players[0]);
+    Vector posi = entity_pos_get(game_context->player);
     draw_username(canvas, posi, game_context->player_context->username);
 }
 
@@ -205,8 +205,8 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
             player_is_facing_enemy = true;
         }
 
-        // Handle Player Attacking Enemy
-        if (player_is_facing_enemy && game_context->user_input == GameKeyOk)
+        // Handle Player Attacking Enemy (Press OK, facing enemy, and enemy not facing player)
+        if (player_is_facing_enemy && game_context->user_input == GameKeyOk && !enemy_is_facing_player)
         {
             if (game_context->player_context->elapsed_attack_timer >= game_context->player_context->attack_timer)
             {
@@ -264,7 +264,7 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
                 FURI_LOG_I("Game", "Player attack on enemy '%s' is on cooldown: %f seconds remaining", enemy_context->id, (double)(game_context->player_context->attack_timer - game_context->player_context->elapsed_attack_timer));
             }
         }
-        // Handle Enemy Attacking Player
+        // Handle Enemy Attacking Player (enemy facing player)
         else if (enemy_is_facing_player)
         {
             if (enemy_context->elapsed_attack_timer >= enemy_context->attack_timer)
@@ -333,12 +333,10 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
             }
 
             // Move the player and enemy away from each other
-            player_pos.x -= direction_vector.x * 3;
             player_pos.y -= direction_vector.y * 3;
             entity_pos_set(other, player_pos);
 
             enemy_pos.x += direction_vector.x * 3;
-            enemy_pos.y += direction_vector.y * 3;
             entity_pos_set(self, enemy_pos);
 
             // Reset player's movement direction to prevent immediate re-collision
@@ -346,8 +344,7 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
             game_context->player_context->dy = 0;
         }
 
-        // Reset enemy's position and state
-        entity_pos_set(self, enemy_context->start_position);
+        // Reset enemy's state
         enemy_context->state = ENEMY_IDLE;
         enemy_context->elapsed_move_timer = 0.0f;
 

+ 6 - 6
game/player.c

@@ -34,21 +34,21 @@ void player_spawn(Level *level, GameManager *manager)
         return;
     }
 
-    game_context->players[0] = level_add_entity(level, &player_desc);
-    if (!game_context->players[0])
+    game_context->player = level_add_entity(level, &player_desc);
+    if (!game_context->player)
     {
         FURI_LOG_E(TAG, "Failed to add player entity to level");
         return;
     }
 
     // Set player position.
-    entity_pos_set(game_context->players[0], (Vector){WORLD_WIDTH / 2, WORLD_HEIGHT / 2});
+    entity_pos_set(game_context->player, (Vector){WORLD_WIDTH / 2, WORLD_HEIGHT / 2});
 
     // Box is centered in player x and y, and its size
-    entity_collider_add_rect(game_context->players[0], 13, 11);
+    entity_collider_add_rect(game_context->player, 13, 11);
 
     // Get player context
-    PlayerContext *player_context = entity_context_get(game_context->players[0]);
+    PlayerContext *player_context = entity_context_get(game_context->player);
     if (!player_context)
     {
         FURI_LOG_E(TAG, "Failed to get player context");
@@ -68,7 +68,7 @@ void player_spawn(Level *level, GameManager *manager)
         player_context->strength = 10;
         player_context->level = 1;
         player_context->xp = 0;
-        player_context->start_position = entity_pos_get(game_context->players[0]);
+        player_context->start_position = entity_pos_get(game_context->player);
         player_context->attack_timer = 0.1f;
         player_context->elapsed_attack_timer = player_context->attack_timer;
         player_context->health_regen = 1; // 1 health per second

+ 4 - 3
game/player.h

@@ -4,7 +4,8 @@
 #include <game/game.h>
 
 // Maximum enemies
-#define MAX_ENEMIES 10
+#define MAX_ENEMIES 2
+#define MAX_LEVELS 5
 
 typedef enum
 {
@@ -47,9 +48,9 @@ typedef struct
 typedef struct
 {
     PlayerContext *player_context;
-    Level *levels[10];
+    Level *levels[MAX_LEVELS];
     Entity *enemies[MAX_ENEMIES];
-    Entity *players[1];
+    Entity *player;
     GameKey user_input;
     float fps;
     int level_count;