My ELEC2645 project. Nikollao Sulollari. 200804685
Dependencies: N5110 SoftPWM mbed
Fork of Treasure_Hunt by
main.cpp@19:70d40dac5ae0, 2016-05-02 (annotated)
- Committer:
- Nikollao
- Date:
- Mon May 02 15:08:00 2016 +0000
- Revision:
- 19:70d40dac5ae0
- Parent:
- 18:5405ee7e243b
- Child:
- 20:59aa6189a47d
obstacles, enemies done, except level 7!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Nikollao | 5:ffa498d7071f | 1 | /** |
Nikollao | 5:ffa498d7071f | 2 | @file main.cpp |
Nikollao | 5:ffa498d7071f | 3 | @brief Game implementation |
Nikollao | 4:f31bdc212241 | 4 | |
Nikollao | 5:ffa498d7071f | 5 | */ |
Nikollao | 5:ffa498d7071f | 6 | #include "main.h" |
Nikollao | 0:2d0f77943105 | 7 | #include "stdlib.h" |
Nikollao | 2:af5b5d42e835 | 8 | |
Nikollao | 0:2d0f77943105 | 9 | int main() |
Nikollao | 0:2d0f77943105 | 10 | { |
Nikollao | 6:c11bb31a06b3 | 11 | lcd.init(); |
Nikollao | 6:c11bb31a06b3 | 12 | init_K64F(); |
Nikollao | 6:c11bb31a06b3 | 13 | init_serial(); |
Nikollao | 16:a6ca6858af24 | 14 | init_game(); ///initialize game |
Nikollao | 17:2d424db3975f | 15 | led_output = fsm[fsm_state]; |
Nikollao | 5:ffa498d7071f | 16 | calibrateJoystick(); ///calibrate joystick |
Nikollao | 14:91ae0afe9037 | 17 | button.rise(&button_isr); ///assign rise with ISR |
Nikollao | 14:91ae0afe9037 | 18 | button1.rise(&button1_isr); |
Nikollao | 18:5405ee7e243b | 19 | |
Nikollao | 16:a6ca6858af24 | 20 | game_ticker.attach(&game_timer_isr,0.2); |
Nikollao | 15:c7af2ea5f164 | 21 | menu(); |
Nikollao | 16:a6ca6858af24 | 22 | game_ticker.detach(); |
Nikollao | 18:5405ee7e243b | 23 | |
Nikollao | 16:a6ca6858af24 | 24 | ticker.attach(&timer_isr,game_speed); ///attach ticker with ISR every 0.1 sec |
Nikollao | 5:ffa498d7071f | 25 | reset = level; ///set reset = level to check later if level has increased |
Nikollao | 18:5405ee7e243b | 26 | |
Nikollao | 0:2d0f77943105 | 27 | while (1) { |
Nikollao | 0:2d0f77943105 | 28 | |
Nikollao | 0:2d0f77943105 | 29 | if (g_timer_flag) { |
Nikollao | 0:2d0f77943105 | 30 | |
Nikollao | 6:c11bb31a06b3 | 31 | g_timer_flag = 0; ///reset flag |
Nikollao | 0:2d0f77943105 | 32 | lcd.clear(); |
Nikollao | 6:c11bb31a06b3 | 33 | guidance(); |
Nikollao | 17:2d424db3975f | 34 | hero(); |
Nikollao | 3:d2cc054e8605 | 35 | enemies(); |
Nikollao | 0:2d0f77943105 | 36 | obstacles(); |
Nikollao | 0:2d0f77943105 | 37 | |
Nikollao | 5:ffa498d7071f | 38 | if (reset < level) { ///if level has increased |
Nikollao | 0:2d0f77943105 | 39 | |
Nikollao | 6:c11bb31a06b3 | 40 | reset = level; ///update reset |
Nikollao | 5:ffa498d7071f | 41 | rectX = rand() % 84; ///set the position of rect enemy |
Nikollao | 0:2d0f77943105 | 42 | rectY = 0; |
Nikollao | 5:ffa498d7071f | 43 | circleX = 0; ///set position of circle enemy |
Nikollao | 6:c11bb31a06b3 | 44 | circleY = rand() % 47; |
Nikollao | 0:2d0f77943105 | 45 | } |
Nikollao | 6:c11bb31a06b3 | 46 | pc.printf("x = %f y = %f button = %d \n",joystick.x,joystick.y,joystick.button); |
Nikollao | 6:c11bb31a06b3 | 47 | pc.printf("heroY = %d , heroX = %d , n = %d \n",heroY, heroX, n); |
Nikollao | 16:a6ca6858af24 | 48 | checkOverlap(); |
Nikollao | 16:a6ca6858af24 | 49 | updateJoystick(); |
Nikollao | 16:a6ca6858af24 | 50 | lcd.refresh(); |
Nikollao | 0:2d0f77943105 | 51 | } |
Nikollao | 0:2d0f77943105 | 52 | sleep(); |
Nikollao | 0:2d0f77943105 | 53 | } |
Nikollao | 0:2d0f77943105 | 54 | } |
Nikollao | 0:2d0f77943105 | 55 | |
Nikollao | 0:2d0f77943105 | 56 | void init_serial() |
Nikollao | 0:2d0f77943105 | 57 | { |
Nikollao | 0:2d0f77943105 | 58 | // set to highest baud - ensure terminal software matches |
Nikollao | 0:2d0f77943105 | 59 | pc.baud(115200); |
Nikollao | 0:2d0f77943105 | 60 | } |
Nikollao | 0:2d0f77943105 | 61 | |
Nikollao | 0:2d0f77943105 | 62 | void init_K64F() |
Nikollao | 0:2d0f77943105 | 63 | { |
Nikollao | 0:2d0f77943105 | 64 | // on-board LEDs are active-low, so set pin high to turn them off. |
Nikollao | 0:2d0f77943105 | 65 | r_led = 1; |
Nikollao | 0:2d0f77943105 | 66 | g_led = 1; |
Nikollao | 0:2d0f77943105 | 67 | b_led = 1; |
Nikollao | 18:5405ee7e243b | 68 | |
Nikollao | 15:c7af2ea5f164 | 69 | blue_led = 1; |
Nikollao | 0:2d0f77943105 | 70 | |
Nikollao | 0:2d0f77943105 | 71 | // since the on-board switches have external pull-ups, we should disable the internal pull-down |
Nikollao | 0:2d0f77943105 | 72 | // resistors that are enabled by default using InterruptIn |
Nikollao | 0:2d0f77943105 | 73 | sw2.mode(PullNone); |
Nikollao | 0:2d0f77943105 | 74 | sw3.mode(PullNone); |
Nikollao | 11:53caf3d944a9 | 75 | button.mode(PullDown); |
Nikollao | 11:53caf3d944a9 | 76 | button1.mode(PullDown); |
Nikollao | 0:2d0f77943105 | 77 | } |
Nikollao | 0:2d0f77943105 | 78 | |
Nikollao | 0:2d0f77943105 | 79 | void timer_isr () |
Nikollao | 0:2d0f77943105 | 80 | { |
Nikollao | 0:2d0f77943105 | 81 | g_timer_flag = 1; |
Nikollao | 0:2d0f77943105 | 82 | } |
Nikollao | 0:2d0f77943105 | 83 | |
Nikollao | 0:2d0f77943105 | 84 | void game_timer_isr() |
Nikollao | 0:2d0f77943105 | 85 | { |
Nikollao | 0:2d0f77943105 | 86 | g_game_timer_flag = 1; |
Nikollao | 0:2d0f77943105 | 87 | } |
Nikollao | 0:2d0f77943105 | 88 | |
Nikollao | 0:2d0f77943105 | 89 | void sw2_isr() |
Nikollao | 0:2d0f77943105 | 90 | { |
Nikollao | 0:2d0f77943105 | 91 | g_sw2_flag = 1; |
Nikollao | 0:2d0f77943105 | 92 | } |
Nikollao | 0:2d0f77943105 | 93 | |
Nikollao | 4:f31bdc212241 | 94 | void sw3_isr() |
Nikollao | 4:f31bdc212241 | 95 | { |
Nikollao | 1:12803d645d32 | 96 | g_sw3_flag = 1; |
Nikollao | 1:12803d645d32 | 97 | } |
Nikollao | 1:12803d645d32 | 98 | |
Nikollao | 1:12803d645d32 | 99 | void button_isr() |
Nikollao | 1:12803d645d32 | 100 | { |
Nikollao | 1:12803d645d32 | 101 | g_button_flag =1; |
Nikollao | 1:12803d645d32 | 102 | } |
Nikollao | 1:12803d645d32 | 103 | |
Nikollao | 18:5405ee7e243b | 104 | void button1_isr() |
Nikollao | 18:5405ee7e243b | 105 | { |
Nikollao | 18:5405ee7e243b | 106 | |
Nikollao | 11:53caf3d944a9 | 107 | g_button1_flag =1; |
Nikollao | 11:53caf3d944a9 | 108 | } |
Nikollao | 11:53caf3d944a9 | 109 | |
Nikollao | 1:12803d645d32 | 110 | void timeout_isr() |
Nikollao | 1:12803d645d32 | 111 | { |
Nikollao | 1:12803d645d32 | 112 | if (button) { |
Nikollao | 16:a6ca6858af24 | 113 | pc.printf("timeout \n"); |
Nikollao | 1:12803d645d32 | 114 | } |
Nikollao | 16:a6ca6858af24 | 115 | } |
Nikollao | 18:5405ee7e243b | 116 | |
Nikollao | 18:5405ee7e243b | 117 | void enemies() |
Nikollao | 18:5405ee7e243b | 118 | { |
Nikollao | 18:5405ee7e243b | 119 | /// generate enemies in the screen depending on the level difficulty |
Nikollao | 18:5405ee7e243b | 120 | if (level == 0) { |
Nikollao | 18:5405ee7e243b | 121 | |
Nikollao | 18:5405ee7e243b | 122 | enemyRect(); |
Nikollao | 19:70d40dac5ae0 | 123 | enemyCircle(); |
Nikollao | 18:5405ee7e243b | 124 | } else if (level == 1) { |
Nikollao | 18:5405ee7e243b | 125 | |
Nikollao | 18:5405ee7e243b | 126 | enemyRect(); |
Nikollao | 19:70d40dac5ae0 | 127 | enemyCircle(); |
Nikollao | 18:5405ee7e243b | 128 | } else if (level == 2) { |
Nikollao | 19:70d40dac5ae0 | 129 | |
Nikollao | 19:70d40dac5ae0 | 130 | enemyRocket(); |
Nikollao | 18:5405ee7e243b | 131 | } else if (level == 3) { |
Nikollao | 19:70d40dac5ae0 | 132 | |
Nikollao | 19:70d40dac5ae0 | 133 | enemyRect(); |
Nikollao | 19:70d40dac5ae0 | 134 | enemyCircle(); |
Nikollao | 19:70d40dac5ae0 | 135 | } else if (level == 4) { |
Nikollao | 19:70d40dac5ae0 | 136 | |
Nikollao | 19:70d40dac5ae0 | 137 | enemyRect(); |
Nikollao | 19:70d40dac5ae0 | 138 | enemyCircle(); |
Nikollao | 19:70d40dac5ae0 | 139 | } else if (level == 5) { |
Nikollao | 19:70d40dac5ae0 | 140 | enemyRocket(); |
Nikollao | 19:70d40dac5ae0 | 141 | } else if (level == 6) { |
Nikollao | 19:70d40dac5ae0 | 142 | enemyRocket(); |
Nikollao | 19:70d40dac5ae0 | 143 | enemyCircle(); |
Nikollao | 18:5405ee7e243b | 144 | } |
Nikollao | 19:70d40dac5ae0 | 145 | else if (level == 7) { |
Nikollao | 19:70d40dac5ae0 | 146 | |
Nikollao | 19:70d40dac5ae0 | 147 | } |
Nikollao | 18:5405ee7e243b | 148 | } |
Nikollao | 18:5405ee7e243b | 149 | |
Nikollao | 18:5405ee7e243b | 150 | void enemyRect() |
Nikollao | 18:5405ee7e243b | 151 | { |
Nikollao | 18:5405ee7e243b | 152 | ///generate rect shape enemy |
Nikollao | 18:5405ee7e243b | 153 | lcd.drawRect(rectX,rectY,5,4,1); |
Nikollao | 18:5405ee7e243b | 154 | rectX = rectX + rand()%4 - 2; |
Nikollao | 18:5405ee7e243b | 155 | rectY++; ///enemy moving towards hero |
Nikollao | 18:5405ee7e243b | 156 | if (rectY == 50) { |
Nikollao | 18:5405ee7e243b | 157 | rectY = 0; |
Nikollao | 18:5405ee7e243b | 158 | } |
Nikollao | 19:70d40dac5ae0 | 159 | if (rectX > 75 || rectX < 25) { |
Nikollao | 19:70d40dac5ae0 | 160 | rectX = 40+rand()%6 - 3; |
Nikollao | 18:5405ee7e243b | 161 | } |
Nikollao | 18:5405ee7e243b | 162 | } |
Nikollao | 18:5405ee7e243b | 163 | |
Nikollao | 19:70d40dac5ae0 | 164 | void enemyRocket() { |
Nikollao | 19:70d40dac5ae0 | 165 | |
Nikollao | 19:70d40dac5ae0 | 166 | lcd.drawRect(rectX,rectY,2,7,1); |
Nikollao | 19:70d40dac5ae0 | 167 | lcd.drawCircle(rectX+1,rectY+1,2,1); |
Nikollao | 19:70d40dac5ae0 | 168 | lcd.drawLine(rectX-2,rectY+2,rectX,rectY-1,1); |
Nikollao | 19:70d40dac5ae0 | 169 | lcd.drawLine(rectX+2,rectY+2,rectX,rectY-1,1); |
Nikollao | 19:70d40dac5ae0 | 170 | |
Nikollao | 19:70d40dac5ae0 | 171 | rectX = rectX + rand()%4 - 2; |
Nikollao | 19:70d40dac5ae0 | 172 | rectY++; ///enemy moving towards hero |
Nikollao | 19:70d40dac5ae0 | 173 | |
Nikollao | 19:70d40dac5ae0 | 174 | if (rectY == 50) { |
Nikollao | 19:70d40dac5ae0 | 175 | rectY = 0; |
Nikollao | 19:70d40dac5ae0 | 176 | } |
Nikollao | 19:70d40dac5ae0 | 177 | if (rectX > 75 || rectX < 10) { |
Nikollao | 19:70d40dac5ae0 | 178 | rectX = 40+rand()%6 - 3; |
Nikollao | 19:70d40dac5ae0 | 179 | } |
Nikollao | 19:70d40dac5ae0 | 180 | } |
Nikollao | 18:5405ee7e243b | 181 | void hero() |
Nikollao | 18:5405ee7e243b | 182 | { |
Nikollao | 18:5405ee7e243b | 183 | ///cotrol hero |
Nikollao | 18:5405ee7e243b | 184 | if (joystick.direction == RIGHT) { |
Nikollao | 18:5405ee7e243b | 185 | heroX--; |
Nikollao | 18:5405ee7e243b | 186 | } else if (joystick.direction == LEFT) { |
Nikollao | 18:5405ee7e243b | 187 | heroX++; |
Nikollao | 18:5405ee7e243b | 188 | } else { |
Nikollao | 18:5405ee7e243b | 189 | heroX = heroX; |
Nikollao | 18:5405ee7e243b | 190 | } |
Nikollao | 18:5405ee7e243b | 191 | |
Nikollao | 18:5405ee7e243b | 192 | if (joystick.direction == UP) { |
Nikollao | 18:5405ee7e243b | 193 | heroY--; |
Nikollao | 18:5405ee7e243b | 194 | } else if (joystick.direction == DOWN) { |
Nikollao | 18:5405ee7e243b | 195 | heroY++; |
Nikollao | 18:5405ee7e243b | 196 | } else { |
Nikollao | 18:5405ee7e243b | 197 | heroY = heroY; |
Nikollao | 18:5405ee7e243b | 198 | } |
Nikollao | 18:5405ee7e243b | 199 | |
Nikollao | 18:5405ee7e243b | 200 | if (joystick.direction == UP_LEFT) { |
Nikollao | 18:5405ee7e243b | 201 | heroY--; |
Nikollao | 18:5405ee7e243b | 202 | heroX++; |
Nikollao | 18:5405ee7e243b | 203 | } else if (joystick.direction == UP_RIGHT) { |
Nikollao | 18:5405ee7e243b | 204 | heroY--; |
Nikollao | 18:5405ee7e243b | 205 | heroX--; |
Nikollao | 18:5405ee7e243b | 206 | } else if (joystick.direction == DOWN_RIGHT) { |
Nikollao | 18:5405ee7e243b | 207 | heroY++; |
Nikollao | 18:5405ee7e243b | 208 | heroX--; |
Nikollao | 18:5405ee7e243b | 209 | } else if (joystick.direction == DOWN_LEFT) { |
Nikollao | 18:5405ee7e243b | 210 | heroY++; |
Nikollao | 18:5405ee7e243b | 211 | heroX++; |
Nikollao | 18:5405ee7e243b | 212 | } |
Nikollao | 18:5405ee7e243b | 213 | |
Nikollao | 18:5405ee7e243b | 214 | ///set x-axis boundaries so hero does not go out of screen |
Nikollao | 18:5405ee7e243b | 215 | if (heroX > 40) { |
Nikollao | 18:5405ee7e243b | 216 | heroX = -40; |
Nikollao | 18:5405ee7e243b | 217 | } |
Nikollao | 18:5405ee7e243b | 218 | if (heroX < -45) { |
Nikollao | 18:5405ee7e243b | 219 | heroX = 35; |
Nikollao | 18:5405ee7e243b | 220 | } |
Nikollao | 18:5405ee7e243b | 221 | if (heroY < -45) { ///if hero has reached the top of the screen |
Nikollao | 18:5405ee7e243b | 222 | heroY = 0; ///hero goes back to the bottom of the screen |
Nikollao | 18:5405ee7e243b | 223 | level++; ///level increases by 1 |
Nikollao | 18:5405ee7e243b | 224 | } |
Nikollao | 18:5405ee7e243b | 225 | |
Nikollao | 18:5405ee7e243b | 226 | if (heroY >= 0) {/// hero cannot go to previous level |
Nikollao | 18:5405ee7e243b | 227 | heroY = 0; |
Nikollao | 18:5405ee7e243b | 228 | } |
Nikollao | 18:5405ee7e243b | 229 | ///draw hero |
Nikollao | 18:5405ee7e243b | 230 | lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1); |
Nikollao | 18:5405ee7e243b | 231 | lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1); |
Nikollao | 18:5405ee7e243b | 232 | lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1); |
Nikollao | 18:5405ee7e243b | 233 | lcd.drawCircle(44+heroX, 39+heroY,2,0); |
Nikollao | 18:5405ee7e243b | 234 | } |
Nikollao | 18:5405ee7e243b | 235 | |
Nikollao | 18:5405ee7e243b | 236 | void enemyCircle() |
Nikollao | 18:5405ee7e243b | 237 | { |
Nikollao | 18:5405ee7e243b | 238 | ///generate circle shape enemy |
Nikollao | 18:5405ee7e243b | 239 | lcd.drawCircle(circleX,circleY,4,1); |
Nikollao | 18:5405ee7e243b | 240 | circleY = circleY + rand() %4 - 2; |
Nikollao | 18:5405ee7e243b | 241 | |
Nikollao | 18:5405ee7e243b | 242 | if (circleY <= 10) { |
Nikollao | 18:5405ee7e243b | 243 | circleY = 20; |
Nikollao | 18:5405ee7e243b | 244 | } |
Nikollao | 18:5405ee7e243b | 245 | if (circleY >= 35) { |
Nikollao | 18:5405ee7e243b | 246 | circleY = 35; |
Nikollao | 18:5405ee7e243b | 247 | } |
Nikollao | 18:5405ee7e243b | 248 | if (circleX > 84) { |
Nikollao | 18:5405ee7e243b | 249 | circleX = 0; |
Nikollao | 18:5405ee7e243b | 250 | } |
Nikollao | 18:5405ee7e243b | 251 | circleX++; ///enemy moving towards hero |
Nikollao | 18:5405ee7e243b | 252 | } |
Nikollao | 18:5405ee7e243b | 253 | |
Nikollao | 18:5405ee7e243b | 254 | void init_game() |
Nikollao | 18:5405ee7e243b | 255 | { |
Nikollao | 18:5405ee7e243b | 256 | ///initialise game |
Nikollao | 18:5405ee7e243b | 257 | srand(time(NULL)); /// generate random numbers |
Nikollao | 18:5405ee7e243b | 258 | rectY = 0; /// init rectX, rectY |
Nikollao | 18:5405ee7e243b | 259 | rectX = rand() %40 + 20; |
Nikollao | 18:5405ee7e243b | 260 | circleY = rand() %20 + 10; /// init circleX, circleY |
Nikollao | 18:5405ee7e243b | 261 | circleX = 0; |
Nikollao | 18:5405ee7e243b | 262 | |
Nikollao | 18:5405ee7e243b | 263 | lcd.setBrightness(0.5); // put LED backlight on 50% |
Nikollao | 18:5405ee7e243b | 264 | lcd.printString("Welcome to",11,1); |
Nikollao | 18:5405ee7e243b | 265 | lcd.printString("Treasure Hunt!",1,3); |
Nikollao | 18:5405ee7e243b | 266 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 267 | //timeout.attach(&timeout_isr,3); |
Nikollao | 18:5405ee7e243b | 268 | //sleep(); |
Nikollao | 18:5405ee7e243b | 269 | wait(3); |
Nikollao | 18:5405ee7e243b | 270 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 271 | |
Nikollao | 18:5405ee7e243b | 272 | } |
Nikollao | 18:5405ee7e243b | 273 | void guidance() |
Nikollao | 18:5405ee7e243b | 274 | { |
Nikollao | 18:5405ee7e243b | 275 | /// show arrow to act as guidance towards the treasure |
Nikollao | 18:5405ee7e243b | 276 | if (level < 7) { ///check level of difficulty |
Nikollao | 18:5405ee7e243b | 277 | |
Nikollao | 18:5405ee7e243b | 278 | lcd.drawLine(42,0,42,4,1); |
Nikollao | 18:5405ee7e243b | 279 | lcd.drawLine(42,0,40,2,1); |
Nikollao | 18:5405ee7e243b | 280 | lcd.drawLine(42,0,44,2,1); |
Nikollao | 18:5405ee7e243b | 281 | } else if (level == 7) { |
Nikollao | 18:5405ee7e243b | 282 | |
Nikollao | 18:5405ee7e243b | 283 | lcd.printString("F",42,0); /// print the treasure icon |
Nikollao | 18:5405ee7e243b | 284 | } else if (level == 8) { |
Nikollao | 18:5405ee7e243b | 285 | |
Nikollao | 18:5405ee7e243b | 286 | ticker.detach(); |
Nikollao | 19:70d40dac5ae0 | 287 | game_ticker.attach(&game_timer_isr,0.2); |
Nikollao | 18:5405ee7e243b | 288 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 289 | lcd.printString("Well done!",0,0); |
Nikollao | 18:5405ee7e243b | 290 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 291 | wait(2); |
Nikollao | 18:5405ee7e243b | 292 | lcd.clear(); |
Nikollao | 19:70d40dac5ae0 | 293 | lcd.printString("Play again!",0,0); |
Nikollao | 18:5405ee7e243b | 294 | lcd.drawCircle(70,4,2,1); |
Nikollao | 18:5405ee7e243b | 295 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 296 | g_button_flag = 0; |
Nikollao | 18:5405ee7e243b | 297 | |
Nikollao | 18:5405ee7e243b | 298 | while(1) { |
Nikollao | 19:70d40dac5ae0 | 299 | if (g_button1_flag) { |
Nikollao | 18:5405ee7e243b | 300 | |
Nikollao | 19:70d40dac5ae0 | 301 | g_button1_flag = 0; |
Nikollao | 18:5405ee7e243b | 302 | level = 0; |
Nikollao | 18:5405ee7e243b | 303 | // play++; |
Nikollao | 18:5405ee7e243b | 304 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 305 | main(); |
Nikollao | 18:5405ee7e243b | 306 | r_led = 0; |
Nikollao | 18:5405ee7e243b | 307 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 308 | } |
Nikollao | 18:5405ee7e243b | 309 | sleep(); |
Nikollao | 18:5405ee7e243b | 310 | } |
Nikollao | 18:5405ee7e243b | 311 | } |
Nikollao | 18:5405ee7e243b | 312 | } |
Nikollao | 18:5405ee7e243b | 313 | |
Nikollao | 18:5405ee7e243b | 314 | void obstacles() |
Nikollao | 18:5405ee7e243b | 315 | { |
Nikollao | 18:5405ee7e243b | 316 | /// place obstacles in the screen |
Nikollao | 18:5405ee7e243b | 317 | /// as level difficulty increases, more obstacles are added |
Nikollao | 18:5405ee7e243b | 318 | if (level == 0) { |
Nikollao | 18:5405ee7e243b | 319 | |
Nikollao | 18:5405ee7e243b | 320 | lcd.drawRect(10,15,2,2,1); |
Nikollao | 18:5405ee7e243b | 321 | lcd.drawRect(74,15,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 322 | } else if (level == 1) { |
Nikollao | 18:5405ee7e243b | 323 | |
Nikollao | 18:5405ee7e243b | 324 | lcd.drawRect(10,15,2,2,1); |
Nikollao | 18:5405ee7e243b | 325 | lcd.drawRect(74,15,2,2,1); |
Nikollao | 18:5405ee7e243b | 326 | lcd.drawRect(10,28,2,2,1); |
Nikollao | 18:5405ee7e243b | 327 | lcd.drawRect(74,28,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 328 | } else if (level == 2) { |
Nikollao | 19:70d40dac5ae0 | 329 | |
Nikollao | 19:70d40dac5ae0 | 330 | lcd.drawCircle(37,25,5,0); |
Nikollao | 19:70d40dac5ae0 | 331 | lcd.drawCircle(47,25,5,0); |
Nikollao | 19:70d40dac5ae0 | 332 | lcd.drawCircle(42,11,3,1); |
Nikollao | 19:70d40dac5ae0 | 333 | lcd.drawCircle(37,25,3,1); |
Nikollao | 19:70d40dac5ae0 | 334 | lcd.drawCircle(47,25,3,1); |
Nikollao | 19:70d40dac5ae0 | 335 | lcd.drawRect(80,2,2,42,1); |
Nikollao | 19:70d40dac5ae0 | 336 | lcd.drawRect(2,2,2,42,1); |
Nikollao | 19:70d40dac5ae0 | 337 | |
Nikollao | 18:5405ee7e243b | 338 | } else if (level == 3) { |
Nikollao | 18:5405ee7e243b | 339 | |
Nikollao | 18:5405ee7e243b | 340 | lcd.drawRect(5,12,2,2,1); |
Nikollao | 18:5405ee7e243b | 341 | lcd.drawRect(79,12,2,2,1); |
Nikollao | 18:5405ee7e243b | 342 | lcd.drawRect(5,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 343 | lcd.drawRect(79,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 344 | lcd.drawRect(28,12,2,2,1); |
Nikollao | 18:5405ee7e243b | 345 | lcd.drawRect(52,12,2,2,1); |
Nikollao | 18:5405ee7e243b | 346 | lcd.drawRect(28,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 347 | lcd.drawRect(52,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 348 | } else if (level == 4) { |
Nikollao | 18:5405ee7e243b | 349 | |
Nikollao | 19:70d40dac5ae0 | 350 | lcd.drawRect(5+rand() %4 - 2 ,12+rand() %4 - 2,2,2,1); |
Nikollao | 18:5405ee7e243b | 351 | lcd.drawRect(79 + rand() %4 - 2,12 + rand() %4 - 2,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 352 | lcd.drawRect(5+ rand() %4 - 2,30+rand() %4 - 2 ,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 353 | lcd.drawRect(79 + rand() %4 - 2,30+rand() %4 - 2,2,2,1); |
Nikollao | 18:5405ee7e243b | 354 | lcd.drawRect(28 + rand() %4 - 2,12+ rand() %4,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 355 | lcd.drawRect(52+rand() %4 - 2,12 + rand() %4 - 2,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 356 | lcd.drawRect(28+rand() %4 - 2,30 + rand() %4 - 2,2,2,1); |
Nikollao | 19:70d40dac5ae0 | 357 | lcd.drawRect(52 + rand() %4 - 2,30+ rand() %4,2,2,1); |
Nikollao | 18:5405ee7e243b | 358 | } |
Nikollao | 18:5405ee7e243b | 359 | if (objectX == 0) { ///check position of obstacle |
Nikollao | 18:5405ee7e243b | 360 | state = 0; ///assign states to the position of the obstacle |
Nikollao | 18:5405ee7e243b | 361 | } else if (objectX == 60) { |
Nikollao | 18:5405ee7e243b | 362 | state = 1; |
Nikollao | 18:5405ee7e243b | 363 | } else { |
Nikollao | 18:5405ee7e243b | 364 | state = state; |
Nikollao | 18:5405ee7e243b | 365 | } |
Nikollao | 18:5405ee7e243b | 366 | if (state == 0) { ///if state is 0 increase position on x-axis |
Nikollao | 18:5405ee7e243b | 367 | objectX++; |
Nikollao | 18:5405ee7e243b | 368 | } else { |
Nikollao | 18:5405ee7e243b | 369 | objectX--; ///else if state is 1 decrease position on x-axis |
Nikollao | 18:5405ee7e243b | 370 | } |
Nikollao | 18:5405ee7e243b | 371 | |
Nikollao | 18:5405ee7e243b | 372 | if (objectX1 == 68) { |
Nikollao | 18:5405ee7e243b | 373 | |
Nikollao | 18:5405ee7e243b | 374 | state1 = 1; |
Nikollao | 18:5405ee7e243b | 375 | } else if (objectX1 == 10) { |
Nikollao | 18:5405ee7e243b | 376 | state1 = 0; |
Nikollao | 18:5405ee7e243b | 377 | } |
Nikollao | 18:5405ee7e243b | 378 | if (state1 == 1) { |
Nikollao | 18:5405ee7e243b | 379 | objectX1--; |
Nikollao | 18:5405ee7e243b | 380 | } else if (state1 == 0) { |
Nikollao | 18:5405ee7e243b | 381 | objectX1++; |
Nikollao | 18:5405ee7e243b | 382 | } |
Nikollao | 18:5405ee7e243b | 383 | objectY = objectY + rand() %4 - 2; ///set poistion of obstacle on y-axis to be valuable |
Nikollao | 18:5405ee7e243b | 384 | ///keep moving object within boundaries |
Nikollao | 18:5405ee7e243b | 385 | if (objectY <= 10) { |
Nikollao | 18:5405ee7e243b | 386 | objectY = 10; |
Nikollao | 18:5405ee7e243b | 387 | } |
Nikollao | 18:5405ee7e243b | 388 | if (objectY >= 37) { |
Nikollao | 18:5405ee7e243b | 389 | objectY = 37; |
Nikollao | 18:5405ee7e243b | 390 | } |
Nikollao | 18:5405ee7e243b | 391 | if ( level == 5) { |
Nikollao | 18:5405ee7e243b | 392 | |
Nikollao | 18:5405ee7e243b | 393 | lcd.drawLine(15,10,15,37,1); |
Nikollao | 18:5405ee7e243b | 394 | lcd.drawLine(71,10,71,37,1); |
Nikollao | 18:5405ee7e243b | 395 | |
Nikollao | 18:5405ee7e243b | 396 | lcd.drawRect(11+objectX,objectY,2,2,1); ///draw obstacle |
Nikollao | 18:5405ee7e243b | 397 | |
Nikollao | 18:5405ee7e243b | 398 | lcd.drawRect(80,10,2,2,1); |
Nikollao | 18:5405ee7e243b | 399 | lcd.drawRect(5,10,2,2,1); |
Nikollao | 18:5405ee7e243b | 400 | lcd.drawRect(80,20,2,2,1); |
Nikollao | 18:5405ee7e243b | 401 | lcd.drawRect(5,20,2,2,1); |
Nikollao | 18:5405ee7e243b | 402 | lcd.drawRect(80,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 403 | lcd.drawRect(5,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 404 | |
Nikollao | 18:5405ee7e243b | 405 | } else if (level == 6) { |
Nikollao | 18:5405ee7e243b | 406 | |
Nikollao | 18:5405ee7e243b | 407 | lcd.drawLine(15,10,15,37,1); ///draw boundaries |
Nikollao | 18:5405ee7e243b | 408 | lcd.drawLine(71,10,71,37,1); |
Nikollao | 18:5405ee7e243b | 409 | |
Nikollao | 18:5405ee7e243b | 410 | lcd.drawRect(11+objectX,objectY,2,2,1); /// draw moving obstacles on screen |
Nikollao | 18:5405ee7e243b | 411 | lcd.drawRect(objectX1,10+objectY,2,2,1); |
Nikollao | 18:5405ee7e243b | 412 | lcd.drawRect(80,10,2,2,1); ///draw stable obstacles |
Nikollao | 18:5405ee7e243b | 413 | lcd.drawRect(5,10,2,2,1); |
Nikollao | 18:5405ee7e243b | 414 | lcd.drawRect(80,20,2,2,1); |
Nikollao | 18:5405ee7e243b | 415 | lcd.drawRect(5,20,2,2,1); |
Nikollao | 18:5405ee7e243b | 416 | lcd.drawRect(80,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 417 | lcd.drawRect(5,30,2,2,1); |
Nikollao | 18:5405ee7e243b | 418 | } else if (level == 7) { |
Nikollao | 18:5405ee7e243b | 419 | |
Nikollao | 18:5405ee7e243b | 420 | /* |
Nikollao | 18:5405ee7e243b | 421 | lcd.drawLine(50,15,30,15,1); |
Nikollao | 18:5405ee7e243b | 422 | lcd.drawLine(30,15,30,35,1); |
Nikollao | 18:5405ee7e243b | 423 | lcd.drawLine(30,25,45,25,1); |
Nikollao | 18:5405ee7e243b | 424 | */ |
Nikollao | 18:5405ee7e243b | 425 | } |
Nikollao | 18:5405ee7e243b | 426 | } |
Nikollao | 18:5405ee7e243b | 427 | |
Nikollao | 18:5405ee7e243b | 428 | |
Nikollao | 18:5405ee7e243b | 429 | void calibrateJoystick() |
Nikollao | 18:5405ee7e243b | 430 | { |
Nikollao | 18:5405ee7e243b | 431 | // must not move during calibration |
Nikollao | 18:5405ee7e243b | 432 | joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly) |
Nikollao | 18:5405ee7e243b | 433 | joystick.y0 = yPot; |
Nikollao | 18:5405ee7e243b | 434 | } |
Nikollao | 18:5405ee7e243b | 435 | void updateJoystick() |
Nikollao | 18:5405ee7e243b | 436 | { |
Nikollao | 18:5405ee7e243b | 437 | // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred) |
Nikollao | 18:5405ee7e243b | 438 | joystick.x = xPot - joystick.x0; |
Nikollao | 18:5405ee7e243b | 439 | joystick.y = yPot - joystick.y0; |
Nikollao | 18:5405ee7e243b | 440 | // read button state |
Nikollao | 18:5405ee7e243b | 441 | joystick.button = button; |
Nikollao | 18:5405ee7e243b | 442 | |
Nikollao | 18:5405ee7e243b | 443 | // calculate direction depending on x,y values |
Nikollao | 18:5405ee7e243b | 444 | // tolerance allows a little lee-way in case joystick not exactly in the stated direction |
Nikollao | 18:5405ee7e243b | 445 | if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 446 | joystick.direction = CENTRE; |
Nikollao | 18:5405ee7e243b | 447 | } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 448 | joystick.direction = UP; |
Nikollao | 18:5405ee7e243b | 449 | } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 450 | joystick.direction = DOWN; |
Nikollao | 18:5405ee7e243b | 451 | } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 452 | joystick.direction = RIGHT; |
Nikollao | 18:5405ee7e243b | 453 | } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 454 | joystick.direction = LEFT; |
Nikollao | 18:5405ee7e243b | 455 | } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 456 | joystick.direction = UP_LEFT; |
Nikollao | 18:5405ee7e243b | 457 | } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 458 | joystick.direction = UP_RIGHT; |
Nikollao | 18:5405ee7e243b | 459 | } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 460 | joystick.direction = DOWN_LEFT; |
Nikollao | 18:5405ee7e243b | 461 | } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) { |
Nikollao | 18:5405ee7e243b | 462 | joystick.direction = DOWN_RIGHT; |
Nikollao | 18:5405ee7e243b | 463 | } |
Nikollao | 18:5405ee7e243b | 464 | } |
Nikollao | 18:5405ee7e243b | 465 | |
Nikollao | 18:5405ee7e243b | 466 | int menu() |
Nikollao | 18:5405ee7e243b | 467 | { |
Nikollao | 18:5405ee7e243b | 468 | while(1) { |
Nikollao | 18:5405ee7e243b | 469 | if (g_game_timer_flag) { |
Nikollao | 18:5405ee7e243b | 470 | g_game_timer_flag = 0; |
Nikollao | 18:5405ee7e243b | 471 | |
Nikollao | 18:5405ee7e243b | 472 | updateJoystick(); |
Nikollao | 18:5405ee7e243b | 473 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 474 | |
Nikollao | 18:5405ee7e243b | 475 | lcd.printString("Start Game",0,0); ///print the main |
Nikollao | 18:5405ee7e243b | 476 | lcd.printString("Settings",0,2); |
Nikollao | 18:5405ee7e243b | 477 | lcd.printString("Exit",0,4); |
Nikollao | 18:5405ee7e243b | 478 | //lcd.drawCircle(70,4,2,1); |
Nikollao | 19:70d40dac5ae0 | 479 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 480 | switch (joystick.direction) { ///check the direction of joystick |
Nikollao | 18:5405ee7e243b | 481 | case UP: |
Nikollao | 18:5405ee7e243b | 482 | option--; |
Nikollao | 18:5405ee7e243b | 483 | break; |
Nikollao | 18:5405ee7e243b | 484 | case DOWN: |
Nikollao | 18:5405ee7e243b | 485 | option++; |
Nikollao | 18:5405ee7e243b | 486 | break; |
Nikollao | 18:5405ee7e243b | 487 | } |
Nikollao | 18:5405ee7e243b | 488 | if (option < 0) { |
Nikollao | 18:5405ee7e243b | 489 | option = 2; |
Nikollao | 18:5405ee7e243b | 490 | } |
Nikollao | 18:5405ee7e243b | 491 | if (option > 2) { |
Nikollao | 18:5405ee7e243b | 492 | option = 0; |
Nikollao | 18:5405ee7e243b | 493 | } |
Nikollao | 18:5405ee7e243b | 494 | |
Nikollao | 18:5405ee7e243b | 495 | if (option == 0) { ///selection in menu depends on the value of int option |
Nikollao | 18:5405ee7e243b | 496 | lcd.drawCircle(70,4,2,1); |
Nikollao | 18:5405ee7e243b | 497 | } else if (option == 1) { |
Nikollao | 18:5405ee7e243b | 498 | lcd.drawCircle(55,20,2,1); |
Nikollao | 18:5405ee7e243b | 499 | } else if (option == 2) { |
Nikollao | 18:5405ee7e243b | 500 | lcd.drawCircle(35,35,2,1); |
Nikollao | 18:5405ee7e243b | 501 | } |
Nikollao | 18:5405ee7e243b | 502 | |
Nikollao | 18:5405ee7e243b | 503 | if(g_button_flag) { /// if button is pressed |
Nikollao | 18:5405ee7e243b | 504 | |
Nikollao | 18:5405ee7e243b | 505 | g_button_flag = 0; ///reset flag |
Nikollao | 18:5405ee7e243b | 506 | |
Nikollao | 18:5405ee7e243b | 507 | if (option == 0) { ///break the while loop, start game |
Nikollao | 18:5405ee7e243b | 508 | break; |
Nikollao | 18:5405ee7e243b | 509 | } |
Nikollao | 18:5405ee7e243b | 510 | |
Nikollao | 18:5405ee7e243b | 511 | else if (option == 1) { ///enter settings menu |
Nikollao | 18:5405ee7e243b | 512 | |
Nikollao | 18:5405ee7e243b | 513 | option = 0; |
Nikollao | 18:5405ee7e243b | 514 | |
Nikollao | 18:5405ee7e243b | 515 | while(1) { |
Nikollao | 18:5405ee7e243b | 516 | if (g_game_timer_flag) { |
Nikollao | 18:5405ee7e243b | 517 | g_game_timer_flag = 0; |
Nikollao | 18:5405ee7e243b | 518 | |
Nikollao | 18:5405ee7e243b | 519 | updateJoystick(); ///update joystick position |
Nikollao | 18:5405ee7e243b | 520 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 521 | if (normal) { |
Nikollao | 18:5405ee7e243b | 522 | if (sound) { |
Nikollao | 18:5405ee7e243b | 523 | lcd.printString("Game speed",0,0); ///print settings menu |
Nikollao | 18:5405ee7e243b | 524 | lcd.printString("Lcd:Inverse",0,1); |
Nikollao | 18:5405ee7e243b | 525 | lcd.printString("Sound:ON",0,2); |
Nikollao | 18:5405ee7e243b | 526 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 527 | } else { |
Nikollao | 18:5405ee7e243b | 528 | lcd.printString("Game speed",0,0); ///print settings menu |
Nikollao | 18:5405ee7e243b | 529 | lcd.printString("Lcd:Inverse",0,1); |
Nikollao | 18:5405ee7e243b | 530 | lcd.printString("Sound:OFF",0,2); |
Nikollao | 18:5405ee7e243b | 531 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 532 | } |
Nikollao | 18:5405ee7e243b | 533 | } else { |
Nikollao | 18:5405ee7e243b | 534 | if (sound) { |
Nikollao | 18:5405ee7e243b | 535 | lcd.printString("Game speed",0,0); ///print settings menu |
Nikollao | 18:5405ee7e243b | 536 | lcd.printString("Lcd: Normal",0,1); |
Nikollao | 18:5405ee7e243b | 537 | lcd.printString("Sound: ON",0,2); |
Nikollao | 18:5405ee7e243b | 538 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 539 | } else { |
Nikollao | 18:5405ee7e243b | 540 | lcd.printString("Game speed",0,0); ///print settings menu |
Nikollao | 18:5405ee7e243b | 541 | lcd.printString("Lcd: Normal",0,1); |
Nikollao | 18:5405ee7e243b | 542 | lcd.printString("Sound: OFF",0,2); |
Nikollao | 18:5405ee7e243b | 543 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 544 | } |
Nikollao | 18:5405ee7e243b | 545 | } |
Nikollao | 18:5405ee7e243b | 546 | switch (joystick.direction) { |
Nikollao | 18:5405ee7e243b | 547 | case UP: |
Nikollao | 18:5405ee7e243b | 548 | option--; |
Nikollao | 18:5405ee7e243b | 549 | break; |
Nikollao | 18:5405ee7e243b | 550 | case DOWN: |
Nikollao | 18:5405ee7e243b | 551 | option++; |
Nikollao | 18:5405ee7e243b | 552 | break; |
Nikollao | 18:5405ee7e243b | 553 | case CENTRE: |
Nikollao | 18:5405ee7e243b | 554 | option = option; |
Nikollao | 18:5405ee7e243b | 555 | break; |
Nikollao | 18:5405ee7e243b | 556 | } |
Nikollao | 18:5405ee7e243b | 557 | if (option < 0) { ///if selector is on the top of the screen and UP is pressed, selector goes to the bottom |
Nikollao | 18:5405ee7e243b | 558 | option = 3; |
Nikollao | 18:5405ee7e243b | 559 | } |
Nikollao | 18:5405ee7e243b | 560 | if (option > 3) { ///if selector is on the bottom of the screen and DOWN is pressed, selector goes to the top |
Nikollao | 18:5405ee7e243b | 561 | option = 0; |
Nikollao | 18:5405ee7e243b | 562 | } |
Nikollao | 18:5405ee7e243b | 563 | |
Nikollao | 18:5405ee7e243b | 564 | /// menu selection depends on the position of the Joystick |
Nikollao | 18:5405ee7e243b | 565 | if (option == 0) { |
Nikollao | 18:5405ee7e243b | 566 | lcd.drawCircle(70,4,2,1); |
Nikollao | 18:5405ee7e243b | 567 | } else if (option == 1) { |
Nikollao | 18:5405ee7e243b | 568 | lcd.drawCircle(70,12,2,1); |
Nikollao | 18:5405ee7e243b | 569 | } else if (option == 2) { |
Nikollao | 18:5405ee7e243b | 570 | lcd.drawCircle(70,20,2,1); |
Nikollao | 18:5405ee7e243b | 571 | } else { |
Nikollao | 18:5405ee7e243b | 572 | lcd.drawCircle(35,27,2,1); |
Nikollao | 18:5405ee7e243b | 573 | } |
Nikollao | 18:5405ee7e243b | 574 | if (g_button_flag) { ///if button is pressed |
Nikollao | 18:5405ee7e243b | 575 | g_button_flag = 0; ///reset button |
Nikollao | 18:5405ee7e243b | 576 | |
Nikollao | 18:5405ee7e243b | 577 | if (option == 0) { /// if user selects to modify speed of the game |
Nikollao | 18:5405ee7e243b | 578 | |
Nikollao | 18:5405ee7e243b | 579 | while(1) { ///set speed of the game |
Nikollao | 18:5405ee7e243b | 580 | |
Nikollao | 18:5405ee7e243b | 581 | if (g_game_timer_flag) { |
Nikollao | 18:5405ee7e243b | 582 | g_game_timer_flag = 0; |
Nikollao | 18:5405ee7e243b | 583 | updateJoystick(); |
Nikollao | 18:5405ee7e243b | 584 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 585 | if (speed == 0) { |
Nikollao | 18:5405ee7e243b | 586 | lcd.printString("Slow!",0,0); ///print game speed menu |
Nikollao | 18:5405ee7e243b | 587 | lcd.printString("Normal",0,1); |
Nikollao | 18:5405ee7e243b | 588 | lcd.printString("Fast",0,2); |
Nikollao | 18:5405ee7e243b | 589 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 590 | } else if (speed == 1) { |
Nikollao | 18:5405ee7e243b | 591 | lcd.printString("Slow",0,0); ///print game speed menu |
Nikollao | 18:5405ee7e243b | 592 | lcd.printString("Normal!",0,1); |
Nikollao | 18:5405ee7e243b | 593 | lcd.printString("Fast",0,2); |
Nikollao | 18:5405ee7e243b | 594 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 595 | } else if (speed == 2) { |
Nikollao | 18:5405ee7e243b | 596 | lcd.printString("Slow",0,0); ///print game speed menu |
Nikollao | 18:5405ee7e243b | 597 | lcd.printString("Normal",0,1); |
Nikollao | 18:5405ee7e243b | 598 | lcd.printString("Fast!",0,2); |
Nikollao | 18:5405ee7e243b | 599 | lcd.printString("Back",0,3); |
Nikollao | 18:5405ee7e243b | 600 | } |
Nikollao | 18:5405ee7e243b | 601 | |
Nikollao | 18:5405ee7e243b | 602 | switch (joystick.direction) { |
Nikollao | 18:5405ee7e243b | 603 | case UP: |
Nikollao | 18:5405ee7e243b | 604 | option--; |
Nikollao | 18:5405ee7e243b | 605 | break; |
Nikollao | 18:5405ee7e243b | 606 | case DOWN: |
Nikollao | 18:5405ee7e243b | 607 | option++; |
Nikollao | 18:5405ee7e243b | 608 | break; |
Nikollao | 18:5405ee7e243b | 609 | case CENTRE: |
Nikollao | 18:5405ee7e243b | 610 | option = option; |
Nikollao | 18:5405ee7e243b | 611 | break; |
Nikollao | 18:5405ee7e243b | 612 | } |
Nikollao | 18:5405ee7e243b | 613 | if (option < 0) { |
Nikollao | 18:5405ee7e243b | 614 | option = 3; |
Nikollao | 18:5405ee7e243b | 615 | } |
Nikollao | 18:5405ee7e243b | 616 | if (option > 3) { |
Nikollao | 18:5405ee7e243b | 617 | option = 0; |
Nikollao | 18:5405ee7e243b | 618 | } |
Nikollao | 18:5405ee7e243b | 619 | |
Nikollao | 18:5405ee7e243b | 620 | if (option == 0) { |
Nikollao | 18:5405ee7e243b | 621 | lcd.drawCircle(70,4,2,1); |
Nikollao | 18:5405ee7e243b | 622 | } else if (option == 1) { |
Nikollao | 18:5405ee7e243b | 623 | lcd.drawCircle(55,12,2,1); |
Nikollao | 18:5405ee7e243b | 624 | } else if (option == 2) { |
Nikollao | 18:5405ee7e243b | 625 | lcd.drawCircle(35,20,2,1); |
Nikollao | 18:5405ee7e243b | 626 | } else { |
Nikollao | 18:5405ee7e243b | 627 | lcd.drawCircle(35,27,2,1); |
Nikollao | 18:5405ee7e243b | 628 | } |
Nikollao | 18:5405ee7e243b | 629 | |
Nikollao | 18:5405ee7e243b | 630 | if (g_button_flag) { |
Nikollao | 18:5405ee7e243b | 631 | g_button_flag = 0; |
Nikollao | 18:5405ee7e243b | 632 | |
Nikollao | 18:5405ee7e243b | 633 | if (option == 0) { |
Nikollao | 18:5405ee7e243b | 634 | game_speed = 0.1; |
Nikollao | 18:5405ee7e243b | 635 | speed = 0; |
Nikollao | 18:5405ee7e243b | 636 | } else if (option == 1) { |
Nikollao | 18:5405ee7e243b | 637 | game_speed = 0.05; |
Nikollao | 18:5405ee7e243b | 638 | speed = 1; |
Nikollao | 18:5405ee7e243b | 639 | } else if (option == 2) { |
Nikollao | 18:5405ee7e243b | 640 | game_speed = 0.04; |
Nikollao | 18:5405ee7e243b | 641 | speed = 2; |
Nikollao | 18:5405ee7e243b | 642 | } else if (option == 3) { |
Nikollao | 18:5405ee7e243b | 643 | break; |
Nikollao | 18:5405ee7e243b | 644 | } |
Nikollao | 18:5405ee7e243b | 645 | } |
Nikollao | 18:5405ee7e243b | 646 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 647 | } |
Nikollao | 18:5405ee7e243b | 648 | sleep(); |
Nikollao | 18:5405ee7e243b | 649 | } |
Nikollao | 18:5405ee7e243b | 650 | } else if (option == 1) { /// Lcd inverse mode |
Nikollao | 18:5405ee7e243b | 651 | normal =! normal; |
Nikollao | 18:5405ee7e243b | 652 | if (normal) { |
Nikollao | 18:5405ee7e243b | 653 | lcd.inverseMode(); |
Nikollao | 18:5405ee7e243b | 654 | } else { |
Nikollao | 18:5405ee7e243b | 655 | lcd.normalMode(); |
Nikollao | 18:5405ee7e243b | 656 | } |
Nikollao | 18:5405ee7e243b | 657 | } else if (option == 2) { ///select sound or not |
Nikollao | 18:5405ee7e243b | 658 | |
Nikollao | 18:5405ee7e243b | 659 | sound =! sound; |
Nikollao | 18:5405ee7e243b | 660 | |
Nikollao | 18:5405ee7e243b | 661 | if (sound) |
Nikollao | 18:5405ee7e243b | 662 | buzzer.write(0.5); |
Nikollao | 18:5405ee7e243b | 663 | else |
Nikollao | 18:5405ee7e243b | 664 | buzzer.write(0.0); |
Nikollao | 18:5405ee7e243b | 665 | // buzzer.period(1/400); |
Nikollao | 18:5405ee7e243b | 666 | } else if(option == 3) { ///go back to main menu |
Nikollao | 18:5405ee7e243b | 667 | break; |
Nikollao | 18:5405ee7e243b | 668 | } |
Nikollao | 18:5405ee7e243b | 669 | } |
Nikollao | 18:5405ee7e243b | 670 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 671 | } |
Nikollao | 18:5405ee7e243b | 672 | sleep(); |
Nikollao | 18:5405ee7e243b | 673 | } |
Nikollao | 18:5405ee7e243b | 674 | } else if (option == 2) { ///turn off LED |
Nikollao | 18:5405ee7e243b | 675 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 676 | lcd.turnOff(); |
Nikollao | 18:5405ee7e243b | 677 | while(1) { |
Nikollao | 18:5405ee7e243b | 678 | deepsleep(); |
Nikollao | 18:5405ee7e243b | 679 | } |
Nikollao | 18:5405ee7e243b | 680 | } |
Nikollao | 18:5405ee7e243b | 681 | } |
Nikollao | 18:5405ee7e243b | 682 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 683 | } |
Nikollao | 18:5405ee7e243b | 684 | sleep(); |
Nikollao | 18:5405ee7e243b | 685 | } |
Nikollao | 18:5405ee7e243b | 686 | } |
Nikollao | 18:5405ee7e243b | 687 | |
Nikollao | 18:5405ee7e243b | 688 | int intersection(int i, int j) |
Nikollao | 18:5405ee7e243b | 689 | { |
Nikollao | 18:5405ee7e243b | 690 | /// check for overlap between enemies and hero |
Nikollao | 18:5405ee7e243b | 691 | n=0; |
Nikollao | 18:5405ee7e243b | 692 | |
Nikollao | 18:5405ee7e243b | 693 | if (lcd.getPixel(i-1,j-1)!=0) //pixel to the top-left |
Nikollao | 18:5405ee7e243b | 694 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 695 | if (lcd.getPixel(i-1,j)!=0) //pixel to the left |
Nikollao | 18:5405ee7e243b | 696 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 697 | if (lcd.getPixel(i-1,j+1)!=0) //pixel to the bottom-left |
Nikollao | 18:5405ee7e243b | 698 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 699 | if (lcd.getPixel(i,j-1)!=0) // pixel to the top |
Nikollao | 18:5405ee7e243b | 700 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 701 | if (lcd.getPixel(i,j+1)!=0) //pixel to the bottom |
Nikollao | 18:5405ee7e243b | 702 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 703 | if (lcd.getPixel(i+1,j-1)!=0) //pixel to the top-right |
Nikollao | 18:5405ee7e243b | 704 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 705 | if (lcd.getPixel(i+1,j)!=0) // pixel to the right |
Nikollao | 18:5405ee7e243b | 706 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 707 | if (lcd.getPixel(i+1,j+1)!=0) //pixel to the bottom right |
Nikollao | 18:5405ee7e243b | 708 | n++; // increase n by 1 |
Nikollao | 18:5405ee7e243b | 709 | return n; |
Nikollao | 18:5405ee7e243b | 710 | } |
Nikollao | 18:5405ee7e243b | 711 | |
Nikollao | 18:5405ee7e243b | 712 | void checkOverlap() |
Nikollao | 18:5405ee7e243b | 713 | { |
Nikollao | 18:5405ee7e243b | 714 | |
Nikollao | 18:5405ee7e243b | 715 | for (int i=40+heroX; i<50+heroX; i++) { |
Nikollao | 18:5405ee7e243b | 716 | for (int j=35+heroY; j<48+heroY; j++) { |
Nikollao | 18:5405ee7e243b | 717 | |
Nikollao | 18:5405ee7e243b | 718 | int check = intersection(i,j); |
Nikollao | 18:5405ee7e243b | 719 | //lcd.setPixel(i,j); |
Nikollao | 18:5405ee7e243b | 720 | char bit[50]; |
Nikollao | 18:5405ee7e243b | 721 | sprintf(bit,"Pixels: %d",check); |
Nikollao | 18:5405ee7e243b | 722 | |
Nikollao | 18:5405ee7e243b | 723 | |
Nikollao | 18:5405ee7e243b | 724 | for(int i = 40; i < 50; i++) { |
Nikollao | 18:5405ee7e243b | 725 | for (int j = 35; j < 47; j++) { |
Nikollao | 18:5405ee7e243b | 726 | |
Nikollao | 19:70d40dac5ae0 | 727 | if (lcd.getPixel(i,j) && check > 6) { |
Nikollao | 18:5405ee7e243b | 728 | check = 6; |
Nikollao | 18:5405ee7e243b | 729 | } |
Nikollao | 18:5405ee7e243b | 730 | } |
Nikollao | 18:5405ee7e243b | 731 | } |
Nikollao | 18:5405ee7e243b | 732 | if (check > 7) { |
Nikollao | 18:5405ee7e243b | 733 | tries--; |
Nikollao | 18:5405ee7e243b | 734 | //if tries |
Nikollao | 18:5405ee7e243b | 735 | |
Nikollao | 18:5405ee7e243b | 736 | lcd.printString("BANG!",0,0); |
Nikollao | 18:5405ee7e243b | 737 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 738 | wait(2); |
Nikollao | 18:5405ee7e243b | 739 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 740 | |
Nikollao | 18:5405ee7e243b | 741 | if (tries == 2) { |
Nikollao | 18:5405ee7e243b | 742 | |
Nikollao | 18:5405ee7e243b | 743 | lcd.printString("Ready.",20,1); |
Nikollao | 18:5405ee7e243b | 744 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 745 | wait(0.5); |
Nikollao | 18:5405ee7e243b | 746 | lcd.printString("Ready..",20,1); |
Nikollao | 18:5405ee7e243b | 747 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 748 | wait(0.5); |
Nikollao | 18:5405ee7e243b | 749 | lcd.printString("Ready...",20,1); |
Nikollao | 18:5405ee7e243b | 750 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 751 | wait(1); |
Nikollao | 18:5405ee7e243b | 752 | lcd.printString("GO!",31,2); |
Nikollao | 18:5405ee7e243b | 753 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 754 | wait(1); |
Nikollao | 18:5405ee7e243b | 755 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 756 | fsm_state = 1; ///2 lives left |
Nikollao | 18:5405ee7e243b | 757 | } else if (tries == 1) { |
Nikollao | 18:5405ee7e243b | 758 | |
Nikollao | 18:5405ee7e243b | 759 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 760 | lcd.printString("Last Chance!",10,2); |
Nikollao | 18:5405ee7e243b | 761 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 762 | wait(1); |
Nikollao | 18:5405ee7e243b | 763 | fsm_state = 2; //1 life left |
Nikollao | 18:5405ee7e243b | 764 | } else if (tries == 0) { |
Nikollao | 18:5405ee7e243b | 765 | |
Nikollao | 18:5405ee7e243b | 766 | fsm_state = 3; |
Nikollao | 18:5405ee7e243b | 767 | led_output=fsm[fsm_state]; |
Nikollao | 18:5405ee7e243b | 768 | lcd.clear(); |
Nikollao | 18:5405ee7e243b | 769 | lcd.printString("Game Over!",10,2); |
Nikollao | 18:5405ee7e243b | 770 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 771 | wait(2); |
Nikollao | 18:5405ee7e243b | 772 | |
Nikollao | 19:70d40dac5ae0 | 773 | ticker.detach(); |
Nikollao | 19:70d40dac5ae0 | 774 | game_ticker.attach(&game_timer_isr,0.2); |
Nikollao | 18:5405ee7e243b | 775 | lcd.clear(); |
Nikollao | 19:70d40dac5ae0 | 776 | lcd.printString("Play again!",0,0); |
Nikollao | 18:5405ee7e243b | 777 | lcd.drawCircle(70,4,2,1); |
Nikollao | 18:5405ee7e243b | 778 | lcd.refresh(); |
Nikollao | 18:5405ee7e243b | 779 | g_button_flag = 0; |
Nikollao | 18:5405ee7e243b | 780 | |
Nikollao | 18:5405ee7e243b | 781 | while(1) { |
Nikollao | 19:70d40dac5ae0 | 782 | if (g_button1_flag) { |
Nikollao | 18:5405ee7e243b | 783 | |
Nikollao | 19:70d40dac5ae0 | 784 | g_button1_flag = 0; |
Nikollao | 18:5405ee7e243b | 785 | level = 0; |
Nikollao | 18:5405ee7e243b | 786 | tries = 3; |
Nikollao | 18:5405ee7e243b | 787 | fsm_state = 0; |
Nikollao | 18:5405ee7e243b | 788 | led_output=fsm[fsm_state]; |
Nikollao | 18:5405ee7e243b | 789 | lcd.clear(); |
Nikollao | 19:70d40dac5ae0 | 790 | heroX = 0; |
Nikollao | 19:70d40dac5ae0 | 791 | heroY = 0; |
Nikollao | 19:70d40dac5ae0 | 792 | rectY = 0; |
Nikollao | 19:70d40dac5ae0 | 793 | circleX = 0; |
Nikollao | 18:5405ee7e243b | 794 | main(); |
Nikollao | 18:5405ee7e243b | 795 | } |
Nikollao | 18:5405ee7e243b | 796 | sleep(); |
Nikollao | 18:5405ee7e243b | 797 | } |
Nikollao | 18:5405ee7e243b | 798 | |
Nikollao | 18:5405ee7e243b | 799 | } |
Nikollao | 18:5405ee7e243b | 800 | heroX = 0; |
Nikollao | 18:5405ee7e243b | 801 | heroY = 0; |
Nikollao | 18:5405ee7e243b | 802 | rectY = 0; |
Nikollao | 18:5405ee7e243b | 803 | circleX = 0; |
Nikollao | 18:5405ee7e243b | 804 | led_output=fsm[fsm_state]; |
Nikollao | 18:5405ee7e243b | 805 | } |
Nikollao | 18:5405ee7e243b | 806 | |
Nikollao | 18:5405ee7e243b | 807 | } |
Nikollao | 18:5405ee7e243b | 808 | } |
Nikollao | 18:5405ee7e243b | 809 | } |
Nikollao | 18:5405ee7e243b | 810 | |
Nikollao | 18:5405ee7e243b | 811 | void error() |
Nikollao | 18:5405ee7e243b | 812 | { |
Nikollao | 18:5405ee7e243b | 813 | /// display error message |
Nikollao | 18:5405ee7e243b | 814 | while (1) { |
Nikollao | 18:5405ee7e243b | 815 | |
Nikollao | 18:5405ee7e243b | 816 | lcd.printString("Error!",0,0); |
Nikollao | 18:5405ee7e243b | 817 | r_led = 0; |
Nikollao | 18:5405ee7e243b | 818 | wait(0.2); |
Nikollao | 18:5405ee7e243b | 819 | r_led = 1; |
Nikollao | 18:5405ee7e243b | 820 | wait(0.2); |
Nikollao | 18:5405ee7e243b | 821 | } |
Nikollao | 18:5405ee7e243b | 822 | } |
Nikollao | 18:5405ee7e243b | 823 | |
Nikollao | 18:5405ee7e243b | 824 | |
Nikollao | 18:5405ee7e243b | 825 | |
Nikollao | 18:5405ee7e243b | 826 |