Kaynağa Gözat

update background drawing

jblanked 1 yıl önce
ebeveyn
işleme
7b9b5a3b40
4 değiştirilmiş dosya ile 22 ekleme ve 52 silme
  1. 2 38
      game/draw.c
  2. 1 2
      game/draw.h
  3. 6 10
      game/level.c
  4. 13 2
      game/player.c

+ 2 - 38
game/draw.c

@@ -4,24 +4,6 @@
 int camera_x = 0;
 int camera_x = 0;
 int camera_y = 0;
 int camera_y = 0;
 
 
-// Background rendering function (no collision detection)
-void draw_background(Canvas *canvas, Vector pos)
-{
-    // Clear the canvas
-    canvas_clear(canvas);
-
-    // Calculate camera offset to center the player
-    camera_x = pos.x - (SCREEN_WIDTH / 2);
-    camera_y = pos.y - (SCREEN_HEIGHT / 2);
-
-    // Clamp camera position to prevent showing areas outside the world
-    camera_x = CLAMP(camera_x, WORLD_WIDTH - SCREEN_WIDTH, 0);
-    camera_y = CLAMP(camera_y, WORLD_HEIGHT - SCREEN_HEIGHT, 0);
-
-    // Draw the outer bounds adjusted by camera offset
-    draw_bounds(canvas);
-}
-
 // Draw the user stats (health, xp, and level)
 // Draw the user stats (health, xp, and level)
 void draw_user_stats(Canvas *canvas, Vector pos, GameManager *manager)
 void draw_user_stats(Canvas *canvas, Vector pos, GameManager *manager)
 {
 {
@@ -195,9 +177,9 @@ static void draw_menu(GameManager *manager, Canvas *canvas)
     }
     }
 }
 }
 
 
-static void background_render(Entity *self, GameManager *manager, Canvas *canvas, void *context)
+void background_render(Canvas *canvas, GameManager *manager)
 {
 {
-    if (!self || !context || !canvas || !manager)
+    if (!canvas || !manager)
         return;
         return;
 
 
     GameContext *game_context = game_manager_game_context_get(manager);
     GameContext *game_context = game_manager_game_context_get(manager);
@@ -224,21 +206,3 @@ static void background_render(Entity *self, GameManager *manager, Canvas *canvas
         draw_menu(manager, canvas);
         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);
-}

+ 1 - 2
game/draw.h

@@ -6,11 +6,10 @@
 // Global variables to store camera position
 // Global variables to store camera position
 extern int camera_x;
 extern int camera_x;
 extern int camera_y;
 extern int camera_y;
-void draw_background(Canvas *canvas, Vector pos);
 void draw_user_stats(Canvas *canvas, Vector pos, GameManager *manager);
 void draw_user_stats(Canvas *canvas, Vector pos, GameManager *manager);
 void draw_username(Canvas *canvas, Vector pos, char *username);
 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 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(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);
 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);
+void background_render(Canvas *canvas, GameManager *manager);

+ 6 - 10
game/level.c

@@ -41,8 +41,6 @@ static void set_world(Level *level, GameManager *manager, char *id)
     {
     {
         FURI_LOG_E("Game", "Failed to load json data from file");
         FURI_LOG_E("Game", "Failed to load json data from file");
         draw_town_world(level);
         draw_town_world(level);
-        // add background
-        add_background(level);
         return;
         return;
     }
     }
 
 
@@ -62,8 +60,6 @@ static void set_world(Level *level, GameManager *manager, char *id)
         FURI_LOG_E("Game", "Failed to draw world");
         FURI_LOG_E("Game", "Failed to draw world");
         draw_town_world(level);
         draw_town_world(level);
         furi_string_free(json_data_str);
         furi_string_free(json_data_str);
-        // add background
-        add_background(level);
     }
     }
     else
     else
     {
     {
@@ -97,8 +93,6 @@ static void set_world(Level *level, GameManager *manager, char *id)
             furi_string_free(single_enemy_data);
             furi_string_free(single_enemy_data);
         }
         }
         furi_string_free(enemy_data_str);
         furi_string_free(enemy_data_str);
-        // add background
-        add_background(level);
         FURI_LOG_I("Game", "Finished loading world data");
         FURI_LOG_I("Game", "Finished loading world data");
     }
     }
 }
 }
@@ -118,7 +112,6 @@ static void level_start(Level *level, GameManager *manager, void *context)
     }
     }
 
 
     level_clear(level);
     level_clear(level);
-    player_spawn(level, manager);
 
 
     LevelContext *level_context = context;
     LevelContext *level_context = context;
     if (!level_context)
     if (!level_context)
@@ -138,14 +131,15 @@ static void level_start(Level *level, GameManager *manager, void *context)
             FURI_LOG_E("Game", "Failed to fetch world data");
             FURI_LOG_E("Game", "Failed to fetch world data");
             draw_town_world(level);
             draw_town_world(level);
             game_context->is_switching_level = false;
             game_context->is_switching_level = false;
-            furi_delay_ms(1000);
+            // furi_delay_ms(1000);
+            player_spawn(level, manager);
             return;
             return;
         }
         }
         furi_string_free(world_data);
         furi_string_free(world_data);
 
 
         set_world(level, manager, level_context->id);
         set_world(level, manager, level_context->id);
         FURI_LOG_I("Game", "World set.");
         FURI_LOG_I("Game", "World set.");
-        furi_delay_ms(1000);
+        // furi_delay_ms(1000);
         game_context->is_switching_level = false;
         game_context->is_switching_level = false;
     }
     }
     else
     else
@@ -153,9 +147,11 @@ static void level_start(Level *level, GameManager *manager, void *context)
         FURI_LOG_I("Game", "World exists.. loading now");
         FURI_LOG_I("Game", "World exists.. loading now");
         set_world(level, manager, level_context->id);
         set_world(level, manager, level_context->id);
         FURI_LOG_I("Game", "World set.");
         FURI_LOG_I("Game", "World set.");
-        furi_delay_ms(1000);
+        // furi_delay_ms(1000);
         game_context->is_switching_level = false;
         game_context->is_switching_level = false;
     }
     }
+
+    player_spawn(level, manager);
 }
 }
 
 
 static LevelContext *level_context_generic;
 static LevelContext *level_context_generic;

+ 13 - 2
game/player.c

@@ -398,8 +398,13 @@ static void player_render(Entity *self, GameManager *manager, Canvas *canvas, vo
     // Get player position
     // Get player position
     Vector pos = entity_pos_get(self);
     Vector pos = entity_pos_get(self);
 
 
-    // Draw background (updates camera_x and camera_y)
-    draw_background(canvas, pos);
+    // Calculate camera offset to center the player
+    camera_x = pos.x - (SCREEN_WIDTH / 2);
+    camera_y = pos.y - (SCREEN_HEIGHT / 2);
+
+    // Clamp camera position to prevent showing areas outside the world
+    camera_x = CLAMP(camera_x, WORLD_WIDTH - SCREEN_WIDTH, 0);
+    camera_y = CLAMP(camera_y, WORLD_HEIGHT - SCREEN_HEIGHT, 0);
 
 
     // Draw player sprite relative to camera, centered on the player's position
     // Draw player sprite relative to camera, centered on the player's position
     canvas_draw_sprite(
     canvas_draw_sprite(
@@ -408,6 +413,12 @@ static void player_render(Entity *self, GameManager *manager, Canvas *canvas, vo
         pos.x - camera_x - 5, // Center the sprite horizontally
         pos.x - camera_x - 5, // Center the sprite horizontally
         pos.y - camera_y - 5  // Center the sprite vertically
         pos.y - camera_y - 5  // Center the sprite vertically
     );
     );
+
+    // Draw the outer bounds adjusted by camera offset
+    draw_bounds(canvas);
+
+    // Draw the user stats (health, xp, and level)
+    background_render(canvas, manager);
 }
 }
 
 
 const EntityDescription player_desc = {
 const EntityDescription player_desc = {