Browse Source

Get building (but not running) in llvm

Nathaniel van Diepen 3 years ago
parent
commit
ba979b071f
10 changed files with 108 additions and 100 deletions
  1. 1 0
      src/lib/object.c
  2. 11 10
      src/lib/object.h
  3. 4 3
      src/lib/scene.c
  4. 9 11
      src/lib/scene.h
  5. 5 4
      src/lib/sprite.h
  6. 10 9
      src/lib/vector.c
  7. 10 16
      src/lib/vector.h
  8. 1 1
      src/main.c
  9. 51 42
      src/objects/player.c
  10. 6 4
      src/objects/player.h

+ 1 - 0
src/lib/object.c

@@ -1,6 +1,7 @@
 #include "object.h"
 #include "scene.h"
 #include <debug.h>
+#include <stdlib.h>
 
 #define Object_log(msg) dbg_sprintf(dbgout, "[Object %d] %s\n", self->id, msg)
 

+ 11 - 10
src/lib/object.h

@@ -8,9 +8,10 @@ typedef struct Scale {
     int x;
     int y;
 } Scale;
-typedef void (*Object_func)(struct Object*);
-typedef int (*Object_func_int)(struct Object*);
-typedef struct Object {
+
+typedef struct Object Object;
+
+struct Object {
     int id;
     int x;
     int y;
@@ -18,13 +19,13 @@ typedef struct Object {
     Sprite* sprite;
     struct Scene* scene;
 
-    Object_func_int height;
-    Object_func_int width;
-    Object_func draw;
-    Object_func update;
-    Object_func load;
-    Object_func free;
-} Object;
+    int (*height)(Object*);
+    int (*width)(Object*);
+    void (*draw)(Object*);
+    void (*update)(Object*);
+    void (*load)(Object*);
+    void (*free)(Object*);
+};
 
 void Object_draw(Object* self);
 void free_Object(Object* self);

+ 4 - 3
src/lib/scene.c

@@ -2,6 +2,7 @@
 #include "scene.h"
 #include <debug.h>
 #include <keypadc.h>
+#include <stdlib.h>
 
 #define Scene_log(msg) dbg_sprintf(dbgout, "[Scene %s] %s\n", self->name, msg)
 
@@ -64,7 +65,7 @@ void free_Scene(struct Scene* self){
     current_scene = NULL;
 }
 
-Scene* new_Scene(const char* name){
+Scene* new_Scene(char* name){
     Scene* self = (Scene*)malloc(sizeof(Scene));
     if(current_scene != NULL){
         free_Scene(current_scene);
@@ -72,8 +73,8 @@ Scene* new_Scene(const char* name){
     current_scene = self;
     self->name = name;
     Scene_log("Creating scene");
-    self->objects = new_Vector(0, sizeof(Object), &free_Object);
-    self->sprites = new_Vector(0, sizeof(Sprite), &free_Sprite);
+    self->objects = new_Vector(0, sizeof(Object), (vc_vector_deleter*)&free_Object);
+    self->sprites = new_Vector(0, sizeof(Sprite), (vc_vector_deleter*)&free_Sprite);
     self->add_object = &Scene_add_object;
     self->add_sprite = &Scene_add_sprite;
     self->update = &Scene_update;

+ 9 - 11
src/lib/scene.h

@@ -5,23 +5,21 @@
 #include "sprite.h"
 #include "object.h"
 
-typedef void (*Scene_func)(struct Scene*);
-typedef bool (*Scene_func_add_object)(struct Scene*, struct Object*);
-typedef bool (*Scene_func_add_sprite)(struct Scene*, struct Sprite*);
-typedef struct Scene {
+typedef struct Scene Scene;
+struct Scene {
     char* name;
     Vector* objects;
     Vector* sprites;
 
-    Scene_func_add_object add_object;
-    Scene_func_add_sprite add_sprite;
-    Scene_func update;
-    Scene_func draw;
-    Scene_func load;
-} Scene;
+    bool (*add_object)(Scene*, Object*);
+    bool (*add_sprite)(Scene*, Sprite*);
+    void (*update)(Scene*);
+    void (*draw)(Scene*);
+    void (*load)(Scene*);
+};
 
 void free_Scene(struct Scene* self);
-Scene* new_Scene(const char* name);
+Scene* new_Scene(char* name);
 Scene* current_Scene();
 
 #endif

+ 5 - 4
src/lib/sprite.h

@@ -3,14 +3,15 @@
 
 #include <graphx.h>
 
-typedef void (*Sprite_func_resize)(struct Sprite*, int, int);
-typedef struct Sprite {
+typedef struct Sprite Sprite;
+
+struct Sprite {
     int width;
     int height;
     gfx_sprite_t* data;
 
-    Sprite_func_resize resize;
-} Sprite;
+    void (*resize)(Sprite*, int, int);
+};
 
 void free_Sprite(Sprite* self);
 Sprite* new_Sprite(int width, int height, void* compressed_data);

+ 10 - 9
src/lib/vector.c

@@ -1,23 +1,24 @@
 #include "vector.h"
 #include <debug.h>
+#include <stdlib.h>
 
 #define Vector_log(msg) dbg_sprintf(dbgout, "[Vector] %s\n", msg)
 
 
-bool Vector_consume(struct Vector* self, const void* value){
+bool Vector_consume(Vector* self, const void* value){
     bool success = vc_vector_push_back(self->_vector, value);
-    free(value);
+    free((void*)value);
     if(!success){
         Vector_log("Faield to consume value");
     }
     return success;
 }
 
-bool Vector_push(struct Vector* self, const void* value){
+bool Vector_push(Vector* self, const void* value){
     return vc_vector_push_back(self->_vector, value);
 }
 
-void* Vector_pop(struct Vector* self){
+void* Vector_pop(Vector* self){
     void* item = vc_vector_end(self->_vector);
     if(vc_vector_pop_back(self->_vector)){
         return NULL;
@@ -25,19 +26,19 @@ void* Vector_pop(struct Vector* self){
     return item;
 }
 
-bool Vector_replace(struct Vector* self, size_t i, const void* value){
+bool Vector_replace(Vector* self, size_t i, const void* value){
     return vc_vector_replace(self->_vector, i, value);
 }
 
-void Vector_clear(struct Vector* self){
+void Vector_clear(Vector* self){
     vc_vector_clear(self->_vector);
 }
 
-size_t Vector_count(struct Vector* self){
+size_t Vector_count(Vector* self){
     return self->_vector->count;
 }
 
-void free_Vector(struct Vector* self){
+void free_Vector(Vector* self){
     Vector_log("Freeing vc_vector");
     self->clear(self);
     free(self->_vector);
@@ -67,6 +68,6 @@ Vector* new_VectorFromVC(vc_vector* vector){
     return self;
 }
 
-Vector* copy_Vector(struct Vector* vector){
+Vector* copy_Vector(Vector* vector){
     return new_VectorFromVC(vc_vector_create_copy(vector->_vector));
 }

+ 10 - 16
src/lib/vector.h

@@ -3,24 +3,18 @@
 
 #include "vc_vector.h"
 
-typedef bool (*Vector_func_push)(struct Vector*, const void*);
-typedef bool (*Vector_func_replace)(struct Vector*, size_t, const void*);
-typedef void* (*Vector_func_pop)(struct Vector*);
-typedef void (*Vector_func)(struct Vector*);
-typedef size_t (*Vector_func_count)(struct Vector*);
-typedef void* (*Vector_func_get)(struct Vector*, size_t i);
+typedef struct Vector Vector;
 
-typedef struct Vector {
+struct Vector {
     vc_vector* _vector;
-
-    Vector_func_push consume;
-    Vector_func_push push;
-    Vector_func_pop pop;
-    Vector_func_replace replace;
-    Vector_func clear;
-    Vector_func_count count;
-    Vector_func_get get;
-} Vector;
+    bool (*consume)(Vector*, const void*);
+    bool (*push)(Vector*, const void*);
+    void* (*pop)(Vector*);
+    bool (*replace)(Vector*, size_t, const void*);
+    void (*clear)(Vector*);
+    size_t (*count)(Vector*);
+    void* (*get)(Vector*, size_t);
+};
 
 void free_Vector(struct Vector* self);
 Vector* new_Vector(int size, size_t obj_size, vc_vector_deleter* deleter);

+ 1 - 1
src/main.c

@@ -10,7 +10,7 @@ int main(void){
     size_t i;
     Scene* scene = new_Scene("Main");
     Sprite* sprite;
-    Object* player = new_Player();
+    Object* player = (Object*)new_Player();
     Vector* objects = scene->objects;
     Vector* sprites = scene->sprites;
     if(!sprites->consume(sprites, new_Sprite(bm1_width, bm1_height, bm1_compressed)) ||

+ 51 - 42
src/objects/player.c

@@ -1,15 +1,18 @@
 #include <keypadc.h>
 #include "../main.h"
+#include "player.h"
+#include <stdlib.h>
 
 #define Player_log(msg) dbg_sprintf(dbgout, "[Object(Player) %d] %s\n", self->id, msg)
 
-void Player_update(Player* self){
-    Scene* scene = self->scene;
+void Player_update(Object* base){
+    Player* self = (Player*)base;
+    Scene* scene = base->scene;
     Vector* sprites = scene->sprites;
     Sprite* sprite;
     kb_key_t arrows = kb_Data[7];
-    int x = self->x;
-    int y = self->y;
+    int x = base->x;
+    int y = base->y;
     int speed;
     #ifdef LOG_UPDATE
     Player_log("Drawing player");
@@ -20,77 +23,83 @@ void Player_update(Player* self){
         speed = WALK_SPEED;
     }
     if(arrows & kb_Down){
-        if(self->y < MAX_HEIGHT){
-            self->y += speed;
+        if(base->y < MAX_HEIGHT){
+            base->y += speed;
             sprite = sprites->get(sprites, 2);
-            if(sprite != self->sprite){
-                self->sprite = sprite;
+            if(sprite != base->sprite){
+                base->sprite = sprite;
             }else{
-                self->sprite = sprites->get(sprites, 4);
+                base->sprite = sprites->get(sprites, 4);
             }
         }
     }else if(arrows & kb_Up){
-        if(self->y > 0){
-            self->y -= speed;
+        if(base->y > 0){
+            base->y -= speed;
             sprite = sprites->get(sprites, 18);
-            if(sprite != self->sprite){
-                self->sprite = sprite;
+            if(sprite != base->sprite){
+                base->sprite = sprite;
             }else{
-                self->sprite = sprites->get(sprites, 20);
+                base->sprite = sprites->get(sprites, 20);
             }
         }
     }
     if(arrows & kb_Right){
-        if(self->x < MAX_WIDTH){
-            self->x += speed;
+        if(base->x < MAX_WIDTH){
+            base->x += speed;
             sprite = sprites->get(sprites, 10);
-            if(sprite != self->sprite){
-                self->sprite = sprite;
+            if(sprite != base->sprite){
+                base->sprite = sprite;
             }else{
-                self->sprite = sprites->get(sprites, 12);
+                base->sprite = sprites->get(sprites, 12);
             }
         }
     }else if(arrows & kb_Left){
-        if(self->x > 0){
-            self->x -= speed;
+        if(base->x > 0){
+            base->x -= speed;
             sprite = sprites->get(sprites, 6);
-            if(sprite != self->sprite){
-                self->sprite = sprite;
+            if(sprite != base->sprite){
+                base->sprite = sprite;
             }else{
-                self->sprite = sprites->get(sprites, 8);
+                base->sprite = sprites->get(sprites, 8);
             }
         }
     }
-    if(self->x < 0){
-        self->x = 0;
-    }else if(self->x >= MAX_WIDTH){
-        self->x = MAX_WIDTH;
+    if(base->x < 0){
+        base->x = 0;
+    }else if(base->x >= MAX_WIDTH){
+        base->x = MAX_WIDTH;
     }
-    if(self->y < 0){
-        self->y = 0;
-    }else if(self->y >= MAX_HEIGHT){
-        self->y = MAX_HEIGHT;
+    if(base->y < 0){
+        base->y = 0;
+    }else if(base->y >= MAX_HEIGHT){
+        base->y = MAX_HEIGHT;
     }
-    if(x == self->x && y == self->y){
-        self->sprite = sprites->get(sprites, 0);
+    if(x == base->x && y == base->y){
+        base->sprite = sprites->get(sprites, 0);
     }
 }
 
-void Player_load(Player* self){
+void Player_load(Object* base){
     Player_log("Loading player");
+    Player* self = (Player*)base;
 }
 
-void Player_free(Player* self){
+void Player_free(Object* base){
+    Player* self = (Player*)base;
     Player_log("Freeing player");
     free(self->sprites);
-    free_Object(self);
+    base->free = NULL;
+    free_Object((Object*)self);
+    free(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;
+    Player* self = (Player*)malloc(sizeof(Player));
+    Object* base = new_Object(0,0);
+    self->base = *base;
+    self->sprites = new_Vector(0, sizeof(Sprite), (vc_vector_deleter*)&free_Sprite);
+    base->update = &Player_update;
+    base->free = &Player_free;
+    base->load = &Player_load;
     return self;
 }

+ 6 - 4
src/objects/player.h

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