Browse Source

add health and power sprites, unfinished.

Thomas B 2 months ago
parent
commit
f74a9a643f
6 changed files with 80 additions and 32 deletions
  1. BIN
      data/health.png
  2. BIN
      data/power.png
  3. 26
    12
      src/main.c
  4. 8
    2
      src/obj.c
  5. 43
    17
      src/sprites.c
  6. 3
    1
      src/sprites.h

BIN
data/health.png View File


BIN
data/power.png View File


+ 26
- 12
src/main.c View File

@@ -30,7 +30,6 @@
30 30
 #include "sprites.h"
31 31
 #include "sound.h"
32 32
 
33
-// The metasprite will be built starting with hardware sprite zero (the first)
34 33
 #define SPR_NUM_START 0
35 34
 
36 35
 static uint8_t joyp = 0;
@@ -53,19 +52,27 @@ enum ACCELERATION {
53 52
 static void splash(void) {
54 53
     disable_interrupts();
55 54
     DISPLAY_OFF;
56
-
57
-    set_default_palette();
58 55
     map_title();
59
-
60 56
     SHOW_BKG;
57
+    SHOW_SPRITES;
58
+    SPRITES_8x8;
61 59
     DISPLAY_ON;
62 60
     enable_interrupts();
63 61
 
62
+    obj_init();
63
+    obj_add(SPR_LIGHT, 42, -42, 0, 0);
64
+    obj_add(SPR_DARK, -42, -42, 0, 0);
65
+
64 66
     while(1) {
65 67
         KEY_INPUT;
66 68
         if (KEY_DOWN(0xFF)) {
67 69
             break;
68 70
         }
71
+
72
+        uint8_t hiwater = SPR_NUM_START;
73
+        obj_draw(0, 0, &hiwater);
74
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
75
+
69 76
         vsync();
70 77
     }
71 78
 }
@@ -73,16 +80,8 @@ static void splash(void) {
73 80
 static void game(void) {
74 81
     disable_interrupts();
75 82
     DISPLAY_OFF;
76
-
77
-    set_default_palette();
78 83
     map_game();
79
-
80 84
     SHOW_BKG;
81
-
82
-    spr_init();
83
-    obj_init();
84
-    snd_init();
85
-
86 85
     SHOW_SPRITES;
87 86
     SPRITES_8x8;
88 87
     DISPLAY_ON;
@@ -96,6 +95,8 @@ static void game(void) {
96 95
     enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
97 96
     uint8_t ship_hiwater = 0;
98 97
 
98
+    obj_init();
99
+
99 100
     // TODO remove
100 101
     obj_add(SPR_LIGHT, 64, 64, 0, 0);
101 102
     obj_add(SPR_DARK, -64, -64, 0, 0);
@@ -187,6 +188,16 @@ static void game(void) {
187 188
         }
188 189
 
189 190
         obj_draw(SpdX, SpdY, &hiwater);
191
+
192
+        spr_draw(SPR_HEALTH, FLIP_NONE, -80 + 8, -32, &hiwater);
193
+        spr_draw(SPR_HEALTH, FLIP_NONE, -80 + 8, -24, &hiwater);
194
+        spr_draw(SPR_HEALTH, FLIP_NONE, -80 + 8, -16, &hiwater);
195
+        spr_draw(SPR_HEALTH, FLIP_NONE, -80 + 8, -8, &hiwater);
196
+        spr_draw(SPR_POWER, FLIP_NONE, -80 + 8, 32, &hiwater);
197
+        spr_draw(SPR_POWER, FLIP_NONE, -80 + 8, 24, &hiwater);
198
+        spr_draw(SPR_POWER, FLIP_NONE, -80 + 8, 16, &hiwater);
199
+        spr_draw(SPR_POWER, FLIP_NONE, -80 + 8, 8, &hiwater);
200
+
190 201
         hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
191 202
 
192 203
         prev_acc = acc;
@@ -196,6 +207,9 @@ static void game(void) {
196 207
 }
197 208
 
198 209
 void main(void) {
210
+    spr_init();
211
+    snd_init();
212
+
199 213
 #ifndef DEBUG
200 214
     splash();
201 215
 #endif // DEBUG

+ 8
- 2
src/obj.c View File

@@ -73,12 +73,18 @@ void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater) {
73 73
             continue;
74 74
         }
75 75
 
76
-        spr_draw(objs[i].sprite, hiwater, FLIP_NONE, objs[i].off_x >> 4, objs[i].off_y >> 4);
76
+        spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> 4, objs[i].off_y >> 4, hiwater);
77 77
 
78
+        // move objects by their speed and compensate for movement of the background / ship
78 79
         objs[i].off_x += objs[i].spd_x - spd_x;
79 80
         objs[i].off_y += objs[i].spd_y - spd_y;
80 81
 
81
-        objs[i].travel += 1;
82
+        // only update travel time if we're actually moving
83
+        if ((objs[i].spd_x != 0) || (objs[i].spd_y != 0)) {
84
+            objs[i].travel += 1;
85
+        }
86
+
87
+        // remove objects that have traveled for too long
82 88
         if (objs[i].travel >= MAX_TRAVEL) {
83 89
             objs[i].active = 0;
84 90
         }

+ 43
- 17
src/sprites.c View File

@@ -32,6 +32,8 @@
32 32
 #include "light.h"
33 33
 #include "dark.h"
34 34
 #include "shoot.h"
35
+#include "health.h"
36
+#include "power.h"
35 37
 
36 38
 // Metasprite tiles are loaded into VRAM starting at tile number 0
37 39
 #define TILE_NUM_START 0
@@ -40,6 +42,7 @@ struct sprites {
40 42
     const metasprite_t * const * ms;
41 43
     const uint8_t * ti;
42 44
     const palette_color_t * pa;
45
+    uint8_t pa_i;
43 46
     uint8_t cnt;
44 47
     uint8_t off;
45 48
 };
@@ -49,64 +52,87 @@ static struct sprites metasprites[SPRITE_COUNT] = {
49 52
         .ms = rockshp_0_metasprites,
50 53
         .ti = rockshp_0_tiles,
51 54
         .pa = rockshp_0_palettes,
55
+        .pa_i = OAMF_CGB_PAL0,
52 56
         .cnt = rockshp_0_TILE_COUNT,
53 57
         .off = TILE_NUM_START
54 58
     }, {
55 59
         .ms = rockshp_90_metasprites,
56 60
         .ti = rockshp_90_tiles,
57
-        .pa = rockshp_90_palettes,
61
+        .pa = NULL,
62
+        .pa_i = OAMF_CGB_PAL0,
58 63
         .cnt = rockshp_90_TILE_COUNT,
59 64
         .off = TILE_NUM_START
60 65
     }, {
61 66
         .ms = thrust_0_metasprites,
62 67
         .ti = thrust_0_tiles,
63 68
         .pa = thrust_0_palettes,
69
+        .pa_i = OAMF_CGB_PAL1,
64 70
         .cnt = thrust_0_TILE_COUNT,
65 71
         .off = TILE_NUM_START
66 72
     }, {
67 73
         .ms = thrust_90_metasprites,
68 74
         .ti = thrust_90_tiles,
69
-        .pa = thrust_90_palettes,
75
+        .pa = NULL,
76
+        .pa_i = OAMF_CGB_PAL1,
70 77
         .cnt = thrust_90_TILE_COUNT,
71 78
         .off = TILE_NUM_START
72 79
     }, {
73 80
         .ms = light_metasprites,
74 81
         .ti = light_tiles,
75 82
         .pa = light_palettes,
83
+        .pa_i = OAMF_CGB_PAL2,
76 84
         .cnt = light_TILE_COUNT,
77 85
         .off = TILE_NUM_START
78 86
     }, {
79 87
         .ms = dark_metasprites,
80 88
         .ti = dark_tiles,
81 89
         .pa = dark_palettes,
90
+        .pa_i = OAMF_CGB_PAL3,
82 91
         .cnt = dark_TILE_COUNT,
83 92
         .off = TILE_NUM_START
84 93
     }, {
85 94
         .ms = shoot_metasprites,
86 95
         .ti = shoot_tiles,
87 96
         .pa = shoot_palettes,
97
+        .pa_i = OAMF_CGB_PAL4,
88 98
         .cnt = shoot_TILE_COUNT,
89 99
         .off = TILE_NUM_START
100
+    }, {
101
+        .ms = health_metasprites,
102
+        .ti = health_tiles,
103
+        .pa = health_palettes, // RGB8(239,  0,  0), RGB8(204,  0,  0), RGB8(167,  1,  0), RGB8(116,  0,  0)
104
+        .pa_i = OAMF_CGB_PAL5,
105
+        .cnt = health_TILE_COUNT,
106
+        .off = TILE_NUM_START
107
+    }, {
108
+        .ms = power_metasprites,
109
+        .ti = power_tiles,
110
+        .pa = power_palettes, // RGB8(  0,236,  0), RGB8(  2,193,  1), RGB8(  5,152,  0), RGB8(  3, 98,  0)
111
+        .pa_i = OAMF_CGB_PAL6,
112
+        .cnt = power_TILE_COUNT,
113
+        .off = TILE_NUM_START
90 114
     }
91 115
 };
92 116
 
93 117
 void spr_init(void) {
94 118
     uint8_t off = TILE_NUM_START;
95
-    for (int i = 0; i < (sizeof(metasprites) / sizeof(metasprites[0])); i++) {
119
+    for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
96 120
         metasprites[i].off = off;
97 121
         off += metasprites[i].cnt;
98 122
 
99
-        set_sprite_palette(OAMF_CGB_PAL0 + i, 1, metasprites[i].pa);
123
+        if (metasprites[i].pa != NULL) {
124
+            set_sprite_palette(metasprites[i].pa_i, 1, metasprites[i].pa);
125
+        }
100 126
         set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
101 127
     }
102 128
 }
103 129
 
104
-void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off) {
130
+void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t *hiwater) {
105 131
     switch (flip) {
106 132
         case FLIP_Y:
107 133
             *hiwater += move_metasprite_flipy(
108 134
                     metasprites[sprite].ms[0], metasprites[sprite].off,
109
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
135
+                    metasprites[sprite].pa_i, *hiwater,
110 136
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
111 137
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
112 138
             break;
@@ -114,7 +140,7 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
114 140
         case FLIP_XY:
115 141
             *hiwater += move_metasprite_flipxy(
116 142
                     metasprites[sprite].ms[0], metasprites[sprite].off,
117
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
143
+                    metasprites[sprite].pa_i, *hiwater,
118 144
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
119 145
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
120 146
             break;
@@ -122,7 +148,7 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
122 148
         case FLIP_X:
123 149
             *hiwater += move_metasprite_flipx(
124 150
                     metasprites[sprite].ms[0], metasprites[sprite].off,
125
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
151
+                    metasprites[sprite].pa_i, *hiwater,
126 152
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
127 153
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
128 154
             break;
@@ -131,7 +157,7 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
131 157
         default:
132 158
             *hiwater += move_metasprite_ex(
133 159
                     metasprites[sprite].ms[0], metasprites[sprite].off,
134
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
160
+                    metasprites[sprite].pa_i, *hiwater,
135 161
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
136 162
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
137 163
             break;
@@ -141,30 +167,30 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
141 167
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
142 168
     switch (rot) {
143 169
         case ROT_0:
144
-            spr_draw(SPR_SHIP_0, hiwater, FLIP_NONE, 0, 0);
170
+            spr_draw(SPR_SHIP_0, FLIP_NONE, 0, 0, hiwater);
145 171
             if (moving) {
146
-                spr_draw(SPR_THRUST_0, hiwater, FLIP_NONE, 0, SHIP_OFF);
172
+                spr_draw(SPR_THRUST_0, FLIP_NONE, 0, SHIP_OFF, hiwater);
147 173
             }
148 174
             break;
149 175
 
150 176
         case ROT_90:
151
-            spr_draw(SPR_SHIP_90, hiwater, FLIP_NONE, 0, 0);
177
+            spr_draw(SPR_SHIP_90, FLIP_NONE, 0, 0, hiwater);
152 178
             if (moving) {
153
-                spr_draw(SPR_THRUST_90, hiwater, FLIP_NONE, -SHIP_OFF, 0);
179
+                spr_draw(SPR_THRUST_90, FLIP_NONE, -SHIP_OFF, 0, hiwater);
154 180
             }
155 181
             break;
156 182
 
157 183
         case ROT_180:
158
-            spr_draw(SPR_SHIP_0, hiwater, FLIP_Y, 0, 0);
184
+            spr_draw(SPR_SHIP_0, FLIP_Y, 0, 0, hiwater);
159 185
             if (moving) {
160
-                spr_draw(SPR_THRUST_0, hiwater, FLIP_Y, 0, -SHIP_OFF);
186
+                spr_draw(SPR_THRUST_0, FLIP_Y, 0, -SHIP_OFF, hiwater);
161 187
             }
162 188
             break;
163 189
 
164 190
         case ROT_270:
165
-            spr_draw(SPR_SHIP_90, hiwater, FLIP_X, 0, 0);
191
+            spr_draw(SPR_SHIP_90, FLIP_X, 0, 0, hiwater);
166 192
             if (moving) {
167
-                spr_draw(SPR_THRUST_90, hiwater, FLIP_X, SHIP_OFF, 0);
193
+                spr_draw(SPR_THRUST_90, FLIP_X, SHIP_OFF, 0, hiwater);
168 194
             }
169 195
             break;
170 196
 

+ 3
- 1
src/sprites.h View File

@@ -32,6 +32,8 @@ enum SPRITES {
32 32
     SPR_LIGHT,
33 33
     SPR_DARK,
34 34
     SPR_SHOT,
35
+    SPR_HEALTH,
36
+    SPR_POWER,
35 37
 
36 38
     SPRITE_COUNT
37 39
 };
@@ -53,7 +55,7 @@ enum SPRITE_ROT {
53 55
 };
54 56
 
55 57
 void spr_init(void);
56
-void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off);
58
+void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t *hiwater);
57 59
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
58 60
 
59 61
 #endif // __SPRITES_H__

Loading…
Cancel
Save