Просмотр исходного кода

add background entity + reset attack button

jblanked 1 год назад
Родитель
Сommit
bbda161cdd
5 измененных файлов с 134 добавлено и 108 удалено
  1. 121 1
      game/draw.c
  2. 3 1
      game/draw.h
  3. 4 94
      game/enemy.c
  4. 0 12
      game/enemy.h
  5. 6 0
      game/level.c

+ 121 - 1
game/draw.c

@@ -121,4 +121,124 @@ void spawn_icon_line(Level *level, const char *icon_id, float x, float y, uint8_
             spawn_icon(level, icon_id, x, y + (i * 17));
         }
     }
-}
+}
+
+static void draw_menu(GameManager *manager, Canvas *canvas)
+{
+    GameContext *game_context = game_manager_game_context_get(manager);
+
+    // draw background rectangle
+    canvas_draw_icon(
+        canvas,
+        0,
+        0,
+        &I_icon_menu_128x64px);
+
+    // draw menu options
+    switch (game_context->menu_screen)
+    {
+    case GAME_MENU_INFO:
+        // draw info
+        // first option is highlighted
+        char health[32];
+        char xp[32];
+        char level[32];
+        char strength[32];
+
+        snprintf(level, sizeof(level), "Level   : %ld", game_context->player_context->level);
+        snprintf(health, sizeof(health), "Health  : %ld", game_context->player_context->health);
+        snprintf(xp, sizeof(xp), "XP      : %ld", game_context->player_context->xp);
+        snprintf(strength, sizeof(strength), "Strength: %ld", game_context->player_context->strength);
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 7, 16, game_context->player_context->username);
+        canvas_set_font_custom(canvas, FONT_SIZE_SMALL);
+        canvas_draw_str(canvas, 7, 30, level);
+        canvas_draw_str(canvas, 7, 37, health);
+        canvas_draw_str(canvas, 7, 44, xp);
+        canvas_draw_str(canvas, 7, 51, strength);
+
+        // draw a box around the selected option
+        canvas_draw_frame(canvas, 80, 18, 36, 30);
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 86, 30, "Info");
+        canvas_set_font(canvas, FontSecondary);
+        canvas_draw_str(canvas, 86, 42, "More");
+        break;
+    case GAME_MENU_MORE:
+        // draw settings
+        switch (game_context->menu_selection)
+        {
+        case 0:
+            // first option is highlighted
+            break;
+        case 1:
+            // second option is highlighted
+            break;
+        default:
+            break;
+        }
+
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 7, 16, "FlipWorld v0.4");
+        canvas_set_font_custom(canvas, FONT_SIZE_SMALL);
+        canvas_draw_str_multi(canvas, 7, 25, "Developed by\nJBlanked and Derek \nJamison. Graphics\nfrom Pr3!\n\nwww.github.com/jblanked");
+
+        // draw a box around the selected option
+        canvas_draw_frame(canvas, 80, 18, 36, 30);
+        canvas_set_font(canvas, FontSecondary);
+        canvas_draw_str(canvas, 86, 30, "Info");
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 86, 42, "More");
+        break;
+    default:
+        break;
+    }
+}
+
+static void background_render(Entity *self, GameManager *manager, Canvas *canvas, void *context)
+{
+    if (!self || !context || !canvas || !manager)
+        return;
+
+    GameContext *game_context = game_manager_game_context_get(manager);
+
+    // get player position
+    Vector posi = entity_pos_get(game_context->player);
+
+    // draw username over player's head
+    draw_username(canvas, posi, game_context->player_context->username);
+
+    // draw switch world icon
+    if (game_context->is_switching_level)
+    {
+        canvas_draw_icon(
+            canvas,
+            0,
+            0,
+            &I_icon_world_change_128x64px);
+    }
+
+    // draw menu
+    if (game_context->is_menu_open)
+    {
+        draw_menu(manager, canvas);
+    }
+};
+
+// -------------- Entity description --------------
+const EntityDescription background_desc = {
+    .start = NULL,
+    .stop = NULL,
+    .update = NULL,
+    .render = background_render,
+    .collision = NULL,
+    .event = NULL,
+    .context_size = 0,
+};
+
+// we can return the same entity description for all backgrounds
+// since they all have the same rendering function
+Entity *add_background(Level *level)
+{
+    return level_add_entity(level, &background_desc);
+}

+ 3 - 1
game/draw.h

@@ -1,4 +1,5 @@
 #pragma once
+#include "game.h"
 #include "game/icon.h"
 #include <game/player.h>
 
@@ -11,4 +12,5 @@ void draw_username(Canvas *canvas, Vector pos, char *username);
 void draw_icon_line(Canvas *canvas, Vector pos, int amount, bool horizontal, const Icon *icon);
 void spawn_icon(Level *level, const char *icon_id, float x, float y);
 void spawn_icon_line(Level *level, const char *icon_id, float x, float y, uint8_t amount, bool horizontal);
-extern char g_name[32];
+extern char g_name[32];
+Entity *add_background(Level *level);

+ 4 - 94
game/enemy.c

@@ -105,78 +105,6 @@ static void enemy_start(Entity *self, GameManager *manager, void *context)
     entity_collider_add_circle(self, enemy_context->radius);
 }
 
-static void draw_menu(GameManager *manager, Canvas *canvas)
-{
-    GameContext *game_context = game_manager_game_context_get(manager);
-
-    // draw background rectangle
-    canvas_draw_icon(
-        canvas,
-        0,
-        0,
-        &I_icon_menu_128x64px);
-
-    // draw menu options
-    switch (game_context->menu_screen)
-    {
-    case GAME_MENU_INFO:
-        // draw info
-        // first option is highlighted
-        char health[32];
-        char xp[32];
-        char level[32];
-        char strength[32];
-
-        snprintf(level, sizeof(level), "Level   : %ld", game_context->player_context->level);
-        snprintf(health, sizeof(health), "Health  : %ld", game_context->player_context->health);
-        snprintf(xp, sizeof(xp), "XP      : %ld", game_context->player_context->xp);
-        snprintf(strength, sizeof(strength), "Strength: %ld", game_context->player_context->strength);
-        canvas_set_font(canvas, FontPrimary);
-        canvas_draw_str(canvas, 7, 16, game_context->player_context->username);
-        canvas_set_font_custom(canvas, FONT_SIZE_SMALL);
-        canvas_draw_str(canvas, 7, 30, level);
-        canvas_draw_str(canvas, 7, 37, health);
-        canvas_draw_str(canvas, 7, 44, xp);
-        canvas_draw_str(canvas, 7, 51, strength);
-
-        // draw a box around the selected option
-        canvas_draw_frame(canvas, 80, 18, 36, 30);
-        canvas_set_font(canvas, FontPrimary);
-        canvas_draw_str(canvas, 86, 30, "Info");
-        canvas_set_font(canvas, FontSecondary);
-        canvas_draw_str(canvas, 86, 42, "More");
-        break;
-    case GAME_MENU_MORE:
-        // draw settings
-        switch (game_context->menu_selection)
-        {
-        case 0:
-            // first option is highlighted
-            break;
-        case 1:
-            // second option is highlighted
-            break;
-        default:
-            break;
-        }
-
-        canvas_set_font(canvas, FontPrimary);
-        canvas_draw_str(canvas, 7, 16, "FlipWorld v0.4");
-        canvas_set_font_custom(canvas, FONT_SIZE_SMALL);
-        canvas_draw_str_multi(canvas, 7, 25, "Developed by\nJBlanked and Derek \nJamison. Graphics\nfrom Pr3!\n\nwww.github.com/jblanked");
-
-        // draw a box around the selected option
-        canvas_draw_frame(canvas, 80, 18, 36, 30);
-        canvas_set_font(canvas, FontSecondary);
-        canvas_draw_str(canvas, 86, 30, "Info");
-        canvas_set_font(canvas, FontPrimary);
-        canvas_draw_str(canvas, 86, 42, "More");
-        break;
-    default:
-        break;
-    }
-}
-
 // Enemy render function
 static void enemy_render(Entity *self, GameManager *manager, Canvas *canvas, void *context)
 {
@@ -184,7 +112,6 @@ static void enemy_render(Entity *self, GameManager *manager, Canvas *canvas, voi
         return;
 
     EnemyContext *enemy_context = (EnemyContext *)context;
-    GameContext *game_context = game_manager_game_context_get(manager);
 
     // Get the position of the enemy
     Vector pos = entity_pos_get(self);
@@ -207,33 +134,13 @@ static void enemy_render(Entity *self, GameManager *manager, Canvas *canvas, voi
         pos.x - camera_x - (enemy_context->size.x / 2),
         pos.y - camera_y - (enemy_context->size.y / 2));
 
-    // instead of username, draw health
+    // draw health of enemy
     char health_str[32];
     snprintf(health_str, sizeof(health_str), "%.0f", (double)enemy_context->health);
     draw_username(canvas, pos, health_str);
 
     // Draw user stats (this has to be done for all enemies)
     draw_user_stats(canvas, (Vector){0, 50}, manager);
-
-    // draw player username from GameContext
-    Vector posi = entity_pos_get(game_context->player);
-    draw_username(canvas, posi, game_context->player_context->username);
-
-    if (game_context->is_switching_level)
-    {
-        // draw switch world icon
-        canvas_draw_icon(
-            canvas,
-            0,
-            0,
-            &I_icon_world_change_128x64px);
-    }
-
-    if (game_context->is_menu_open)
-    {
-        // draw menu
-        draw_menu(manager, canvas);
-    }
 }
 
 static void atk_notify(GameContext *game_context, EnemyContext *enemy_context, bool player_attacked)
@@ -353,6 +260,9 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
         // Handle Player Attacking Enemy (Press OK, facing enemy, and enemy not facing player)
         if (player_is_facing_enemy && game_context->last_button == GameKeyOk && !enemy_is_facing_player)
         {
+            // Reset last button
+            game_context->last_button = -1;
+
             if (game_context->player_context->elapsed_attack_timer >= game_context->player_context->attack_timer)
             {
                 atk_notify(game_context, enemy_context, true);

+ 0 - 12
game/enemy.h

@@ -43,16 +43,4 @@ typedef struct
     float health;               // Health of the enemy
 } EnemyContext;
 
-const EntityDescription *enemy(
-    GameManager *manager,
-    const char *id,
-    int index,
-    Vector start_position,
-    Vector end_position,
-    float move_timer, // Wait duration before moving again
-    float speed,
-    float attack_timer,
-    float strength,
-    float health);
-
 void spawn_enemy_json_furi(Level *level, GameManager *manager, FuriString *json);

+ 6 - 0
game/level.c

@@ -41,6 +41,8 @@ static void set_world(Level *level, GameManager *manager, char *id)
     {
         FURI_LOG_E("Game", "Failed to load json data from file");
         draw_town_world(level);
+        // add background
+        add_background(level);
         return;
     }
 
@@ -60,6 +62,8 @@ static void set_world(Level *level, GameManager *manager, char *id)
         FURI_LOG_E("Game", "Failed to draw world");
         draw_town_world(level);
         furi_string_free(json_data_str);
+        // add background
+        add_background(level);
     }
     else
     {
@@ -93,6 +97,8 @@ static void set_world(Level *level, GameManager *manager, char *id)
             furi_string_free(single_enemy_data);
         }
         furi_string_free(enemy_data_str);
+        // add background
+        add_background(level);
         FURI_LOG_I("Game", "Finished loading world data");
     }
 }