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

Engine: simplified entity allocation

SG 1 год назад
Родитель
Сommit
eac54c905d
5 измененных файлов с 28 добавлено и 39 удалено
  1. 21 26
      entity.c
  2. 3 9
      entity.h
  3. 1 1
      entity_i.h
  4. 2 2
      level.c
  5. 1 1
      level.h

+ 21 - 26
entity.c

@@ -3,34 +3,34 @@
 #include <stdlib.h>
 #include <furi.h>
 
+#define ENTITY_DEBUG(...) FURI_LOG_D("Entity", __VA_ARGS__)
+
 struct Entity {
     Vector position;
-    EntityBehaviour behaviour;
+    const EntityBehaviour* behaviour;
     void* context;
 };
 
-Entity* entity_alloc() {
+Entity* entity_alloc(const EntityBehaviour* behaviour) {
     Entity* entity = malloc(sizeof(Entity));
     entity->position = VECTOR_ZERO;
-    entity->behaviour = ENTITY_BEHAVIOUR_EMPTY;
+    entity->behaviour = behaviour;
     entity->context = NULL;
-    FURI_LOG_D("Entity", "Allocated entity at %p", entity);
+    if(behaviour && behaviour->context_size > 0) {
+        entity->context = malloc(behaviour->context_size);
+    }
+    ENTITY_DEBUG("Allocated entity at %p", entity);
     return entity;
 }
 
 void entity_free(Entity* entity) {
-    FURI_LOG_D("Entity", "Freeing entity at %p", entity);
+    ENTITY_DEBUG("Freeing entity at %p", entity);
+    if(entity->context) {
+        free(entity->context);
+    }
     free(entity);
 }
 
-void entity_behaviour_set(Entity* entity, EntityBehaviour behaviour) {
-    entity->behaviour = behaviour;
-}
-
-void entity_context_set(Entity* entity, void* context) {
-    entity->context = context;
-}
-
 Vector entity_pos_get(Entity* entity) {
     return entity->position;
 }
@@ -39,35 +39,30 @@ void entity_pos_set(Entity* entity, Vector position) {
     entity->position = position;
 }
 
-void entity_pos_add(Entity* entity, Vector delta) {
-    entity->position.x += delta.x;
-    entity->position.y += delta.y;
-}
-
 void* entity_context_get(Entity* entity) {
     return entity->context;
 }
 
 void entity_call_start(Entity* entity) {
-    if(entity->behaviour.start) {
-        entity->behaviour.start(entity);
+    if(entity->behaviour && entity->behaviour->start) {
+        entity->behaviour->start(entity->context);
     }
 }
 
 void entity_call_stop(Entity* entity) {
-    if(entity->behaviour.stop) {
-        entity->behaviour.stop(entity->context);
+    if(entity->behaviour && entity->behaviour->stop) {
+        entity->behaviour->stop(entity->context);
     }
 }
 
 void entity_call_update(Entity* entity, Director* director) {
-    if(entity->behaviour.update) {
-        entity->behaviour.update(entity, director, entity->context);
+    if(entity->behaviour && entity->behaviour->update) {
+        entity->behaviour->update(entity, director, entity->context);
     }
 }
 
 void entity_call_render(Entity* entity, Director* director, Canvas* canvas) {
-    if(entity->behaviour.render) {
-        entity->behaviour.render(entity, director, canvas, entity->context);
+    if(entity->behaviour && entity->behaviour->render) {
+        entity->behaviour->render(entity, director, canvas, entity->context);
     }
 }

+ 3 - 9
entity.h

@@ -1,6 +1,7 @@
 #pragma once
 #include "game_engine.h"
 #include "director.h"
+#include <stdlib.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,24 +17,17 @@ typedef struct {
 #define VECTOR_ZERO ((Vector){0, 0})
 
 typedef struct {
-    void (*start)(Entity* entity);
+    void (*start)(void* context);
     void (*stop)(void* context);
     void (*update)(Entity* entity, Director* director, void* context);
     void (*render)(Entity* entity, Director* director, Canvas* canvas, void* context);
+    size_t context_size;
 } EntityBehaviour;
 
-#define ENTITY_BEHAVIOUR_EMPTY ((EntityBehaviour){NULL, NULL, NULL, NULL})
-
-void entity_behaviour_set(Entity* entity, EntityBehaviour behaviour);
-
-void entity_context_set(Entity* entity, void* context);
-
 Vector entity_pos_get(Entity* entity);
 
 void entity_pos_set(Entity* entity, Vector position);
 
-void entity_pos_add(Entity* entity, Vector delta);
-
 void* entity_context_get(Entity* entity);
 
 #ifdef __cplusplus

+ 1 - 1
entity_i.h

@@ -6,7 +6,7 @@
 extern "C" {
 #endif
 
-Entity* entity_alloc(void);
+Entity* entity_alloc(const EntityBehaviour* behaviour);
 
 void entity_free(Entity* entity);
 

+ 2 - 2
level.c

@@ -85,8 +85,8 @@ void level_behaviour_set(Level* level, LevelBehaviour behaviour, void* context)
     level->context = context;
 }
 
-Entity* level_add_entity(Level* level) {
-    Entity* entity = entity_alloc();
+Entity* level_add_entity(Level* level, const EntityBehaviour* behaviour) {
+    Entity* entity = entity_alloc(behaviour);
     EntityList_push_back(level->entities_to_add, entity);
     return entity;
 }

+ 1 - 1
level.h

@@ -21,7 +21,7 @@ typedef struct {
 
 void level_behaviour_set(Level* level, LevelBehaviour behaviour, void* context);
 
-Entity* level_add_entity(Level* level);
+Entity* level_add_entity(Level* level, const EntityBehaviour* behaviour);
 
 void level_remove_entity(Level* level, Entity* entity);