My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Fri Apr 29 19:35:13 2016 +0000
Revision:
15:c7af2ea5f164
Parent:
14:91ae0afe9037
Child:
16:a6ca6858af24
overlap done, menu done, keep improving!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nikollao 5:ffa498d7071f 1 /**
Nikollao 5:ffa498d7071f 2 @file main.h
Nikollao 5:ffa498d7071f 3 @brief Header file contains functions and variables
Nikollao 5:ffa498d7071f 4 @brief Treasure Hunt - Embedded Systems Project
Nikollao 5:ffa498d7071f 5 @brief Revision 1.0
Nikollao 5:ffa498d7071f 6 @author Nikollao Sulollari
Nikollao 5:ffa498d7071f 7 @Date 26/03/2016
Nikollao 5:ffa498d7071f 8 */
Nikollao 5:ffa498d7071f 9
Nikollao 5:ffa498d7071f 10 #ifndef MAIN_H
Nikollao 5:ffa498d7071f 11 #define MAIN_H
Nikollao 5:ffa498d7071f 12 #include "mbed.h"
Nikollao 7:f31a4b4beb91 13 #include "N5110.h"
Nikollao 11:53caf3d944a9 14 #include "SoftPWM.h"
Nikollao 5:ffa498d7071f 15
Nikollao 7:f31a4b4beb91 16 #define DIRECTION_TOLERANCE 0.05
Nikollao 7:f31a4b4beb91 17 /**
Nikollao 7:f31a4b4beb91 18 @nameSpace r_led
Nikollao 7:f31a4b4beb91 19 @brief output for status of red LED
Nikollao 7:f31a4b4beb91 20 */
Nikollao 7:f31a4b4beb91 21 DigitalOut r_led(LED_RED);
Nikollao 7:f31a4b4beb91 22
Nikollao 7:f31a4b4beb91 23 /**
Nikollao 7:f31a4b4beb91 24 @nameSpace g_led
Nikollao 7:f31a4b4beb91 25 @brief output for status of green LED
Nikollao 7:f31a4b4beb91 26 */
Nikollao 7:f31a4b4beb91 27 DigitalOut g_led(LED_GREEN);
Nikollao 5:ffa498d7071f 28
Nikollao 5:ffa498d7071f 29 /**
Nikollao 7:f31a4b4beb91 30 @nameSpace b_led
Nikollao 7:f31a4b4beb91 31 @brief output for status of blue LED
Nikollao 5:ffa498d7071f 32 */
Nikollao 2:af5b5d42e835 33 DigitalOut b_led(LED_BLUE);
Nikollao 2:af5b5d42e835 34
Nikollao 7:f31a4b4beb91 35 /**
Nikollao 15:c7af2ea5f164 36 @nameSpace blue_led
Nikollao 15:c7af2ea5f164 37 @brief output for status of blue LED
Nikollao 15:c7af2ea5f164 38 */
Nikollao 15:c7af2ea5f164 39 DigitalOut blue_led(PTA1);
Nikollao 15:c7af2ea5f164 40
Nikollao 15:c7af2ea5f164 41 /**
Nikollao 15:c7af2ea5f164 42 @nameSpace left_led
Nikollao 15:c7af2ea5f164 43 @brief output for status of left LED
Nikollao 15:c7af2ea5f164 44 */
Nikollao 15:c7af2ea5f164 45 DigitalOut left_led(PTB23);
Nikollao 15:c7af2ea5f164 46
Nikollao 15:c7af2ea5f164 47 /**
Nikollao 15:c7af2ea5f164 48 @nameSpace centre_led
Nikollao 15:c7af2ea5f164 49 @brief output for status of centre LED
Nikollao 15:c7af2ea5f164 50 */
Nikollao 15:c7af2ea5f164 51 DigitalOut centre_led(PTA2);
Nikollao 15:c7af2ea5f164 52
Nikollao 15:c7af2ea5f164 53 /**
Nikollao 15:c7af2ea5f164 54 @nameSpace right_LED
Nikollao 15:c7af2ea5f164 55 @brief output for status of right LED
Nikollao 15:c7af2ea5f164 56 */
Nikollao 15:c7af2ea5f164 57 DigitalOut right_led(PTC2);
Nikollao 15:c7af2ea5f164 58
Nikollao 15:c7af2ea5f164 59
Nikollao 15:c7af2ea5f164 60 /**
Nikollao 7:f31a4b4beb91 61 @nameSpace lcd
Nikollao 7:f31a4b4beb91 62 @brief object of the N5110 class
Nikollao 7:f31a4b4beb91 63 */
Nikollao 7:f31a4b4beb91 64 N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
Nikollao 7:f31a4b4beb91 65
Nikollao 7:f31a4b4beb91 66 /**
Nikollao 7:f31a4b4beb91 67 @nameSpace pc
Nikollao 7:f31a4b4beb91 68 @brief serial connection between mbed and pc
Nikollao 7:f31a4b4beb91 69 */
Nikollao 7:f31a4b4beb91 70 Serial pc(USBTX,USBRX);
Nikollao 7:f31a4b4beb91 71
Nikollao 2:af5b5d42e835 72 // K64F on-board switches
Nikollao 2:af5b5d42e835 73 InterruptIn sw2(SW2);
Nikollao 2:af5b5d42e835 74 InterruptIn sw3(SW3);
Nikollao 2:af5b5d42e835 75
Nikollao 7:f31a4b4beb91 76
Nikollao 7:f31a4b4beb91 77 /**
Nikollao 7:f31a4b4beb91 78 @nameSpace xPot
Nikollao 7:f31a4b4beb91 79 @brief read x-axis position from the value of the joystick
Nikollao 7:f31a4b4beb91 80 */
Nikollao 10:1d229362c134 81 AnalogIn xPot(PTB2);
Nikollao 7:f31a4b4beb91 82
Nikollao 7:f31a4b4beb91 83 /**
Nikollao 7:f31a4b4beb91 84 @nameSpace yPot
Nikollao 7:f31a4b4beb91 85 @brief read y-axis position from the value of the joystick
Nikollao 7:f31a4b4beb91 86 */
Nikollao 10:1d229362c134 87 AnalogIn yPot(PTB3);
Nikollao 10:1d229362c134 88
Nikollao 10:1d229362c134 89 /**
Nikollao 10:1d229362c134 90 @nameSpace button
Nikollao 10:1d229362c134 91 @brief interrupt executes an event triggered task
Nikollao 10:1d229362c134 92 */
Nikollao 10:1d229362c134 93 InterruptIn button(PTB10);
Nikollao 10:1d229362c134 94
Nikollao 10:1d229362c134 95 /**
Nikollao 10:1d229362c134 96 @nameSpace button
Nikollao 10:1d229362c134 97 @brief interrupt executes an event triggered task
Nikollao 10:1d229362c134 98 */
Nikollao 10:1d229362c134 99 InterruptIn button1(PTB18);
Nikollao 7:f31a4b4beb91 100
Nikollao 7:f31a4b4beb91 101 /**
Nikollao 7:f31a4b4beb91 102 @nameSpace buzzer
Nikollao 7:f31a4b4beb91 103 @brief create PWM signal to set buzzer duty cycle and period
Nikollao 7:f31a4b4beb91 104 */
Nikollao 11:53caf3d944a9 105 SoftPWM buzzer(PTB9);
Nikollao 7:f31a4b4beb91 106
Nikollao 7:f31a4b4beb91 107 /**
Nikollao 7:f31a4b4beb91 108 @nameSpace ticker
Nikollao 7:f31a4b4beb91 109 @brief interrupt executes a time-triggered task
Nikollao 7:f31a4b4beb91 110 */
Nikollao 7:f31a4b4beb91 111 Ticker ticker;
Nikollao 7:f31a4b4beb91 112
Nikollao 9:ce2d9c42edea 113
Nikollao 7:f31a4b4beb91 114 /**
Nikollao 7:f31a4b4beb91 115 @nameSpace game_ticker
Nikollao 7:f31a4b4beb91 116 @brief interrupt executes a time-triggered task
Nikollao 7:f31a4b4beb91 117 */
Nikollao 7:f31a4b4beb91 118 Ticker game_ticker;
Nikollao 7:f31a4b4beb91 119
Nikollao 7:f31a4b4beb91 120 /**
Nikollao 7:f31a4b4beb91 121 @nameSpace timeout
Nikollao 7:f31a4b4beb91 122 @brief interrupt calls a function after a specified amount of time
Nikollao 7:f31a4b4beb91 123 */
Nikollao 7:f31a4b4beb91 124 Timeout timeout;
Nikollao 7:f31a4b4beb91 125
Nikollao 7:f31a4b4beb91 126
Nikollao 7:f31a4b4beb91 127 /**
Nikollao 7:f31a4b4beb91 128 @nameSpace DirectionName
Nikollao 7:f31a4b4beb91 129 @brief define joystick's direction based on its x,y values
Nikollao 7:f31a4b4beb91 130 */
Nikollao 7:f31a4b4beb91 131 enum DirectionName {
Nikollao 7:f31a4b4beb91 132 UP,
Nikollao 7:f31a4b4beb91 133 DOWN,
Nikollao 7:f31a4b4beb91 134 LEFT,
Nikollao 7:f31a4b4beb91 135 RIGHT,
Nikollao 7:f31a4b4beb91 136 CENTRE,
Nikollao 7:f31a4b4beb91 137 UP_LEFT,
Nikollao 7:f31a4b4beb91 138 UP_RIGHT,
Nikollao 7:f31a4b4beb91 139 DOWN_LEFT,
Nikollao 7:f31a4b4beb91 140 DOWN_RIGHT
Nikollao 7:f31a4b4beb91 141 };
Nikollao 7:f31a4b4beb91 142
Nikollao 7:f31a4b4beb91 143 /**
Nikollao 7:f31a4b4beb91 144 @nameSpace Joystick
Nikollao 7:f31a4b4beb91 145 @brief create strcut Joystick
Nikollao 7:f31a4b4beb91 146 */
Nikollao 7:f31a4b4beb91 147 typedef struct JoyStick Joystick;
Nikollao 7:f31a4b4beb91 148 struct JoyStick {
Nikollao 7:f31a4b4beb91 149 double x; /// current x value
Nikollao 7:f31a4b4beb91 150 double x0; /// 'centred' x value
Nikollao 7:f31a4b4beb91 151 double y; /// current y value
Nikollao 7:f31a4b4beb91 152 double y0; /// 'centred' y value
Nikollao 7:f31a4b4beb91 153 int button; /// button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
Nikollao 7:f31a4b4beb91 154 DirectionName direction; // current direction
Nikollao 7:f31a4b4beb91 155 };
Nikollao 7:f31a4b4beb91 156 /// create struct variable
Nikollao 7:f31a4b4beb91 157 Joystick joystick;
Nikollao 2:af5b5d42e835 158
Nikollao 11:53caf3d944a9 159 int main();
Nikollao 11:53caf3d944a9 160
Nikollao 5:ffa498d7071f 161 /**
Nikollao 5:ffa498d7071f 162 Displays an error message
Nikollao 5:ffa498d7071f 163 */
Nikollao 2:af5b5d42e835 164 void error();
Nikollao 5:ffa498d7071f 165
Nikollao 5:ffa498d7071f 166 /**
Nikollao 5:ffa498d7071f 167 set-up serial port
Nikollao 5:ffa498d7071f 168 */
Nikollao 2:af5b5d42e835 169 void init_serial();
Nikollao 5:ffa498d7071f 170
Nikollao 5:ffa498d7071f 171 /**
Nikollao 5:ffa498d7071f 172 set-up the on-board LEDs and switches
Nikollao 5:ffa498d7071f 173 */
Nikollao 2:af5b5d42e835 174 void init_K64F();
Nikollao 5:ffa498d7071f 175
Nikollao 5:ffa498d7071f 176 /**
Nikollao 5:ffa498d7071f 177 Set-up random variables and game menu
Nikollao 5:ffa498d7071f 178 */
Nikollao 2:af5b5d42e835 179 void init_game();
Nikollao 5:ffa498d7071f 180
Nikollao 5:ffa498d7071f 181 /**
Nikollao 5:ffa498d7071f 182 Set-up flag to 1
Nikollao 5:ffa498d7071f 183 */
Nikollao 5:ffa498d7071f 184
Nikollao 5:ffa498d7071f 185 /**
Nikollao 5:ffa498d7071f 186 Set-up flag to 1
Nikollao 5:ffa498d7071f 187 */
Nikollao 2:af5b5d42e835 188 void timer_isr();
Nikollao 5:ffa498d7071f 189
Nikollao 5:ffa498d7071f 190 /**
Nikollao 5:ffa498d7071f 191 Set-up flag to 1
Nikollao 5:ffa498d7071f 192 */
Nikollao 5:ffa498d7071f 193
Nikollao 5:ffa498d7071f 194 /**
Nikollao 5:ffa498d7071f 195 Set-up flag to 1
Nikollao 5:ffa498d7071f 196 */
Nikollao 2:af5b5d42e835 197 void game_timer_isr();
Nikollao 5:ffa498d7071f 198
Nikollao 5:ffa498d7071f 199 /**
Nikollao 5:ffa498d7071f 200 Set-up flag to 1
Nikollao 5:ffa498d7071f 201 */
Nikollao 2:af5b5d42e835 202 void sw2_isr();
Nikollao 5:ffa498d7071f 203
Nikollao 5:ffa498d7071f 204 /**
Nikollao 5:ffa498d7071f 205 Set-up flag to 1
Nikollao 5:ffa498d7071f 206 */
Nikollao 2:af5b5d42e835 207 void sw3_isr();
Nikollao 5:ffa498d7071f 208
Nikollao 5:ffa498d7071f 209 /**
Nikollao 5:ffa498d7071f 210 Set-up flag to 1
Nikollao 5:ffa498d7071f 211 */
Nikollao 2:af5b5d42e835 212 void button_isr();
Nikollao 5:ffa498d7071f 213
Nikollao 5:ffa498d7071f 214 /**
Nikollao 5:ffa498d7071f 215 Set-up flag to 1
Nikollao 5:ffa498d7071f 216 */
Nikollao 11:53caf3d944a9 217 void button1_isr();
Nikollao 11:53caf3d944a9 218
Nikollao 11:53caf3d944a9 219 /**
Nikollao 11:53caf3d944a9 220 Set-up flag to 1
Nikollao 11:53caf3d944a9 221 */
Nikollao 2:af5b5d42e835 222 void timeout_isr();
Nikollao 2:af5b5d42e835 223
Nikollao 9:ce2d9c42edea 224
Nikollao 5:ffa498d7071f 225 /**
Nikollao 5:ffa498d7071f 226 Set current position to default position of Joystick
Nikollao 5:ffa498d7071f 227 */
Nikollao 2:af5b5d42e835 228 void calibrateJoystick();
Nikollao 5:ffa498d7071f 229
Nikollao 5:ffa498d7071f 230 /**
Nikollao 5:ffa498d7071f 231 Update the values of the joystick to get current position
Nikollao 5:ffa498d7071f 232 */
Nikollao 2:af5b5d42e835 233 void updateJoystick();
Nikollao 2:af5b5d42e835 234
Nikollao 5:ffa498d7071f 235 /**
Nikollao 5:ffa498d7071f 236 Create an enemy rectangular shape
Nikollao 5:ffa498d7071f 237 */
Nikollao 2:af5b5d42e835 238 void enemyRect();
Nikollao 5:ffa498d7071f 239
Nikollao 5:ffa498d7071f 240 /**
Nikollao 5:ffa498d7071f 241 Create circle shape enemy
Nikollao 5:ffa498d7071f 242 */
Nikollao 2:af5b5d42e835 243 void enemyCircle();
Nikollao 5:ffa498d7071f 244
Nikollao 5:ffa498d7071f 245 /**
Nikollao 5:ffa498d7071f 246 creates the hero of the game
Nikollao 5:ffa498d7071f 247 */
Nikollao 2:af5b5d42e835 248 void hero();
Nikollao 5:ffa498d7071f 249
Nikollao 5:ffa498d7071f 250 /**
Nikollao 5:ffa498d7071f 251 Shows the right direction
Nikollao 5:ffa498d7071f 252 */
Nikollao 2:af5b5d42e835 253 void guidance();
Nikollao 5:ffa498d7071f 254
Nikollao 5:ffa498d7071f 255 /**
Nikollao 5:ffa498d7071f 256 Locates obstacles in the screen
Nikollao 5:ffa498d7071f 257 */
Nikollao 2:af5b5d42e835 258 void obstacles();
Nikollao 5:ffa498d7071f 259
Nikollao 5:ffa498d7071f 260 /**
Nikollao 5:ffa498d7071f 261 Gets enemies depending on the level
Nikollao 5:ffa498d7071f 262 */
Nikollao 3:d2cc054e8605 263 void enemies();
Nikollao 5:ffa498d7071f 264
Nikollao 5:ffa498d7071f 265 /**
Nikollao 5:ffa498d7071f 266 Get s vslue of the .y position, control menu
Nikollao 5:ffa498d7071f 267 */
Nikollao 2:af5b5d42e835 268 int menu();
Nikollao 4:f31bdc212241 269
Nikollao 6:c11bb31a06b3 270 //testing
Nikollao 6:c11bb31a06b3 271 void checkOverlap();
Nikollao 6:c11bb31a06b3 272 void userTouched();
Nikollao 6:c11bb31a06b3 273
Nikollao 5:ffa498d7071f 274 /**
Nikollao 5:ffa498d7071f 275 Check for intrersection
Nikollao 5:ffa498d7071f 276 @param i loops through x direction
Nikollao 5:ffa498d7071f 277 @param j loops through y direction
Nikollao 5:ffa498d7071f 278 @returns the number of pixels aroun the hero detected
Nikollao 5:ffa498d7071f 279 */
Nikollao 5:ffa498d7071f 280 int intersection(int i, int j);
Nikollao 5:ffa498d7071f 281
Nikollao 5:ffa498d7071f 282
Nikollao 7:f31a4b4beb91 283 //vars
Nikollao 7:f31a4b4beb91 284 volatile int rectX; /*!< used to determine x-axis position of the rect enemy */
Nikollao 7:f31a4b4beb91 285
Nikollao 7:f31a4b4beb91 286 volatile int rectY ;/*!< used to determine y-axis position of the rect enemy */
Nikollao 5:ffa498d7071f 287
Nikollao 6:c11bb31a06b3 288 volatile int circleX;/*!< used to determine x-axis position of the circular enemy */
Nikollao 5:ffa498d7071f 289
Nikollao 6:c11bb31a06b3 290 volatile int circleY;/*!< used to determine y-axis position of the circular enemy */
Nikollao 5:ffa498d7071f 291
Nikollao 6:c11bb31a06b3 292 volatile int heroX;/*!< used to move the hero along x-axis */
Nikollao 5:ffa498d7071f 293
Nikollao 6:c11bb31a06b3 294 volatile int heroY;/*!< used to move the hero along y-axis */
Nikollao 5:ffa498d7071f 295
Nikollao 6:c11bb31a06b3 296 volatile int level = 0; /*!< initiate the level difficulty of the game */
Nikollao 2:af5b5d42e835 297
Nikollao 6:c11bb31a06b3 298 volatile int g_timer_flag = 0; /*!< set timer flag in the isr, timer trigger interrupt */
Nikollao 5:ffa498d7071f 299
Nikollao 6:c11bb31a06b3 300 volatile int g_game_timer_flag = 0; /*!< set timer flag in the isr, timer trigger interrupt */
Nikollao 5:ffa498d7071f 301
Nikollao 6:c11bb31a06b3 302 volatile int g_sw2_flag = 0; /*!< set timer flag in the isr, event trigger interrupt */
Nikollao 5:ffa498d7071f 303
Nikollao 6:c11bb31a06b3 304 volatile int g_sw3_flag = 0; /*!< set timer flag in the isr, event trigger interrupt */
Nikollao 5:ffa498d7071f 305
Nikollao 10:1d229362c134 306 volatile int g_button_flag = 0; /*!< set flag in the isr, event trigger interrupt */
Nikollao 10:1d229362c134 307
Nikollao 10:1d229362c134 308 volatile int g_button1_flag = 0; /*!< set flag in the isr, event trigger interrupt */
Nikollao 2:af5b5d42e835 309
Nikollao 6:c11bb31a06b3 310 volatile int option = 0; /*!< select option in menu based on Joystick's movement */
Nikollao 5:ffa498d7071f 311
Nikollao 6:c11bb31a06b3 312 volatile int play = 0; /*!< counts the number of plays */
Nikollao 5:ffa498d7071f 313
Nikollao 15:c7af2ea5f164 314 volatile int tries = 3;/*!< counts the number of trials */
Nikollao 4:f31bdc212241 315
Nikollao 6:c11bb31a06b3 316 volatile int n;/*!< number of pixels overlapping */
Nikollao 13:359d3aa66352 317
Nikollao 13:359d3aa66352 318 volatile int game_speed;
Nikollao 4:f31bdc212241 319
Nikollao 6:c11bb31a06b3 320 int reset = 0; /*!< used to save current level of difficulty */
Nikollao 4:f31bdc212241 321
Nikollao 8:606a488fa720 322 int objectX = 0; /*!< used to move obstacles in the x-axis */
Nikollao 7:f31a4b4beb91 323
Nikollao 8:606a488fa720 324 int objectY = 20; /*!< used to move obstacles in the y-axis */
Nikollao 8:606a488fa720 325
Nikollao 8:606a488fa720 326 int state = 0; /*!< controls the direction of the objtacle */
Nikollao 9:ce2d9c42edea 327
Nikollao 9:ce2d9c42edea 328 int objectX1 = 58; /*!< used to move obstacles in the x-axis */
Nikollao 10:1d229362c134 329
Nikollao 9:ce2d9c42edea 330 int state1 = 1; /*!< controls the direction of the objtacle */
Nikollao 9:ce2d9c42edea 331
Nikollao 11:53caf3d944a9 332 int menuY = 5;
Nikollao 11:53caf3d944a9 333
Nikollao 15:c7af2ea5f164 334 bool normal=0;
Nikollao 15:c7af2ea5f164 335 bool sound = 0;
Nikollao 7:f31a4b4beb91 336
Nikollao 7:f31a4b4beb91 337 void enemies()
Nikollao 14:91ae0afe9037 338 { /// generate enemies in the screen depending on the level difficulty
Nikollao 7:f31a4b4beb91 339 if (level == 0) {
Nikollao 7:f31a4b4beb91 340
Nikollao 7:f31a4b4beb91 341 enemyRect();
Nikollao 7:f31a4b4beb91 342 //enemyCircle();
Nikollao 7:f31a4b4beb91 343 } else if (level == 1) {
Nikollao 7:f31a4b4beb91 344
Nikollao 7:f31a4b4beb91 345 enemyRect();
Nikollao 7:f31a4b4beb91 346 //enemyCircle();
Nikollao 7:f31a4b4beb91 347 } else if (level == 2) {
Nikollao 7:f31a4b4beb91 348
Nikollao 7:f31a4b4beb91 349 } else if (level == 3) {
Nikollao 7:f31a4b4beb91 350
Nikollao 7:f31a4b4beb91 351 }
Nikollao 7:f31a4b4beb91 352 enemyCircle();
Nikollao 7:f31a4b4beb91 353 }
Nikollao 7:f31a4b4beb91 354
Nikollao 7:f31a4b4beb91 355 void enemyRect()
Nikollao 14:91ae0afe9037 356 { ///generate rect shape enemy
Nikollao 7:f31a4b4beb91 357 lcd.drawRect(rectX,rectY,5,4,1);
Nikollao 7:f31a4b4beb91 358 rectX = rectX + rand()%4 - 2;
Nikollao 7:f31a4b4beb91 359 rectY++; ///enemy moving towards hero
Nikollao 7:f31a4b4beb91 360 }
Nikollao 7:f31a4b4beb91 361
Nikollao 7:f31a4b4beb91 362 void hero()
Nikollao 14:91ae0afe9037 363 {///cotrol hero
Nikollao 14:91ae0afe9037 364 if (joystick.direction == RIGHT) {
Nikollao 11:53caf3d944a9 365 heroX--;
Nikollao 8:606a488fa720 366 }
Nikollao 14:91ae0afe9037 367 else if (joystick.direction == LEFT){
Nikollao 11:53caf3d944a9 368 heroX++;
Nikollao 7:f31a4b4beb91 369 } else {
Nikollao 8:606a488fa720 370 heroX = heroX;
Nikollao 7:f31a4b4beb91 371 }
Nikollao 7:f31a4b4beb91 372
Nikollao 14:91ae0afe9037 373 if (joystick.direction == UP) {
Nikollao 7:f31a4b4beb91 374 heroY--;
Nikollao 8:606a488fa720 375 }
Nikollao 14:91ae0afe9037 376 else if (joystick.direction == DOWN) {
Nikollao 8:606a488fa720 377 heroY++;
Nikollao 7:f31a4b4beb91 378 } else {
Nikollao 8:606a488fa720 379 heroY = heroY;
Nikollao 7:f31a4b4beb91 380 }
Nikollao 14:91ae0afe9037 381
Nikollao 14:91ae0afe9037 382 if (joystick.direction == UP_LEFT) {
Nikollao 14:91ae0afe9037 383 heroY--;
Nikollao 14:91ae0afe9037 384 heroX++;
Nikollao 14:91ae0afe9037 385 }
Nikollao 14:91ae0afe9037 386 else if (joystick.direction == UP_RIGHT) {
Nikollao 14:91ae0afe9037 387 heroY--;
Nikollao 14:91ae0afe9037 388 heroX--;
Nikollao 14:91ae0afe9037 389 }
Nikollao 14:91ae0afe9037 390 else if (joystick.direction == DOWN_RIGHT) {
Nikollao 14:91ae0afe9037 391 heroY++;
Nikollao 14:91ae0afe9037 392 heroX--;
Nikollao 14:91ae0afe9037 393 }
Nikollao 14:91ae0afe9037 394 else if (joystick.direction == DOWN_LEFT) {
Nikollao 14:91ae0afe9037 395 heroY++;
Nikollao 14:91ae0afe9037 396 heroX++;
Nikollao 14:91ae0afe9037 397 }
Nikollao 14:91ae0afe9037 398
Nikollao 7:f31a4b4beb91 399 ///set x-axis boundaries so hero does not go out of screen
Nikollao 15:c7af2ea5f164 400 if (heroX > 40) {
Nikollao 15:c7af2ea5f164 401 heroX = -40;
Nikollao 15:c7af2ea5f164 402 }
Nikollao 15:c7af2ea5f164 403 if (heroX < -45) {
Nikollao 7:f31a4b4beb91 404 heroX = 35;
Nikollao 7:f31a4b4beb91 405 }
Nikollao 15:c7af2ea5f164 406 if (heroY < -45) { ///if hero has reached the top of the screen
Nikollao 15:c7af2ea5f164 407 heroY = 0; ///hero goes back to the bottom of the screen
Nikollao 15:c7af2ea5f164 408 level++; ///level increases by 1
Nikollao 15:c7af2ea5f164 409 }
Nikollao 15:c7af2ea5f164 410
Nikollao 15:c7af2ea5f164 411 if (heroY >= 0) {/// hero cannot go to previous level
Nikollao 15:c7af2ea5f164 412 heroY = 0;
Nikollao 7:f31a4b4beb91 413 }
Nikollao 7:f31a4b4beb91 414 ///draw hero
Nikollao 7:f31a4b4beb91 415 lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1);
Nikollao 7:f31a4b4beb91 416 lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1);
Nikollao 7:f31a4b4beb91 417 lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1);
Nikollao 7:f31a4b4beb91 418 lcd.drawCircle(44+heroX, 39+heroY,2,0);
Nikollao 7:f31a4b4beb91 419 }
Nikollao 7:f31a4b4beb91 420
Nikollao 7:f31a4b4beb91 421 void enemyCircle()
Nikollao 14:91ae0afe9037 422 {///generate circle shape enemy
Nikollao 7:f31a4b4beb91 423 lcd.drawCircle(circleX,circleY,4,1);
Nikollao 7:f31a4b4beb91 424 circleY = circleY + rand() %4 - 2;
Nikollao 8:606a488fa720 425
Nikollao 8:606a488fa720 426 if (circleY <= 10) {
Nikollao 15:c7af2ea5f164 427 circleY = 20;
Nikollao 8:606a488fa720 428 }if (circleY >= 35) {
Nikollao 8:606a488fa720 429 circleY = 35;
Nikollao 8:606a488fa720 430 }
Nikollao 15:c7af2ea5f164 431 if (circleX > 84) {
Nikollao 15:c7af2ea5f164 432 circleX = 0;
Nikollao 15:c7af2ea5f164 433 }
Nikollao 7:f31a4b4beb91 434 circleX++; ///enemy moving towards hero
Nikollao 7:f31a4b4beb91 435 }
Nikollao 7:f31a4b4beb91 436
Nikollao 7:f31a4b4beb91 437 void init_game()
Nikollao 7:f31a4b4beb91 438 {
Nikollao 7:f31a4b4beb91 439 ///initialise game
Nikollao 7:f31a4b4beb91 440 srand(time(NULL)); /// generate random numbers
Nikollao 7:f31a4b4beb91 441 rectY = 0; /// init rectX, rectY
Nikollao 7:f31a4b4beb91 442 rectX = rand() %40 + 20;
Nikollao 7:f31a4b4beb91 443 circleY = rand() %20 + 10; /// init circleX, circleY
Nikollao 7:f31a4b4beb91 444 circleX = 0;
Nikollao 7:f31a4b4beb91 445
Nikollao 14:91ae0afe9037 446 lcd.setBrightness(0.5); // put LED backlight on 50%
Nikollao 14:91ae0afe9037 447 lcd.printString("Welcome to",11,1);
Nikollao 14:91ae0afe9037 448 lcd.printString("Treasure Hunt!",1,3);
Nikollao 14:91ae0afe9037 449 lcd.refresh();
Nikollao 15:c7af2ea5f164 450 timeout.attach(&timeout_isr,3);
Nikollao 14:91ae0afe9037 451 sleep();
Nikollao 14:91ae0afe9037 452 lcd.clear();
Nikollao 7:f31a4b4beb91 453
Nikollao 7:f31a4b4beb91 454 }
Nikollao 7:f31a4b4beb91 455 void guidance()
Nikollao 14:91ae0afe9037 456 { /// show arrow to act as guidance towards the treasure
Nikollao 7:f31a4b4beb91 457 if (level < 7) { ///check level of difficulty
Nikollao 7:f31a4b4beb91 458
Nikollao 7:f31a4b4beb91 459 lcd.drawLine(42,0,42,4,1);
Nikollao 7:f31a4b4beb91 460 lcd.drawLine(42,0,40,2,1);
Nikollao 7:f31a4b4beb91 461 lcd.drawLine(42,0,44,2,1);
Nikollao 14:91ae0afe9037 462 }
Nikollao 14:91ae0afe9037 463 else if (level == 7) {
Nikollao 7:f31a4b4beb91 464
Nikollao 7:f31a4b4beb91 465 lcd.printString("F",42,0); /// print the treasure icon
Nikollao 14:91ae0afe9037 466 }
Nikollao 14:91ae0afe9037 467 else if (level == 8) {
Nikollao 7:f31a4b4beb91 468
Nikollao 7:f31a4b4beb91 469 ticker.detach();
Nikollao 7:f31a4b4beb91 470 lcd.clear();
Nikollao 7:f31a4b4beb91 471 lcd.printString("Well done!",0,0);
Nikollao 7:f31a4b4beb91 472 lcd.refresh();
Nikollao 7:f31a4b4beb91 473 timeout.attach(&timeout_isr,2);
Nikollao 7:f31a4b4beb91 474 sleep();
Nikollao 7:f31a4b4beb91 475 lcd.clear();
Nikollao 7:f31a4b4beb91 476 lcd.printString("Play again <",0,0);
Nikollao 7:f31a4b4beb91 477 lcd.refresh();
Nikollao 7:f31a4b4beb91 478 sleep();
Nikollao 11:53caf3d944a9 479 if (g_button1_flag) {
Nikollao 7:f31a4b4beb91 480
Nikollao 11:53caf3d944a9 481 g_button1_flag = 0;
Nikollao 7:f31a4b4beb91 482 level = 0;
Nikollao 8:606a488fa720 483 // play++;
Nikollao 7:f31a4b4beb91 484 lcd.clear();
Nikollao 11:53caf3d944a9 485 main();
Nikollao 11:53caf3d944a9 486 r_led = 0;
Nikollao 7:f31a4b4beb91 487 }
Nikollao 7:f31a4b4beb91 488 }
Nikollao 7:f31a4b4beb91 489 }
Nikollao 7:f31a4b4beb91 490
Nikollao 7:f31a4b4beb91 491 void obstacles()
Nikollao 7:f31a4b4beb91 492 {
Nikollao 7:f31a4b4beb91 493 /// place obstacles in the screen
Nikollao 7:f31a4b4beb91 494 /// as level difficulty increases, more obstacles are added
Nikollao 7:f31a4b4beb91 495 if (level == 1) {
Nikollao 7:f31a4b4beb91 496
Nikollao 7:f31a4b4beb91 497 lcd.drawRect(10,15,2,2,1);
Nikollao 7:f31a4b4beb91 498 lcd.drawRect(74,15,2,2,1);
Nikollao 7:f31a4b4beb91 499 } else if (level == 2) {
Nikollao 7:f31a4b4beb91 500
Nikollao 7:f31a4b4beb91 501 lcd.drawRect(10,15,2,2,1);
Nikollao 7:f31a4b4beb91 502 lcd.drawRect(74,15,2,2,1);
Nikollao 7:f31a4b4beb91 503 lcd.drawRect(10,28,2,2,1);
Nikollao 7:f31a4b4beb91 504 lcd.drawRect(74,28,2,2,1);
Nikollao 7:f31a4b4beb91 505 } else if (level == 3) {
Nikollao 7:f31a4b4beb91 506
Nikollao 8:606a488fa720 507 lcd.drawRect(5,12,2,2,1);
Nikollao 8:606a488fa720 508 lcd.drawRect(79,12,2,2,1);
Nikollao 8:606a488fa720 509 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 510 lcd.drawRect(79,30,2,2,1);
Nikollao 8:606a488fa720 511 lcd.drawRect(28,12,2,2,1);
Nikollao 8:606a488fa720 512 lcd.drawRect(52,12,2,2,1);
Nikollao 8:606a488fa720 513 lcd.drawRect(28,30,2,2,1);
Nikollao 8:606a488fa720 514 lcd.drawRect(52,30,2,2,1);
Nikollao 7:f31a4b4beb91 515 } else if (level == 4) {
Nikollao 7:f31a4b4beb91 516
Nikollao 8:606a488fa720 517 lcd.drawRect(5 ,12+ rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 518 lcd.drawRect(79 + rand() %4 - 2,12 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 519 lcd.drawRect(5+ rand() %4 - 2,30 ,2,2,1);
Nikollao 8:606a488fa720 520 lcd.drawRect(79 + rand() %4 - 2,30,2,2,1);
Nikollao 8:606a488fa720 521 lcd.drawRect(28 + rand() %4 - 2,12+ rand() %4,2,2,1);
Nikollao 8:606a488fa720 522 lcd.drawRect(52,12 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 523 lcd.drawRect(28,30 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 524 lcd.drawRect(52 + rand() %4 - 2,30,2,2,1);
Nikollao 8:606a488fa720 525 }
Nikollao 9:ce2d9c42edea 526 if (objectX == 0) { ///check position of obstacle
Nikollao 9:ce2d9c42edea 527 state = 0; ///assign states to the position of the obstacle
Nikollao 8:606a488fa720 528 }
Nikollao 9:ce2d9c42edea 529 else if (objectX == 60) {
Nikollao 7:f31a4b4beb91 530 state = 1;
Nikollao 8:606a488fa720 531 } else {
Nikollao 8:606a488fa720 532 state = state;
Nikollao 7:f31a4b4beb91 533 }
Nikollao 9:ce2d9c42edea 534 if (state == 0) { ///if state is 0 increase position on x-axis
Nikollao 7:f31a4b4beb91 535 objectX++;
Nikollao 8:606a488fa720 536 } else {
Nikollao 9:ce2d9c42edea 537 objectX--; ///else if state is 1 decrease position on x-axis
Nikollao 9:ce2d9c42edea 538 }
Nikollao 9:ce2d9c42edea 539
Nikollao 9:ce2d9c42edea 540 if (objectX1 == 68) {
Nikollao 9:ce2d9c42edea 541
Nikollao 9:ce2d9c42edea 542 state1 = 1;
Nikollao 9:ce2d9c42edea 543 }
Nikollao 9:ce2d9c42edea 544 else if (objectX1 == 10) {
Nikollao 9:ce2d9c42edea 545 state1 = 0;
Nikollao 9:ce2d9c42edea 546 }
Nikollao 9:ce2d9c42edea 547 if (state1 == 1) {
Nikollao 9:ce2d9c42edea 548 objectX1--;
Nikollao 9:ce2d9c42edea 549 } else if (state1 == 0) {
Nikollao 9:ce2d9c42edea 550 objectX1++;
Nikollao 9:ce2d9c42edea 551 }
Nikollao 9:ce2d9c42edea 552 objectY = objectY + rand() %4 - 2; ///set poistion of obstacle on y-axis to be valuable
Nikollao 7:f31a4b4beb91 553 ///keep moving object within boundaries
Nikollao 7:f31a4b4beb91 554 if (objectY <= 10) {
Nikollao 7:f31a4b4beb91 555 objectY = 10;
Nikollao 7:f31a4b4beb91 556 }
Nikollao 7:f31a4b4beb91 557 if (objectY >= 37) {
Nikollao 7:f31a4b4beb91 558 objectY = 37;
Nikollao 7:f31a4b4beb91 559 }
Nikollao 8:606a488fa720 560 if ( level == 5) {
Nikollao 7:f31a4b4beb91 561
Nikollao 7:f31a4b4beb91 562 lcd.drawLine(15,10,15,37,1);
Nikollao 7:f31a4b4beb91 563 lcd.drawLine(71,10,71,37,1);
Nikollao 8:606a488fa720 564
Nikollao 9:ce2d9c42edea 565 lcd.drawRect(11+objectX,objectY,2,2,1); ///draw obstacle
Nikollao 8:606a488fa720 566
Nikollao 8:606a488fa720 567 lcd.drawRect(80,10,2,2,1);
Nikollao 8:606a488fa720 568 lcd.drawRect(5,10,2,2,1);
Nikollao 8:606a488fa720 569 lcd.drawRect(80,20,2,2,1);
Nikollao 8:606a488fa720 570 lcd.drawRect(5,20,2,2,1);
Nikollao 8:606a488fa720 571 lcd.drawRect(80,30,2,2,1);
Nikollao 8:606a488fa720 572 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 573
Nikollao 8:606a488fa720 574 }
Nikollao 8:606a488fa720 575 else if (level == 6) {
Nikollao 8:606a488fa720 576
Nikollao 9:ce2d9c42edea 577 lcd.drawLine(15,10,15,37,1); ///draw boundaries
Nikollao 8:606a488fa720 578 lcd.drawLine(71,10,71,37,1);
Nikollao 8:606a488fa720 579
Nikollao 9:ce2d9c42edea 580 lcd.drawRect(11+objectX,objectY,2,2,1); /// draw moving obstacles on screen
Nikollao 9:ce2d9c42edea 581 lcd.drawRect(objectX1,10+objectY,2,2,1);
Nikollao 9:ce2d9c42edea 582 lcd.drawRect(80,10,2,2,1); ///draw stable obstacles
Nikollao 8:606a488fa720 583 lcd.drawRect(5,10,2,2,1);
Nikollao 8:606a488fa720 584 lcd.drawRect(80,20,2,2,1);
Nikollao 8:606a488fa720 585 lcd.drawRect(5,20,2,2,1);
Nikollao 8:606a488fa720 586 lcd.drawRect(80,30,2,2,1);
Nikollao 8:606a488fa720 587 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 588 }
Nikollao 8:606a488fa720 589 else if (level == 7) {
Nikollao 7:f31a4b4beb91 590
Nikollao 7:f31a4b4beb91 591 /*
Nikollao 7:f31a4b4beb91 592 lcd.drawLine(50,15,30,15,1);
Nikollao 7:f31a4b4beb91 593 lcd.drawLine(30,15,30,35,1);
Nikollao 7:f31a4b4beb91 594 lcd.drawLine(30,25,45,25,1);
Nikollao 7:f31a4b4beb91 595 */
Nikollao 7:f31a4b4beb91 596 }
Nikollao 7:f31a4b4beb91 597 }
Nikollao 7:f31a4b4beb91 598
Nikollao 7:f31a4b4beb91 599
Nikollao 7:f31a4b4beb91 600 void calibrateJoystick()
Nikollao 7:f31a4b4beb91 601 {
Nikollao 7:f31a4b4beb91 602 // must not move during calibration
Nikollao 7:f31a4b4beb91 603 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
Nikollao 7:f31a4b4beb91 604 joystick.y0 = yPot;
Nikollao 7:f31a4b4beb91 605 }
Nikollao 7:f31a4b4beb91 606 void updateJoystick()
Nikollao 7:f31a4b4beb91 607 {
Nikollao 7:f31a4b4beb91 608 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
Nikollao 7:f31a4b4beb91 609 joystick.x = xPot - joystick.x0;
Nikollao 7:f31a4b4beb91 610 joystick.y = yPot - joystick.y0;
Nikollao 7:f31a4b4beb91 611 // read button state
Nikollao 7:f31a4b4beb91 612 joystick.button = button;
Nikollao 7:f31a4b4beb91 613
Nikollao 7:f31a4b4beb91 614 // calculate direction depending on x,y values
Nikollao 7:f31a4b4beb91 615 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
Nikollao 7:f31a4b4beb91 616 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 617 joystick.direction = CENTRE;
Nikollao 7:f31a4b4beb91 618 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 619 joystick.direction = UP;
Nikollao 7:f31a4b4beb91 620 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 621 joystick.direction = DOWN;
Nikollao 7:f31a4b4beb91 622 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 623 joystick.direction = RIGHT;
Nikollao 7:f31a4b4beb91 624 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 625 joystick.direction = LEFT;
Nikollao 7:f31a4b4beb91 626 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 627 joystick.direction = UP_LEFT;
Nikollao 7:f31a4b4beb91 628 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 629 joystick.direction = UP_RIGHT;
Nikollao 7:f31a4b4beb91 630 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 631 joystick.direction = DOWN_LEFT;
Nikollao 7:f31a4b4beb91 632 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 633 joystick.direction = DOWN_RIGHT;
Nikollao 7:f31a4b4beb91 634 }
Nikollao 7:f31a4b4beb91 635 }
Nikollao 7:f31a4b4beb91 636
Nikollao 7:f31a4b4beb91 637 int menu()
Nikollao 7:f31a4b4beb91 638 {
Nikollao 11:53caf3d944a9 639 while(1) {
Nikollao 7:f31a4b4beb91 640
Nikollao 11:53caf3d944a9 641 updateJoystick();
Nikollao 11:53caf3d944a9 642 lcd.clear();
Nikollao 11:53caf3d944a9 643
Nikollao 14:91ae0afe9037 644 lcd.printString("Start Game",0,0); ///print the main
Nikollao 11:53caf3d944a9 645 lcd.printString("Settings",0,2);
Nikollao 11:53caf3d944a9 646 lcd.printString("Exit",0,4);
Nikollao 11:53caf3d944a9 647 //lcd.drawCircle(70,4,2,1);
Nikollao 11:53caf3d944a9 648
Nikollao 13:359d3aa66352 649 switch (joystick.direction) { ///check the direction of joystick
Nikollao 11:53caf3d944a9 650 case UP:
Nikollao 11:53caf3d944a9 651 option--;
Nikollao 11:53caf3d944a9 652 break;
Nikollao 11:53caf3d944a9 653 case DOWN:
Nikollao 11:53caf3d944a9 654 option++;
Nikollao 11:53caf3d944a9 655 break;
Nikollao 11:53caf3d944a9 656 }
Nikollao 11:53caf3d944a9 657 if (option < 0) {
Nikollao 11:53caf3d944a9 658 option = 2;
Nikollao 11:53caf3d944a9 659 }
Nikollao 11:53caf3d944a9 660 if (option > 2) {
Nikollao 11:53caf3d944a9 661 option = 0;
Nikollao 11:53caf3d944a9 662 }
Nikollao 11:53caf3d944a9 663
Nikollao 13:359d3aa66352 664 if (option == 0) { ///selection in menu depends on the value of int option
Nikollao 11:53caf3d944a9 665 lcd.drawCircle(70,4,2,1);
Nikollao 11:53caf3d944a9 666 } else if (option == 1) {
Nikollao 11:53caf3d944a9 667 lcd.drawCircle(55,20,2,1);
Nikollao 11:53caf3d944a9 668 } else if (option == 2) {
Nikollao 11:53caf3d944a9 669 lcd.drawCircle(35,35,2,1);
Nikollao 11:53caf3d944a9 670 }
Nikollao 11:53caf3d944a9 671
Nikollao 13:359d3aa66352 672 if(g_button_flag) { /// if button is pressed
Nikollao 11:53caf3d944a9 673
Nikollao 13:359d3aa66352 674 g_button_flag = 0; ///reset flag
Nikollao 11:53caf3d944a9 675
Nikollao 13:359d3aa66352 676 if (option == 0) { ///break the while loop, start game
Nikollao 11:53caf3d944a9 677 break;
Nikollao 13:359d3aa66352 678 }
Nikollao 13:359d3aa66352 679
Nikollao 13:359d3aa66352 680 else if (option == 1) { ///enter settings menu
Nikollao 13:359d3aa66352 681
Nikollao 11:53caf3d944a9 682 option = 0;
Nikollao 11:53caf3d944a9 683
Nikollao 11:53caf3d944a9 684 while(1) {
Nikollao 11:53caf3d944a9 685
Nikollao 13:359d3aa66352 686 updateJoystick(); ///update joystick position
Nikollao 11:53caf3d944a9 687 lcd.clear();
Nikollao 15:c7af2ea5f164 688 if (normal) {
Nikollao 15:c7af2ea5f164 689 if (sound) {
Nikollao 15:c7af2ea5f164 690 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 15:c7af2ea5f164 691 lcd.printString("Lcd:Inverse",0,1);
Nikollao 15:c7af2ea5f164 692 lcd.printString("Sound:ON",0,2);
Nikollao 15:c7af2ea5f164 693 lcd.printString("Back",0,3);
Nikollao 15:c7af2ea5f164 694 } else {
Nikollao 15:c7af2ea5f164 695 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 15:c7af2ea5f164 696 lcd.printString("Lcd:Inverse",0,1);
Nikollao 15:c7af2ea5f164 697 lcd.printString("Sound:OFF",0,2);
Nikollao 15:c7af2ea5f164 698 lcd.printString("Back",0,3);
Nikollao 15:c7af2ea5f164 699 }
Nikollao 15:c7af2ea5f164 700 } else {
Nikollao 15:c7af2ea5f164 701 if (sound) {
Nikollao 15:c7af2ea5f164 702 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 15:c7af2ea5f164 703 lcd.printString("Lcd: Normal",0,1);
Nikollao 15:c7af2ea5f164 704 lcd.printString("Sound: ON",0,2);
Nikollao 15:c7af2ea5f164 705 lcd.printString("Back",0,3);
Nikollao 15:c7af2ea5f164 706 } else {
Nikollao 15:c7af2ea5f164 707 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 15:c7af2ea5f164 708 lcd.printString("Lcd: Normal",0,1);
Nikollao 15:c7af2ea5f164 709 lcd.printString("Sound: OFF",0,2);
Nikollao 15:c7af2ea5f164 710 lcd.printString("Back",0,3);
Nikollao 15:c7af2ea5f164 711 }
Nikollao 15:c7af2ea5f164 712 }
Nikollao 11:53caf3d944a9 713 switch (joystick.direction) {
Nikollao 11:53caf3d944a9 714 case UP:
Nikollao 11:53caf3d944a9 715 option--;
Nikollao 11:53caf3d944a9 716 break;
Nikollao 11:53caf3d944a9 717 case DOWN:
Nikollao 11:53caf3d944a9 718 option++;
Nikollao 11:53caf3d944a9 719 break;
Nikollao 11:53caf3d944a9 720 case CENTRE:
Nikollao 11:53caf3d944a9 721 option = option;
Nikollao 11:53caf3d944a9 722 break;
Nikollao 11:53caf3d944a9 723 }
Nikollao 13:359d3aa66352 724 if (option < 0) { ///if selector is on the top of the screen and UP is pressed, selector goes to the bottom
Nikollao 13:359d3aa66352 725 option = 3;
Nikollao 11:53caf3d944a9 726 }
Nikollao 13:359d3aa66352 727 if (option > 3) { ///if selector is on the bottom of the screen and DOWN is pressed, selector goes to the top
Nikollao 11:53caf3d944a9 728 option = 0;
Nikollao 11:53caf3d944a9 729 }
Nikollao 11:53caf3d944a9 730
Nikollao 14:91ae0afe9037 731 /// menu selection depends on the position of the Joystick
Nikollao 11:53caf3d944a9 732 if (option == 0) {
Nikollao 14:91ae0afe9037 733 lcd.drawCircle(70,4,2,1);
Nikollao 11:53caf3d944a9 734 } else if (option == 1) {
Nikollao 15:c7af2ea5f164 735 lcd.drawCircle(70,12,2,1);
Nikollao 11:53caf3d944a9 736 } else if (option == 2) {
Nikollao 15:c7af2ea5f164 737 lcd.drawCircle(70,20,2,1);
Nikollao 13:359d3aa66352 738 } else {
Nikollao 13:359d3aa66352 739 lcd.drawCircle(35,27,2,1);
Nikollao 13:359d3aa66352 740 }
Nikollao 13:359d3aa66352 741 if (g_button_flag) { ///if button is pressed
Nikollao 13:359d3aa66352 742 g_button_flag = 0; ///reset button
Nikollao 13:359d3aa66352 743
Nikollao 14:91ae0afe9037 744 if (option == 0) { /// if user selects to modify speed of the game
Nikollao 13:359d3aa66352 745
Nikollao 13:359d3aa66352 746 while(1) { ///set speed of the game
Nikollao 13:359d3aa66352 747 updateJoystick();
Nikollao 13:359d3aa66352 748 lcd.clear();
Nikollao 13:359d3aa66352 749 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 13:359d3aa66352 750 lcd.printString("Normal",0,1);
Nikollao 13:359d3aa66352 751 lcd.printString("Fast",0,2);
Nikollao 13:359d3aa66352 752 lcd.printString("Back",0,3);
Nikollao 15:c7af2ea5f164 753
Nikollao 13:359d3aa66352 754 switch (joystick.direction) {
Nikollao 13:359d3aa66352 755 case UP:
Nikollao 13:359d3aa66352 756 option--;
Nikollao 13:359d3aa66352 757 break;
Nikollao 13:359d3aa66352 758 case DOWN:
Nikollao 13:359d3aa66352 759 option++;
Nikollao 13:359d3aa66352 760 break;
Nikollao 13:359d3aa66352 761 case CENTRE:
Nikollao 13:359d3aa66352 762 option = option;
Nikollao 13:359d3aa66352 763 break;
Nikollao 13:359d3aa66352 764 }
Nikollao 13:359d3aa66352 765 if (option < 0) {
Nikollao 13:359d3aa66352 766 option = 3;
Nikollao 13:359d3aa66352 767 }
Nikollao 13:359d3aa66352 768 if (option > 3) {
Nikollao 13:359d3aa66352 769 option = 0;
Nikollao 13:359d3aa66352 770 }
Nikollao 13:359d3aa66352 771
Nikollao 13:359d3aa66352 772 if (option == 0) {
Nikollao 13:359d3aa66352 773 lcd.drawCircle(70,4,2,1);
Nikollao 13:359d3aa66352 774 } else if (option == 1) {
Nikollao 13:359d3aa66352 775 lcd.drawCircle(55,12,2,1);
Nikollao 13:359d3aa66352 776 } else if (option == 2) {
Nikollao 13:359d3aa66352 777 lcd.drawCircle(35,20,2,1);
Nikollao 13:359d3aa66352 778 } else {
Nikollao 13:359d3aa66352 779 lcd.drawCircle(35,27,2,1);
Nikollao 13:359d3aa66352 780 }
Nikollao 13:359d3aa66352 781
Nikollao 13:359d3aa66352 782 if (g_button_flag) {
Nikollao 13:359d3aa66352 783 g_button_flag = 0;
Nikollao 13:359d3aa66352 784
Nikollao 13:359d3aa66352 785 if (option == 0) {
Nikollao 13:359d3aa66352 786 game_speed = 0.1;
Nikollao 13:359d3aa66352 787 } else if (option == 1) {
Nikollao 13:359d3aa66352 788 game_speed = 0.05;
Nikollao 13:359d3aa66352 789 } else if (option == 2) {
Nikollao 13:359d3aa66352 790 game_speed = 0.04;
Nikollao 13:359d3aa66352 791 } else if (option == 3) {
Nikollao 13:359d3aa66352 792 break;
Nikollao 13:359d3aa66352 793 }
Nikollao 13:359d3aa66352 794 }
Nikollao 13:359d3aa66352 795 lcd.refresh();
Nikollao 14:91ae0afe9037 796 sleep();
Nikollao 14:91ae0afe9037 797 sleep();
Nikollao 13:359d3aa66352 798 }
Nikollao 13:359d3aa66352 799 } else if (option == 1) { /// Lcd inverse mode
Nikollao 14:91ae0afe9037 800 normal =! normal;
Nikollao 15:c7af2ea5f164 801 if (normal) {
Nikollao 15:c7af2ea5f164 802 lcd.inverseMode();
Nikollao 15:c7af2ea5f164 803 } else {
Nikollao 15:c7af2ea5f164 804 lcd.normalMode();
Nikollao 14:91ae0afe9037 805 }
Nikollao 13:359d3aa66352 806 } else if (option == 2) { ///select sound or not
Nikollao 15:c7af2ea5f164 807
Nikollao 15:c7af2ea5f164 808 sound =! sound;
Nikollao 15:c7af2ea5f164 809
Nikollao 15:c7af2ea5f164 810 if (sound)
Nikollao 13:359d3aa66352 811 buzzer.write(0.5);
Nikollao 15:c7af2ea5f164 812 else
Nikollao 15:c7af2ea5f164 813 buzzer.write(0.0);
Nikollao 15:c7af2ea5f164 814 // buzzer.period(1/400);
Nikollao 13:359d3aa66352 815 } else if(option == 3) { ///go back to main menu
Nikollao 13:359d3aa66352 816 break;
Nikollao 13:359d3aa66352 817 }
Nikollao 11:53caf3d944a9 818 }
Nikollao 11:53caf3d944a9 819 lcd.refresh();
Nikollao 11:53caf3d944a9 820 sleep();
Nikollao 11:53caf3d944a9 821 }
Nikollao 13:359d3aa66352 822 } else if (option == 2) { ///turn off LED
Nikollao 11:53caf3d944a9 823 lcd.clear();
Nikollao 11:53caf3d944a9 824 lcd.turnOff();
Nikollao 11:53caf3d944a9 825 deepsleep();
Nikollao 11:53caf3d944a9 826 }
Nikollao 11:53caf3d944a9 827 }
Nikollao 11:53caf3d944a9 828 lcd.refresh();
Nikollao 11:53caf3d944a9 829 sleep();
Nikollao 7:f31a4b4beb91 830 }
Nikollao 7:f31a4b4beb91 831 }
Nikollao 7:f31a4b4beb91 832
Nikollao 7:f31a4b4beb91 833 int intersection(int i, int j)
Nikollao 7:f31a4b4beb91 834 {
Nikollao 7:f31a4b4beb91 835 /// check for overlap between enemies and hero
Nikollao 7:f31a4b4beb91 836 n=0;
Nikollao 7:f31a4b4beb91 837
Nikollao 7:f31a4b4beb91 838 if (lcd.getPixel(i-1,j-1)!=0) //pixel to the top-left
Nikollao 7:f31a4b4beb91 839 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 840 if (lcd.getPixel(i-1,j)!=0) //pixel to the left
Nikollao 7:f31a4b4beb91 841 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 842 if (lcd.getPixel(i-1,j+1)!=0) //pixel to the bottom-left
Nikollao 7:f31a4b4beb91 843 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 844 if (lcd.getPixel(i,j-1)!=0) // pixel to the top
Nikollao 7:f31a4b4beb91 845 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 846 if (lcd.getPixel(i,j+1)!=0) //pixel to the bottom
Nikollao 7:f31a4b4beb91 847 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 848 if (lcd.getPixel(i+1,j-1)!=0) //pixel to the top-right
Nikollao 7:f31a4b4beb91 849 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 850 if (lcd.getPixel(i+1,j)!=0) // pixel to the right
Nikollao 7:f31a4b4beb91 851 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 852 if (lcd.getPixel(i+1,j+1)!=0) //pixel to the bottom right
Nikollao 7:f31a4b4beb91 853 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 854 return n;
Nikollao 7:f31a4b4beb91 855 }
Nikollao 7:f31a4b4beb91 856
Nikollao 7:f31a4b4beb91 857 void checkOverlap()
Nikollao 7:f31a4b4beb91 858 {
Nikollao 7:f31a4b4beb91 859
Nikollao 7:f31a4b4beb91 860 for (int i=40+heroX; i<50+heroX; i++) {
Nikollao 7:f31a4b4beb91 861 for (int j=35+heroY; j<48+heroY; j++) {
Nikollao 15:c7af2ea5f164 862
Nikollao 14:91ae0afe9037 863 int check = intersection(i,j);
Nikollao 14:91ae0afe9037 864 //lcd.setPixel(i,j);
Nikollao 14:91ae0afe9037 865 char bit[50];
Nikollao 14:91ae0afe9037 866 sprintf(bit,"Pixels: %d",check);
Nikollao 15:c7af2ea5f164 867
Nikollao 11:53caf3d944a9 868
Nikollao 15:c7af2ea5f164 869 for(int i = 40; i < 45; i++) {
Nikollao 15:c7af2ea5f164 870 for (int j = -5; i < 5; j++) {
Nikollao 15:c7af2ea5f164 871
Nikollao 15:c7af2ea5f164 872 if (check > 6) {
Nikollao 15:c7af2ea5f164 873 check = 6;
Nikollao 14:91ae0afe9037 874 }
Nikollao 14:91ae0afe9037 875 }
Nikollao 15:c7af2ea5f164 876 }
Nikollao 15:c7af2ea5f164 877 if (check > 7) {
Nikollao 14:91ae0afe9037 878
Nikollao 14:91ae0afe9037 879 lcd.printString(bit,0,0);
Nikollao 14:91ae0afe9037 880 lcd.refresh();
Nikollao 15:c7af2ea5f164 881 tries--;
Nikollao 15:c7af2ea5f164 882 if(tries == 2) {
Nikollao 15:c7af2ea5f164 883 right_led = 0;
Nikollao 15:c7af2ea5f164 884 }else if (tries == 1) {
Nikollao 15:c7af2ea5f164 885 centre_led = 0;
Nikollao 15:c7af2ea5f164 886 }else if(tries == 0){
Nikollao 15:c7af2ea5f164 887 left_led = 0;
Nikollao 15:c7af2ea5f164 888 //gameOver();
Nikollao 15:c7af2ea5f164 889 }
Nikollao 15:c7af2ea5f164 890 wait(2);
Nikollao 15:c7af2ea5f164 891 heroX = 0;
Nikollao 15:c7af2ea5f164 892 heroY = 0;
Nikollao 14:91ae0afe9037 893 }
Nikollao 15:c7af2ea5f164 894
Nikollao 7:f31a4b4beb91 895 }
Nikollao 7:f31a4b4beb91 896 }
Nikollao 7:f31a4b4beb91 897 }
Nikollao 7:f31a4b4beb91 898
Nikollao 7:f31a4b4beb91 899 void error()
Nikollao 7:f31a4b4beb91 900 {
Nikollao 7:f31a4b4beb91 901 /// display error message
Nikollao 7:f31a4b4beb91 902 while (1) {
Nikollao 7:f31a4b4beb91 903
Nikollao 7:f31a4b4beb91 904 lcd.printString("Error!",0,0);
Nikollao 7:f31a4b4beb91 905 r_led = 0;
Nikollao 7:f31a4b4beb91 906 wait(0.2);
Nikollao 7:f31a4b4beb91 907 r_led = 1;
Nikollao 7:f31a4b4beb91 908 wait(0.2);
Nikollao 7:f31a4b4beb91 909 }
Nikollao 7:f31a4b4beb91 910 }
Nikollao 7:f31a4b4beb91 911
Nikollao 5:ffa498d7071f 912 #endif
Nikollao 5:ffa498d7071f 913
Nikollao 7:f31a4b4beb91 914