-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
177 lines (161 loc) · 5.35 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <stdio.h>
#include <stdlib.h>
#include "gamerules.h"
#include "main.h"
#include "gba.h"
/* TODO: */
// Include any header files for title screen or exit
// screen images generated by nin10kit. Example for the provided garbage
// image:
#include "images/vcar.h"
#include "images/mcar.h"
#include "images/startScreen.h"
#include "images/winScreen.h"
#include "images/loseScreen.h"
/* TODO: */
// Add any additional states you need for your app. You are not requried to use
// these specific provided states.
int myMcars[4];
int main(void) {
/* TODO: */
// Manipulate REG_DISPCNT here to set Mode 3. //
REG_DISPCNT = MODE3 | BG2_ENABLE;
// Save current and previous state of button input.
u32 previousButtons = BUTTONS;
u32 currentButtons = BUTTONS;
// Load initial application state
GBAState state = START;
GBAState lastState = START; // tracking last state
char scoreStr[] = "SCORE: xxx"; // score display string for each time an enemy car is passed
u16 score = 0; // score; resets every new game
u16 fillS = 0; // only first entered for GAME
const unsigned short *imgPtr = start_screen; // pointer variable for drawing images
Vcar vcar;
Mcar mcar1;
mcar1.row = 15;
mcar1.cc = 0;
Mcar mcar2;
mcar2.row = 62;
mcar2.cc = 0;
Mcar mcar3;
mcar3.row = 100;
mcar3.cc = 0;
Mcar mcar4;
mcar4.row = 135;
mcar4.cc = 0;
myMcars[0] = (int) &mcar1;
myMcars[1] = (int) &mcar2;
myMcars[2] = (int) &mcar3;
myMcars[3] = (int) &mcar4;
while (1) {
currentButtons = BUTTONS; // Load the current state of the buttons
if (KEY_JUST_PRESSED(BUTTON_SELECT, currentButtons, previousButtons)) {
state = START;
}
if (KEY_JUST_PRESSED(BUTTON_START, currentButtons, previousButtons)) {
state = GAME;
}
/* TODO: */
// Manipulate the state machine below as needed //
// NOTE: Call waitForVBlank() before you draw
switch (state) {
case START:
reset(&score, &vcar, &mcar1, &mcar2, &mcar3, &mcar4);
lastState = START;
imgPtr = start_screen;
break;
case GAME:
if (lastState != GAME) {
lastState = GAME;
fillS = 1;
} else {
fillS = 0;
if (vcar.row_last != vcar.row || vcar.col_last != vcar.col) {
if (countMcars() < 2) {
int index = score % 4;
Mcar *mcar = (Mcar*)myMcars[index];
if (mcar->cc == 0) {
createMcar(mcar);
}
}
}
for (int i = 0; i < 4; i++) {
if (((Mcar*)myMcars[i])->cc == 1) {
movingMcar(((Mcar*)myMcars[i]), &score);
}
}
switch(collision1(&vcar)) {
case CONSTANT:
movingVcar(&vcar, &score);
break;
case COLLIDED:
if (score >= 10 ) {
state = WIN;
imgPtr = win_screen;
} else {
state = LOSE;
imgPtr = lose_screen;
}
break;
}
}
break;
case WIN:
reset(&score, &vcar, &mcar1, &mcar2, &mcar3, &mcar4);
lastState = WIN;
imgPtr = win_screen;
break;
case LOSE:
reset(&score, &vcar, &mcar1, &mcar2, &mcar3, &mcar4);
lastState = LOSE;
imgPtr = lose_screen;
break;
}
waitForVBlank();
if (state != GAME) {
drawFullScreenImageDMA(imgPtr);
} else {
if (fillS) {fillScreenDMA(WHITE); }
drawRectDMA(145, 50, 50, 50, WHITE); // undraw score
drawRectDMA(mcar1.row, mcar1.col_last, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, WHITE);
drawRectDMA(mcar2.row, mcar2.col_last, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, WHITE);
drawRectDMA(mcar3.row, mcar3.col_last, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, WHITE);
drawRectDMA(mcar4.row, mcar4.col_last, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, WHITE);
if (mcar1.cc == 1) {
drawImageDMA(mcar1.row, mcar1.col, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, maelstrom_car);
}
if (mcar2.cc == 1) {
drawImageDMA(mcar2.row, mcar2.col, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, maelstrom_car);
}
if (mcar3.cc == 1) {
drawImageDMA(mcar3.row, mcar3.col, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT,maelstrom_car);
}
if (mcar4.cc == 1) {
drawImageDMA(mcar4.row, mcar4.col, MAELSTROM_CAR_WIDTH, MAELSTROM_CAR_HEIGHT, maelstrom_car);
}
drawRectDMA(vcar.row - 5, vcar.col_last, V_CAR_WIDTH + 2, V_CAR_HEIGHT + 10, WHITE);
drawImageDMA(vcar.row, vcar.col, V_CAR_WIDTH, V_CAR_HEIGHT, V_car);
scoreStr[7] = score/100 + 48;
scoreStr[8] = (score%100)/10 + 48;
scoreStr[9] = score%10 + 48;
drawString(145, 10, scoreStr, BLACK); // display score
}
previousButtons = currentButtons; // Store the current state of the buttons
}
return 0;
}
void reset(u16 *score, Vcar *vcar, Mcar *mcar1, Mcar *mcar2, Mcar *mcar3, Mcar *mcar4) {
*score = 0;
resetVcar(vcar);
resetMcar(mcar1, mcar2, mcar3, mcar4);
}
int countMcars(void) {
int count = 0;
for (int i = 0; i < 4; i ++) {
int car = myMcars[i];
if (((Mcar*)car) -> cc == 1) {
count++;
}
}
return count;
}