Browse Source

add second color to pause text and flip between them

Thomas B 1 month ago
parent
commit
035393ca42
7 changed files with 52 additions and 15 deletions
  1. 4
    1
      Makefile
  2. BIN
      data/pause.png
  3. 10
    3
      src/game.c
  4. 3
    1
      src/maps.c
  5. 15
    1
      src/sprite_data.c
  6. 4
    1
      src/sprite_data.h
  7. 16
    8
      src/sprites.c

+ 4
- 1
Makefile View File

@@ -117,13 +117,16 @@ $(BUILD_DIR)/$(DATA_DIR)/%.c $(BUILD_DIR)/$(DATA_DIR)/%.h: $(DATA_DIR)/%.png
117 117
 	,$(if $(findstring _spr24,$<),                                                          \
118 118
 		@echo "Converting 24x24 sprite $<" &&                                           \
119 119
 		$(PNGA) $< -o $@ -spr8x8 -sw 24 -sh 24 -noflip                                  \
120
+	,$(if $(findstring pause,$<),                                                           \
121
+		@echo "Converting 40x16 sprite $<" &&                                           \
122
+		$(PNGA) $< -o $@ -spr8x8 -sw 40 -sh 16 -noflip                                  \
120 123
 	,$(if $(findstring _sgb,$<),                                                            \
121 124
 		@echo "Converting sgb border $<" &&                                             \
122 125
 		$(PNGA) $< -o $@ -map -bpp 4 -max_palettes 4 -pack_mode sgb -use_map_attributes \
123 126
 	,                                                                                       \
124 127
 		@echo "Converting tile $<" &&                                                   \
125 128
 		$(PNGA) $< -o $@ -spr8x8                                                        \
126
-	))))))
129
+	)))))))
127 130
 
128 131
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
129 132
 	@mkdir -p $(@D)

BIN
data/pause.png View File


+ 10
- 3
src/game.c View File

@@ -39,19 +39,26 @@ enum ACCELERATION {
39 39
 #define BAR_OFFSET_X (4 - 80)
40 40
 #define HEALTH_OFFSET_Y -16
41 41
 #define POWER_OFFSET_Y 16
42
+#define PAUSE_BLINK_FRAMES 32
42 43
 
43 44
 static uint8_t pause_screen(void) {
44
-    uint8_t hiwater = SPR_NUM_START;
45
-    spr_draw(SPR_PAUSE, FLIP_NONE, 0, 0, 0, &hiwater);
46
-    hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
45
+    uint8_t n = 0;
47 46
 
48 47
     while (1) {
49 48
         key_read();
49
+
50 50
         if (key_pressed(J_START)) {
51 51
             break;
52 52
         } else if (key_pressed(J_SELECT)) {
53 53
             return 1;
54 54
         }
55
+
56
+        n = (n + 1) & (PAUSE_BLINK_FRAMES - 1);
57
+
58
+        uint8_t hiwater = SPR_NUM_START;
59
+        spr_draw(SPR_PAUSE, FLIP_NONE, 0, 0, (n < (PAUSE_BLINK_FRAMES / 2)) ? 0 : 1, &hiwater);
60
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
61
+
55 62
         vsync();
56 63
     }
57 64
 

+ 3
- 1
src/maps.c View File

@@ -81,9 +81,11 @@ void win_init(uint8_t is_splash) NONBANKED {
81 81
 
82 82
     SWITCH_ROM(BANK(numbers_fnt));
83 83
     set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, numbers_fnt_palettes);
84
-    set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT + numbers_fnt_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, num_pal_inv);
85 84
     set_win_data(fnt_off, numbers_fnt_TILE_COUNT, numbers_fnt_tiles);
86 85
 
86
+    SWITCH_ROM(BANK(maps));
87
+    set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT + numbers_fnt_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, num_pal_inv);
88
+
87 89
     if (is_splash) {
88 90
         SWITCH_ROM(BANK(text_fnt));
89 91
         set_win_data(fnt_off + numbers_fnt_TILE_COUNT, text_fnt_TILE_COUNT, text_fnt_tiles);

+ 15
- 1
src/sprite_data.c View File

@@ -32,6 +32,20 @@
32 32
 
33 33
 BANKREF(power_palettes)
34 34
 
35
+/*
36
+ * OCP0: Rocketship (1)
37
+ * OCP1: Rocketship (2)
38
+ * OCP2: Light
39
+ * OCP3: Dark
40
+ * OCP4: Shot
41
+ * OCP5: Health
42
+ * OCP6: Power
43
+ * OCP7: Pause
44
+ *
45
+ * Explosion uses OCP0 to OCP3 at end of game.
46
+ * Pause is flipped in-place for animating the pause screen colors.
47
+ */
48
+
35 49
 const palette_color_t power_palettes[4] = {
36 50
   //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
37 51
     RGB8(  0,  0,  0), RGB8(  0,240,  0), RGB8(  0,196,  0), RGB8(  0,116,  0)
@@ -143,7 +157,7 @@ struct sprites metasprites[SPRITE_COUNT] = {
143 157
         .ti = pause_tiles,
144 158
         .pa = pause_palettes,
145 159
         .pa_n = pause_PALETTE_COUNT,
146
-        .pa_i = OAMF_CGB_PAL7,
160
+        .pa_i = OAMF_CGB_PAL7 | PALETTE_DYNAMIC_LOAD_IP,
147 161
         .cnt = pause_TILE_COUNT,
148 162
         .off = TILE_NUM_START,
149 163
         .bank = BANK(pause),

+ 4
- 1
src/sprite_data.h View File

@@ -32,8 +32,11 @@
32 32
 // Metasprite tiles are loaded into VRAM starting at tile number 0
33 33
 #define TILE_NUM_START 0
34 34
 
35
-#define PALETTE_DYNAMIC_LOAD 0xF0
35
+#define PALETTE_PRELOAD 0x00
36
+#define PALETTE_DYNAMIC_LOAD 0x10
37
+#define PALETTE_DYNAMIC_LOAD_IP 0x20
36 38
 #define PALETTE_NO_FLAGS 0x0F
39
+#define PALETTE_ALL_FLAGS 0xF0
37 40
 
38 41
 #define ARR_LEN(x) (sizeof(x) / sizeof(x[0]))
39 42
 

+ 16
- 8
src/sprites.c View File

@@ -45,7 +45,7 @@ void spr_init_pal(void) NONBANKED {
45 45
             SWITCH_ROM(metasprites[i].bank);
46 46
         }
47 47
 
48
-        if ((metasprites[i].pa != NULL) && (!(metasprites[i].pa_i & 0xF0))) {
48
+        if ((metasprites[i].pa != NULL) && ((metasprites[i].pa_i & PALETTE_ALL_FLAGS) == PALETTE_PRELOAD)) {
49 49
             set_sprite_palette(metasprites[i].pa_i, metasprites[i].pa_n, metasprites[i].pa);
50 50
         }
51 51
     }
@@ -60,21 +60,29 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
60 60
         frame = 0;
61 61
     }
62 62
 
63
-    if (metasprites[sprite].pa_i & PALETTE_DYNAMIC_LOAD) {
63
+    uint8_t pa_off = 0;
64
+
65
+    if ((metasprites[sprite].pa_i & PALETTE_ALL_FLAGS) == PALETTE_DYNAMIC_LOAD) {
64 66
         uint8_t pa_i = frame;
65 67
         if (pa_i >= metasprites[sprite].pa_n) {
66 68
             pa_i = 0;
67 69
         }
68 70
 
69
-        // used for explosion. just overwrite our fist four palettes. we dont need them at the end of the game.
70
-        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS) + pa_i, 1, metasprites[sprite].pa + (pa_i * 1));
71
+        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS) + pa_i, 1, metasprites[sprite].pa + (pa_i * 4));
72
+    } else if ((metasprites[sprite].pa_i & PALETTE_ALL_FLAGS) == PALETTE_DYNAMIC_LOAD_IP) {
73
+        pa_off = frame;
74
+        if (pa_off >= metasprites[sprite].pa_n) {
75
+            pa_off = 0;
76
+        }
77
+
78
+        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS), 1, metasprites[sprite].pa + (pa_off * 4));
71 79
     }
72 80
 
73 81
     switch (flip) {
74 82
         case FLIP_Y:
75 83
             *hiwater += move_metasprite_flipy(
76 84
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
77
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
85
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
78 86
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
79 87
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
80 88
             break;
@@ -82,7 +90,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
82 90
         case FLIP_XY:
83 91
             *hiwater += move_metasprite_flipxy(
84 92
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
85
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
93
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
86 94
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
87 95
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
88 96
             break;
@@ -90,7 +98,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
90 98
         case FLIP_X:
91 99
             *hiwater += move_metasprite_flipx(
92 100
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
93
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
101
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
94 102
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
95 103
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
96 104
             break;
@@ -99,7 +107,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
99 107
         default:
100 108
             *hiwater += move_metasprite_ex(
101 109
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
102
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
110
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
103 111
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
104 112
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
105 113
             break;

Loading…
Cancel
Save