SG 1 год назад
Родитель
Сommit
aecfb6f1ea
5 измененных файлов с 29 добавлено и 24 удалено
  1. 2 2
      entity_i.h
  2. 9 7
      level.c
  3. 6 4
      level.h
  4. 1 1
      level_i.h
  5. 11 10
      main.c

+ 2 - 2
entity_i.h

@@ -37,9 +37,9 @@ Entity* entity_alloc(const EntityDescription* behaviour);
 
 void entity_free(Entity* entity);
 
-void entity_call_start(Level* level, Entity* entity);
+void entity_call_start(Entity* entity, GameManager* manager);
 
-void entity_call_stop(Level* level, Entity* entity);
+void entity_call_stop(Entity* entity, GameManager* manager);
 
 void entity_call_update(Entity* entity, GameManager* manager);
 

+ 9 - 7
level.c

@@ -18,10 +18,12 @@ struct Level {
     EntityList_t to_remove;
     const LevelBehaviour* behaviour;
     void* context;
+    GameManager* manager;
 };
 
-Level* level_alloc(const LevelBehaviour* behaviour) {
+Level* level_alloc(const LevelBehaviour* behaviour, GameManager* manager) {
     Level* level = malloc(sizeof(Level));
+    level->manager = manager;
     EntityList_init(level->entities);
     EntityList_init(level->to_add);
     EntityList_init(level->to_remove);
@@ -113,13 +115,13 @@ void level_clear(Level* level) {
 Entity* level_add_entity(Level* level, const EntityDescription* description) {
     Entity* entity = entity_alloc(description);
     EntityList_push_back(level->to_add, entity);
-    entity_call_start(level, entity);
+    entity_call_start(entity, level->manager);
     return entity;
 }
 
 void level_remove_entity(Level* level, Entity* entity) {
     EntityList_push_back(level->to_remove, entity);
-    entity_call_stop(level, entity);
+    entity_call_stop(entity, level->manager);
 }
 
 static void level_process_update(Level* level, GameManager* manager) {
@@ -176,24 +178,24 @@ void level_render(Level* level, GameManager* manager, Canvas* canvas) {
 
 void level_call_start(Level* level) {
     if(level->behaviour->start) {
-        level->behaviour->start(level, level->context);
+        level->behaviour->start(level, level->manager, level->context);
     }
 }
 
 void level_call_stop(Level* level) {
     if(level->behaviour->stop) {
-        level->behaviour->stop(level, level->context);
+        level->behaviour->stop(level, level->manager, level->context);
     }
 }
 
 void level_call_alloc(Level* level) {
     if(level->behaviour->alloc) {
-        level->behaviour->alloc(level, level->context);
+        level->behaviour->alloc(level, level->manager, level->context);
     }
 }
 
 void level_call_free(Level* level) {
     if(level->behaviour->free) {
-        level->behaviour->free(level, level->context);
+        level->behaviour->free(level, level->manager, level->context);
     }
 }

+ 6 - 4
level.h

@@ -6,11 +6,13 @@
 extern "C" {
 #endif
 
+typedef struct GameManager GameManager;
+
 typedef struct {
-    void (*alloc)(Level* level, void* context);
-    void (*free)(Level* level, void* context);
-    void (*start)(Level* level, void* context);
-    void (*stop)(Level* level, void* context);
+    void (*alloc)(Level* level, GameManager* manager, void* context);
+    void (*free)(Level* level, GameManager* manager, void* context);
+    void (*start)(Level* level, GameManager* manager, void* context);
+    void (*stop)(Level* level, GameManager* manager, void* context);
     size_t context_size;
 } LevelBehaviour;
 

+ 1 - 1
level_i.h

@@ -5,7 +5,7 @@
 extern "C" {
 #endif
 
-Level* level_alloc(const LevelBehaviour* behaviour);
+Level* level_alloc(const LevelBehaviour* behaviour, GameManager* manager);
 
 void level_free(Level* level);
 

+ 11 - 10
main.c

@@ -5,26 +5,18 @@
 #include "level_i.h"
 #include "entity_i.h"
 
-static void frame_cb(RunningGameEngine* engine, Canvas* canvas, InputState input, void* context) {
+static void frame_cb(GameEngine* engine, Canvas* canvas, InputState input, void* context) {
+    UNUSED(engine);
     GameManager* game_manager = context;
     game_manager_input_set(game_manager, input);
-    game_manager_engine_set(game_manager, engine);
     game_manager_update(game_manager);
     game_manager_render(game_manager, canvas);
 }
 
 int32_t game_app(void* p) {
     UNUSED(p);
-
     GameManager* game_manager = game_manager_alloc();
 
-    void* game_context = NULL;
-    if(game.context_size > 0) {
-        game_context = malloc(game.context_size);
-        game_manager_game_context_set(game_manager, game_context);
-    }
-    game.start(game_manager, game_context);
-
     GameEngineSettings settings = game_engine_settings_init();
     settings.target_fps = game.target_fps;
     settings.show_fps = game.show_fps;
@@ -33,6 +25,15 @@ int32_t game_app(void* p) {
     settings.context = game_manager;
 
     GameEngine* engine = game_engine_alloc(settings);
+    game_manager_engine_set(game_manager, engine);
+
+    void* game_context = NULL;
+    if(game.context_size > 0) {
+        game_context = malloc(game.context_size);
+        game_manager_game_context_set(game_manager, game_context);
+    }
+    game.start(game_manager, game_context);
+
     game_engine_run(engine);
     game_engine_free(engine);