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

+ 8
- 2
src/obj.c View File

73
             continue;
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
         objs[i].off_x += objs[i].spd_x - spd_x;
79
         objs[i].off_x += objs[i].spd_x - spd_x;
79
         objs[i].off_y += objs[i].spd_y - spd_y;
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
         if (objs[i].travel >= MAX_TRAVEL) {
88
         if (objs[i].travel >= MAX_TRAVEL) {
83
             objs[i].active = 0;
89
             objs[i].active = 0;
84
         }
90
         }

+ 43
- 17
src/sprites.c View File

32
 #include "light.h"
32
 #include "light.h"
33
 #include "dark.h"
33
 #include "dark.h"
34
 #include "shoot.h"
34
 #include "shoot.h"
35
+#include "health.h"
36
+#include "power.h"
35
 
37
 
36
 // Metasprite tiles are loaded into VRAM starting at tile number 0
38
 // Metasprite tiles are loaded into VRAM starting at tile number 0
37
 #define TILE_NUM_START 0
39
 #define TILE_NUM_START 0
40
     const metasprite_t * const * ms;
42
     const metasprite_t * const * ms;
41
     const uint8_t * ti;
43
     const uint8_t * ti;
42
     const palette_color_t * pa;
44
     const palette_color_t * pa;
45
+    uint8_t pa_i;
43
     uint8_t cnt;
46
     uint8_t cnt;
44
     uint8_t off;
47
     uint8_t off;
45
 };
48
 };
49
         .ms = rockshp_0_metasprites,
52
         .ms = rockshp_0_metasprites,
50
         .ti = rockshp_0_tiles,
53
         .ti = rockshp_0_tiles,
51
         .pa = rockshp_0_palettes,
54
         .pa = rockshp_0_palettes,
55
+        .pa_i = OAMF_CGB_PAL0,
52
         .cnt = rockshp_0_TILE_COUNT,
56
         .cnt = rockshp_0_TILE_COUNT,
53
         .off = TILE_NUM_START
57
         .off = TILE_NUM_START
54
     }, {
58
     }, {
55
         .ms = rockshp_90_metasprites,
59
         .ms = rockshp_90_metasprites,
56
         .ti = rockshp_90_tiles,
60
         .ti = rockshp_90_tiles,
57
-        .pa = rockshp_90_palettes,
61
+        .pa = NULL,
62
+        .pa_i = OAMF_CGB_PAL0,
58
         .cnt = rockshp_90_TILE_COUNT,
63
         .cnt = rockshp_90_TILE_COUNT,
59
         .off = TILE_NUM_START
64
         .off = TILE_NUM_START
60
     }, {
65
     }, {
61
         .ms = thrust_0_metasprites,
66
         .ms = thrust_0_metasprites,
62
         .ti = thrust_0_tiles,
67
         .ti = thrust_0_tiles,
63
         .pa = thrust_0_palettes,
68
         .pa = thrust_0_palettes,
69
+        .pa_i = OAMF_CGB_PAL1,
64
         .cnt = thrust_0_TILE_COUNT,
70
         .cnt = thrust_0_TILE_COUNT,
65
         .off = TILE_NUM_START
71
         .off = TILE_NUM_START
66
     }, {
72
     }, {
67
         .ms = thrust_90_metasprites,
73
         .ms = thrust_90_metasprites,
68
         .ti = thrust_90_tiles,
74
         .ti = thrust_90_tiles,
69
-        .pa = thrust_90_palettes,
75
+        .pa = NULL,
76
+        .pa_i = OAMF_CGB_PAL1,
70
         .cnt = thrust_90_TILE_COUNT,
77
         .cnt = thrust_90_TILE_COUNT,
71
         .off = TILE_NUM_START
78
         .off = TILE_NUM_START
72
     }, {
79
     }, {
73
         .ms = light_metasprites,
80
         .ms = light_metasprites,
74
         .ti = light_tiles,
81
         .ti = light_tiles,
75
         .pa = light_palettes,
82
         .pa = light_palettes,
83
+        .pa_i = OAMF_CGB_PAL2,
76
         .cnt = light_TILE_COUNT,
84
         .cnt = light_TILE_COUNT,
77
         .off = TILE_NUM_START
85
         .off = TILE_NUM_START
78
     }, {
86
     }, {
79
         .ms = dark_metasprites,
87
         .ms = dark_metasprites,
80
         .ti = dark_tiles,
88
         .ti = dark_tiles,
81
         .pa = dark_palettes,
89
         .pa = dark_palettes,
90
+        .pa_i = OAMF_CGB_PAL3,
82
         .cnt = dark_TILE_COUNT,
91
         .cnt = dark_TILE_COUNT,
83
         .off = TILE_NUM_START
92
         .off = TILE_NUM_START
84
     }, {
93
     }, {
85
         .ms = shoot_metasprites,
94
         .ms = shoot_metasprites,
86
         .ti = shoot_tiles,
95
         .ti = shoot_tiles,
87
         .pa = shoot_palettes,
96
         .pa = shoot_palettes,
97
+        .pa_i = OAMF_CGB_PAL4,
88
         .cnt = shoot_TILE_COUNT,
98
         .cnt = shoot_TILE_COUNT,
89
         .off = TILE_NUM_START
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
 void spr_init(void) {
117
 void spr_init(void) {
94
     uint8_t off = TILE_NUM_START;
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
         metasprites[i].off = off;
120
         metasprites[i].off = off;
97
         off += metasprites[i].cnt;
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
         set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
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
     switch (flip) {
131
     switch (flip) {
106
         case FLIP_Y:
132
         case FLIP_Y:
107
             *hiwater += move_metasprite_flipy(
133
             *hiwater += move_metasprite_flipy(
108
                     metasprites[sprite].ms[0], metasprites[sprite].off,
134
                     metasprites[sprite].ms[0], metasprites[sprite].off,
109
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
135
+                    metasprites[sprite].pa_i, *hiwater,
110
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
136
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
111
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
137
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
112
             break;
138
             break;
114
         case FLIP_XY:
140
         case FLIP_XY:
115
             *hiwater += move_metasprite_flipxy(
141
             *hiwater += move_metasprite_flipxy(
116
                     metasprites[sprite].ms[0], metasprites[sprite].off,
142
                     metasprites[sprite].ms[0], metasprites[sprite].off,
117
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
143
+                    metasprites[sprite].pa_i, *hiwater,
118
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
144
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
119
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
145
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
120
             break;
146
             break;
122
         case FLIP_X:
148
         case FLIP_X:
123
             *hiwater += move_metasprite_flipx(
149
             *hiwater += move_metasprite_flipx(
124
                     metasprites[sprite].ms[0], metasprites[sprite].off,
150
                     metasprites[sprite].ms[0], metasprites[sprite].off,
125
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
151
+                    metasprites[sprite].pa_i, *hiwater,
126
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
152
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
127
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
153
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
128
             break;
154
             break;
131
         default:
157
         default:
132
             *hiwater += move_metasprite_ex(
158
             *hiwater += move_metasprite_ex(
133
                     metasprites[sprite].ms[0], metasprites[sprite].off,
159
                     metasprites[sprite].ms[0], metasprites[sprite].off,
134
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
160
+                    metasprites[sprite].pa_i, *hiwater,
135
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
161
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
136
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
162
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
137
             break;
163
             break;
141
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
167
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
142
     switch (rot) {
168
     switch (rot) {
143
         case ROT_0:
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
             if (moving) {
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
             break;
174
             break;
149
 
175
 
150
         case ROT_90:
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
             if (moving) {
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
             break;
181
             break;
156
 
182
 
157
         case ROT_180:
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
             if (moving) {
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
             break;
188
             break;
163
 
189
 
164
         case ROT_270:
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
             if (moving) {
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
             break;
195
             break;
170
 
196
 

+ 3
- 1
src/sprites.h View File

32
     SPR_LIGHT,
32
     SPR_LIGHT,
33
     SPR_DARK,
33
     SPR_DARK,
34
     SPR_SHOT,
34
     SPR_SHOT,
35
+    SPR_HEALTH,
36
+    SPR_POWER,
35
 
37
 
36
     SPRITE_COUNT
38
     SPRITE_COUNT
37
 };
39
 };
53
 };
55
 };
54
 
56
 
55
 void spr_init(void);
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
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
59
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
58
 
60
 
59
 #endif // __SPRITES_H__
61
 #endif // __SPRITES_H__

Loading…
Cancel
Save