Browse Source

splash and ship with thruster

Thomas B 2 months ago
parent
commit
19b25aa854
7 changed files with 145 additions and 75 deletions
  1. 8
    3
      Makefile
  2. BIN
      data/dark.png
  3. BIN
      data/light.png
  4. BIN
      data/rockshp.png
  5. BIN
      data/thrustG.png
  6. BIN
      data/title_map.png
  7. 137
    72
      src/main.c

+ 8
- 3
Makefile View File

@@ -18,13 +18,14 @@ OBJS += $(SPRITES:%.c=%.o)
18 18
 
19 19
 LCC := $(GBDK_HOME)/bin/lcc
20 20
 PNGA := $(GBDK_HOME)/bin/png2asset
21
+ROMU := $(GBDK_HOME)/bin/romusage
21 22
 GB_EMU := gearboy
22 23
 
23 24
 LCCFLAGS := -Wa-l -Wl-m -Wm"-yn Duality" -I$(BUILD_DIR)/$(DATA_DIR) -Wm-yc
24 25
 EMUFLAGS := $(BIN)
25 26
 
26 27
 ifndef GBDK_RELEASE
27
-	LCCFLAGS += -debug -Wa-j -Wa-y -Wa-s -Wl-j -Wl-y -Wl-u -Wm-yS
28
+	LCCFLAGS += -debug -DDEBUG -Wa-j -Wa-y -Wa-s -Wl-j -Wl-y -Wl-u -Wm-yS
28 29
 	EMUFLAGS += $(BUILD_DIR)/$(BIN:.gb=.sym)
29 30
 	BUILD_TYPE = Debug
30 31
 else
@@ -33,7 +34,7 @@ endif
33 34
 
34 35
 $(info BUILD_TYPE is $(BUILD_TYPE))
35 36
 
36
-.PHONY: all run $(BIN) clean compile_commands.json
37
+.PHONY: all run $(BIN) clean compile_commands.json usage
37 38
 
38 39
 all: $(BIN)
39 40
 
@@ -46,6 +47,10 @@ compile_commands.json:
46 47
 	@bear --config bear.cfg -- make -j4
47 48
 	@rm -rf bear.cfg
48 49
 
50
+usage: $(BUILD_DIR)/$(BIN)
51
+	@echo Analyzing $<
52
+	@$(ROMU) $(BUILD_DIR)/$(BIN:%.gb=%.map)
53
+
49 54
 run: $(BIN)
50 55
 	@echo Emulating $<
51 56
 	@$(GB_EMU) $(EMUFLAGS)
@@ -80,7 +85,7 @@ $(BUILD_DIR)/$(BIN): $(OBJS)
80 85
 	@echo Linking $@
81 86
 	@$(LCC) $(LCCFLAGS) -o $@ $(OBJS)
82 87
 
83
-$(BIN): $(BUILD_DIR)/$(BIN)
88
+$(BIN): $(BUILD_DIR)/$(BIN) usage
84 89
 	@cp $< $@
85 90
 
86 91
 clean:

BIN
data/dark.png View File


BIN
data/light.png View File


BIN
data/rockshp.png View File


BIN
data/thrustG.png View File


BIN
data/title_map.png View File


+ 137
- 72
src/main.c View File

@@ -2,14 +2,18 @@
2 2
  * main.c
3 3
  * Duality
4 4
  *
5
- * Based on the metasprites and galaxy examples from gbdk-2020:
5
+ * Based on examples from gbdk-2020:
6 6
  * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
7 7
  * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/galaxy/galaxy.c
8
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/rand/rand.c
8 9
  */
9 10
 
10 11
 #include <gbdk/platform.h>
11 12
 #include <gbdk/metasprites.h>
13
+#include <rand.h>
14
+#include <stdint.h>
12 15
 
16
+#include "title_map.h"
13 17
 #include "bg_map.h"
14 18
 #include "rockshp.h"
15 19
 #include "thrustG.h"
@@ -30,14 +34,16 @@
30 34
 // Metasprite tiles are loaded into VRAM starting at tile number 0
31 35
 #define TILE_NUM_START 0
32 36
 
33
-int16_t PosX, PosY;
34
-int16_t SpdX, SpdY;
35
-uint8_t PosF;
36
-uint8_t idx, rot;
37
+static int16_t PosX = 0;
38
+static int16_t PosY = 0;
39
+static int16_t SpdX = 0;
40
+static int16_t SpdY = 0;
41
+static uint8_t PosF = 0;
37 42
 
38
-size_t num_tiles;
43
+static uint8_t rot = 0;
39 44
 
40
-uint8_t joyp = 0, old_joyp = 0;
45
+static uint8_t joyp = 0;
46
+static uint8_t old_joyp = 0;
41 47
 
42 48
 #define KEY_INPUT (old_joyp = joyp, joyp = joypad())
43 49
 #define KEY_DOWN(KEY) (joyp & (KEY))
@@ -51,7 +57,14 @@ struct sprites {
51 57
     uint8_t off;
52 58
 };
53 59
 
54
-struct sprites metasprites[] = {
60
+#define SPR_SHIP 0
61
+#define SPR_THRUST 1
62
+#define SPR_LIGHT 2
63
+#define SPR_DARK 3
64
+#define SPR_SHOT 4
65
+#define SPRITE_COUNT 5
66
+
67
+struct sprites metasprites[SPRITE_COUNT] = {
55 68
     {
56 69
         .ms = rockshp_metasprites,
57 70
         .ti = rockshp_tiles,
@@ -85,7 +98,88 @@ struct sprites metasprites[] = {
85 98
     }
86 99
 };
87 100
 
88
-void main(void) {
101
+static void draw(uint8_t sprite, uint8_t *hiwater, int8_t y_off) {
102
+    switch (rot & 0x3) {
103
+        case 1:
104
+            *hiwater += move_metasprite_flipy(
105
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
106
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
107
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
108
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
109
+            break;
110
+
111
+        case 2:
112
+            *hiwater += move_metasprite_flipxy(
113
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
114
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
115
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
116
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
117
+            break;
118
+
119
+        case 3:
120
+            *hiwater += move_metasprite_flipx(
121
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
122
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
123
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
124
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
125
+            break;
126
+
127
+        default:
128
+            *hiwater += move_metasprite_ex(
129
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
130
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
131
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
132
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
133
+            break;
134
+    }
135
+}
136
+
137
+static void ship(uint8_t *hiwater) {
138
+    switch (rot & 0x3) {
139
+        case 1:
140
+        case 2:
141
+            draw(SPR_SHIP, hiwater, 0);
142
+            if (PosF) {
143
+                draw(SPR_THRUST, hiwater, -8 - 4);
144
+            }
145
+            break;
146
+
147
+        case 3:
148
+        default:
149
+            draw(SPR_SHIP, hiwater, 0);
150
+            if (PosF) {
151
+                draw(SPR_THRUST, hiwater, 8 + 4);
152
+            }
153
+            break;
154
+    }
155
+}
156
+
157
+static void splash(void) {
158
+    disable_interrupts();
159
+    DISPLAY_OFF;
160
+
161
+    set_default_palette();
162
+
163
+    // title_map as background map
164
+    set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
165
+    set_bkg_data(0, bg_map_TILE_COUNT, title_map_tiles);
166
+    set_bkg_attributes(0, 0, title_map_MAP_ATTRIBUTES_WIDTH, title_map_MAP_ATTRIBUTES_HEIGHT, title_map_MAP_ATTRIBUTES);
167
+    set_bkg_tiles(0, 0, title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H, title_map_map);
168
+
169
+    SHOW_BKG;
170
+    DISPLAY_ON;
171
+    enable_interrupts();
172
+
173
+    while(1) {
174
+        KEY_INPUT;
175
+        if (KEY_DOWN(0xFF)) {
176
+            break;
177
+        }
178
+        vsync();
179
+    }
180
+}
181
+
182
+static void game(void) {
89 183
     disable_interrupts();
90 184
     DISPLAY_OFF;
91 185
 
@@ -113,17 +207,11 @@ void main(void) {
113 207
     DISPLAY_ON;
114 208
     enable_interrupts();
115 209
 
116
-    // Set initial position to the center of the screen, zero out speed
117
-    PosX = 0;//(DEVICE_SCREEN_PX_WIDTH / 2) << 4;
118
-    PosY = 0;//(DEVICE_SCREEN_PX_HEIGHT / 2) << 4;
119
-    SpdX = SpdY = 0;
120
-
121
-    idx = 0; rot = 0;
122
-
123 210
     while(1) {
124 211
         KEY_INPUT;
125 212
 
126 213
         PosF = 0;
214
+
127 215
         // Game object
128 216
         if (KEY_DOWN(J_UP)) {
129 217
             SpdY -= 2;
@@ -145,67 +233,16 @@ void main(void) {
145 233
             PosF |= ACC_X;
146 234
         }
147 235
 
148
-        // Press B button to cycle through metasprite animations
149
-        if (KEY_PRESSED(J_B)) {
150
-            idx++;
151
-            if (idx >= (sizeof(metasprites) / sizeof(metasprites[0]))) idx = 0;
152
-        }
153
-
154
-        // Press A button to cycle metasprite through Normal/Flip-Y/Flip-XY/Flip-X and sub-pals
155 236
         if (KEY_PRESSED(J_A)) {
156
-            rot++; rot &= 0x3;
237
+            // TODO shoot
157 238
         }
158 239
 
159
-        PosX += SpdX, PosY += SpdY;
160
-
161
-        move_bkg(PosX >> 4, PosY >> 4);
162
-
163
-        uint8_t hiwater = SPR_NUM_START;
164
-
165
-        // NOTE: In a real game it would be better to only call the move_metasprite..()
166
-        //       functions if something changed (such as movement or rotation). That
167
-        //       reduces CPU usage on frames that don't need updates.
168
-        //
169
-        // In this example they are called every frame to simplify the example code
170
-
171
-        // If not hidden the move and apply rotation to the metasprite
172
-        switch (rot & 0x3) {
173
-            case 1:
174
-                hiwater += move_metasprite_flipy( metasprites[idx].ms[0],
175
-                                                  metasprites[idx].off,
176
-                                                  idx,
177
-                                                  hiwater,
178
-                                                  DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
179
-                                                  DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2));
180
-                break;
181
-            case 2:
182
-                hiwater += move_metasprite_flipxy(metasprites[idx].ms[0],
183
-                                                  metasprites[idx].off,
184
-                                                  idx,
185
-                                                  hiwater,
186
-                                                  DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
187
-                                                  DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2));
188
-                break;
189
-            case 3:
190
-                hiwater += move_metasprite_flipx( metasprites[idx].ms[0],
191
-                                                  metasprites[idx].off,
192
-                                                  idx,
193
-                                                  hiwater,
194
-                                                  DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
195
-                                                  DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2));
196
-                break;
197
-            default:
198
-                hiwater += move_metasprite_ex(    metasprites[idx].ms[0],
199
-                                                  metasprites[idx].off,
200
-                                                  idx,
201
-                                                  hiwater,
202
-                                                  DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
203
-                                                  DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2));
204
-                break;
240
+        if (KEY_PRESSED(J_B)) {
241
+            rot++; rot &= 0x3;
205 242
         }
206 243
 
207
-        // Hide rest of the hardware sprites, because amount of sprites differ between animation frames.
208
-        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
244
+        PosX += SpdX;
245
+        PosY += SpdY;
209 246
 
210 247
         // Y Axis: update velocity (reduce speed) if no U/D button pressed
211 248
         if (!(PosF & ACC_Y)) {
@@ -223,6 +260,34 @@ void main(void) {
223 260
             }
224 261
         }
225 262
 
263
+        move_bkg(PosX >> 4, PosY >> 4);
264
+
265
+        uint8_t hiwater = SPR_NUM_START;
266
+
267
+        // NOTE: In a real game it would be better to only call the move_metasprite..()
268
+        //       functions if something changed (such as movement or rotation). That
269
+        //       reduces CPU usage on frames that don't need updates.
270
+        //
271
+        // In this example they are called every frame to simplify the example code
272
+
273
+        ship(&hiwater);
274
+
275
+        // Hide rest of the hardware sprites, because amount of sprites differ between animation frames.
276
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
277
+
226 278
         vsync();
227 279
     }
228 280
 }
281
+
282
+void main(void) {
283
+#ifndef DEBUG
284
+    splash();
285
+#endif // DEBUG
286
+
287
+    uint16_t seed = DIV_REG;
288
+    waitpadup();
289
+    seed |= ((uint16_t)DIV_REG) << 8;
290
+    initarand(seed);
291
+
292
+    game();
293
+}

Loading…
Cancel
Save