Browse Source

Add sprite resizing

Nathaniel van Diepen 3 years ago
parent
commit
3a494d25c0
5 changed files with 68 additions and 17 deletions
  1. 17 3
      src/lib/object.c
  2. 3 0
      src/lib/object.h
  3. 9 2
      src/lib/sprite.c
  4. 3 1
      src/lib/sprite.h
  5. 36 11
      src/main.c

+ 17 - 3
src/lib/object.c

@@ -6,9 +6,21 @@
 void Object_update(Object* self){}
 
 void Object_draw(Object* self){
-    gfx_ScaledSprite_NoClip(
-        self->sprite->data, self->x, self->y,
-        self->scale.x, self->scale.y);
+    if(self->scale.x + self->scale.y != 0){
+        gfx_ScaledSprite_NoClip(
+            self->sprite->data, self->x, self->y,
+            self->scale.x, self->scale.y);
+    }else{
+        gfx_Sprite_NoClip(self->sprite->data, self->x, self->y);
+    }
+}
+
+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 free_Object(Object* self){
@@ -24,5 +36,7 @@ Object* new_Object(int x, int y){
     self->scale.x = self->scale.y = 1;
     self->update = &Object_update;
     self->draw = &Object_draw;
+    self->width = &Object_width;
+    self->height = &Object_height;
     return self;
 }

+ 3 - 0
src/lib/object.h

@@ -9,6 +9,7 @@ typedef struct Scale {
     int y;
 } Scale;
 typedef void (*Object_func)(struct Object*);
+typedef int (*Object_func_int)(struct Object*);
 typedef struct Object {
     int x;
     int y;
@@ -17,6 +18,8 @@ typedef struct Object {
 
     Object_func draw;
     Object_func update;
+    Object_func_int height;
+    Object_func_int width;
 } Object;
 
 void free_Object(Object* self);

+ 9 - 2
src/lib/sprite.c

@@ -4,6 +4,13 @@
 
 #define Sprite_log(msg) dbg_sprintf(dbgout, "[Sprite] %s\n", msg)
 
+void Sprite_resize(struct Sprite* self, int width, int height){
+    gfx_sprite_t* resized_data = gfx_MallocSprite(width, height);
+    gfx_ScaleSprite(self->data, resized_data);
+    free(self->data);
+    self->data = resized_data;
+}
+
 void free_Sprite(Sprite* self){
     Sprite_log("Freeing sprite");
     free(self->data);
@@ -11,10 +18,10 @@ void free_Sprite(Sprite* self){
 }
 
 Sprite* new_Sprite(int width, int height, void* compressed_data){
-	gfx_sprite_t* data = gfx_MallocSprite(width, height);
+    gfx_sprite_t* data = gfx_MallocSprite(width, height);
     Sprite* self = (Sprite*)malloc(sizeof(Sprite));
     zx7_Decompress(data, compressed_data);
     self->data = data;
-
+    self->resize = &Sprite_resize;
     return self;
 }

+ 3 - 1
src/lib/sprite.h

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

+ 36 - 11
src/main.c

@@ -9,9 +9,11 @@
 #include "lib/sprite.h"
 #include "lib/object.h"
 
+int walk_speed = 1;
+int run_speed = 3;
 float scale = 3.0;
 int frameskip = 10;
-
+// #define RESIZE_SPRITES
 
 #define log(msg) dbg_sprintf(dbgout, "[TBP] %s\n", msg)
 
@@ -21,7 +23,9 @@ int main(void){
     int max_height = LCD_HEIGHT;
     int frame = 0;
     size_t i;
+    int speed;
     Object* object;
+    Sprite* sprite;
     Object* player = new_Object(0, 0);
     Vector* objects = new_Vector(1, sizeof(Object), &free_Object);
     Vector* sprites = new_Vector(22, sizeof(Sprite), &free_Sprite);
@@ -66,13 +70,20 @@ int main(void){
     player->sprite = sprites->get(sprites, 0);
     log("Get max sizes");
 
-    max_width -= player->sprite->data->width * scale;
-    max_height -= player->sprite->data->height * scale;
-    log("Set scale");
-
+    #ifdef RESIZE_SPRITES
+    log("Resizing sprites");
+    dbg_sprintf(dbgout, "[Player] %d x %d\n", player->sprite->data->width, player->sprite->data->height);
+    for(i = 0; i < sprites->count(sprites); i++){
+        sprite = sprites->get(sprites, i);
+        sprite->resize(sprite, sprite->data->width * scale, sprite->data->height * scale);
+    }
+    dbg_sprintf(dbgout, "[Player] %d x %d\n", player->sprite->data->width, player->sprite->data->height);
+    #else
     player->scale.x = scale;
     player->scale.y = scale;
-
+    max_width -= player->width(player);
+    max_height -= player->height(player);
+    #endif
 
     log("Start graphics");
     gfx_Begin();
@@ -83,11 +94,15 @@ int main(void){
     do{
         player->sprite = sprites->get(sprites, 0);
         kb_Scan();
+        if(kb_Data[2] & kb_Alpha){
+            speed = run_speed;
+        }else{
+            speed = walk_speed;
+        }
         arrows = kb_Data[7];
-
         if(arrows & kb_Down){
             if(player->y < max_height){
-                player->y++;
+                player->y += speed;
                 if(frame > 2){
                     player->sprite = sprites->get(sprites, 2);
                 }else{
@@ -96,7 +111,7 @@ int main(void){
             }
         }else if(arrows & kb_Up){
             if(player->y > 0){
-                player->y--;
+                player->y -= speed;
                 if(frame > 2){
                     player->sprite = sprites->get(sprites, 18);
                 }else{
@@ -106,7 +121,7 @@ int main(void){
         }
         if(arrows & kb_Right){
             if(player->x < max_width){
-                player->x++;
+                player->x += speed;
                 if(frame > 2){
                     player->sprite = sprites->get(sprites, 10);
                 }else{
@@ -115,7 +130,7 @@ int main(void){
             }
         }else if(arrows & kb_Left){
             if(player->x > 0){
-                player->x--;
+                player->x -= speed;
                 if(frame > 2){
                     player->sprite = sprites->get(sprites, 6);
                 }else{
@@ -123,6 +138,16 @@ int main(void){
                 }
             }
         }
+        if(player->x < 0){
+            player->x = 0;
+        }else if(player->x >= max_width){
+            player->x = max_width;
+        }
+        if(player->y < 0){
+            player->y = 0;
+        }else if(player->y >= max_height){
+            player->y = max_height;
+        }
         gfx_FillScreen(0);
         for(i = 0; i < objects->count(objects); i++){
             object = objects->get(objects, i);