Browse Source

Make objects extensable

Nathaniel van Diepen 3 years ago
parent
commit
5818df4c7f
7 changed files with 66 additions and 18 deletions
  1. 23 10
      src/lib/object.c
  2. 5 2
      src/lib/object.h
  3. 12 0
      src/lib/scene.c
  4. 3 2
      src/lib/scene.h
  5. 1 0
      src/main.c
  6. 17 4
      src/objects/player.c
  7. 5 0
      src/objects/player.h

+ 23 - 10
src/lib/object.c

@@ -1,10 +1,19 @@
 #include "object.h"
+#include "scene.h"
 #include <debug.h>
 
 #define Object_log(msg) dbg_sprintf(dbgout, "[Object %d] %s\n", self->id, msg)
 
 static int id_counter;
 
+int Object_width(Object* self){
+    return self->sprite->data->width * self->scale.x;
+}
+
+int Object_height(Object* self){
+    return self->sprite->data->height * self->scale.y;
+}
+
 void Object_update(Object* self){
     #ifdef LOG_UPDATE
     Object_log("Updating object");
@@ -24,18 +33,20 @@ void Object_draw(Object* self){
     }
 }
 
-int Object_width(Object* self){
-    return self->sprite->data->width * self->scale.x;
+void Object_free(Object* self){
+    Object_log("Freeing object");
+    free_Sprite(self->sprite);
+    free(self);
 }
 
-int Object_height(Object* self){
-    return self->sprite->data->height * self->scale.y;
-}
+void Object_load(Object* self){}
 
 void free_Object(Object* self){
-    Object_log("Freeing object");
-    free_Sprite(self->sprite);
-    free(self);
+    if(self->free != NULL){
+        self->free(self);
+    }else{
+        Object_free(self);
+    }
 }
 
 Object* new_Object(int x, int y){
@@ -45,9 +56,11 @@ Object* new_Object(int x, int y){
     self->x = x;
     self->y = y;
     self->scale.x = self->scale.y = 1;
-    self->update = &Object_update;
-    self->draw = &Object_draw;
     self->width = &Object_width;
     self->height = &Object_height;
+    self->update = &Object_update;
+    self->draw = &Object_draw;
+    self->load = &Object_load;
+    self->free = &Object_free;
     return self;
 }

+ 5 - 2
src/lib/object.h

@@ -16,11 +16,14 @@ typedef struct Object {
     int y;
     Scale scale;
     Sprite* sprite;
+    struct Scene* scene;
 
-    Object_func draw;
-    Object_func update;
     Object_func_int height;
     Object_func_int width;
+    Object_func draw;
+    Object_func update;
+    Object_func load;
+    Object_func free;
 } Object;
 
 void Object_draw(Object* self);

+ 12 - 0
src/lib/scene.c

@@ -44,6 +44,17 @@ void Scene_draw(Scene* self){
     gfx_BlitBuffer();
 }
 
+void Scene_load(Scene* self){
+    int i;
+    Object* object;
+    Vector* objects = self->objects;
+    for(i = 0; i < objects->count(objects); i++){
+        object = objects->get(objects, i);
+        object->scene = self;
+        object->load(object);
+    }
+}
+
 void free_Scene(struct Scene* self){
     Scene_log("Freeing scene");
     free(self->objects);
@@ -67,6 +78,7 @@ Scene* new_Scene(const char* name){
     self->add_sprite = &Scene_add_sprite;
     self->update = &Scene_update;
     self->draw = &Scene_draw;
+    self->load = &Scene_load;
     return self;
 }
 

+ 3 - 2
src/lib/scene.h

@@ -6,8 +6,8 @@
 #include "object.h"
 
 typedef void (*Scene_func)(struct Scene*);
-typedef bool (*Scene_func_add_object)(struct Scene*, Object*);
-typedef bool (*Scene_func_add_sprite)(struct Scene*, Sprite*);
+typedef bool (*Scene_func_add_object)(struct Scene*, struct Object*);
+typedef bool (*Scene_func_add_sprite)(struct Scene*, struct Sprite*);
 typedef struct Scene {
     char* name;
     Vector* objects;
@@ -17,6 +17,7 @@ typedef struct Scene {
     Scene_func_add_sprite add_sprite;
     Scene_func update;
     Scene_func draw;
+    Scene_func load;
 } Scene;
 
 void free_Scene(struct Scene* self);

+ 1 - 0
src/main.c

@@ -71,6 +71,7 @@ int main(void){
     gfx_SetDrawBuffer();
 
     log("Main loop");
+    scene->load(scene);
     do{
         scene->update(scene);
         kb_Scan();

+ 17 - 4
src/objects/player.c

@@ -3,8 +3,8 @@
 
 #define Player_log(msg) dbg_sprintf(dbgout, "[Object(Player) %d] %s\n", self->id, msg)
 
-void Player_update(Object* self){
-    Scene* scene = current_Scene();
+void Player_update(Player* self){
+    Scene* scene = self->scene;
     Vector* sprites = scene->sprites;
     Sprite* sprite;
     kb_key_t arrows = kb_Data[7];
@@ -76,8 +76,21 @@ void Player_update(Object* self){
     }
 }
 
-Object* new_Player(){
-    Object* self = new_Object(0,0);
+void Player_load(Player* self){
+    Player_log("Loading player");
+}
+
+void Player_free(Player* self){
+    Player_log("Freeing player");
+    free(self->sprites);
+    free_Object(self);
+}
+
+Player* new_Player(){
+    Player* self = new_Object(0,0);
+    Vector* self->sprites = new_Vector(0, sizeof(Sprite), &free_Sprite);
     self->update = &Player_update;
+    self->free = &Player_free;
+    self->load = &Player_load;
     return self;
 }

+ 5 - 0
src/objects/player.h

@@ -2,6 +2,11 @@
 #define PLAYER_H_
 #include "../lib/object.h"
 
+typedef struct Player {
+    struct Object;
+    Vector* sprites;
+} Player;
+
 Object* new_Player();
 
 #endif