My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Mon May 02 08:56:08 2016 +0000
Revision:
16:a6ca6858af24
Parent:
15:c7af2ea5f164
Child:
17:2d424db3975f
before testing Migel's way in my code

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
Nikollao 5:ffa498d7071f 273 /**
Nikollao 5:ffa498d7071f 274 Check for intrersection
Nikollao 5:ffa498d7071f 275 @param i loops through x direction
Nikollao 5:ffa498d7071f 276 @param j loops through y direction
Nikollao 5:ffa498d7071f 277 @returns the number of pixels aroun the hero detected
Nikollao 5:ffa498d7071f 278 */
Nikollao 5:ffa498d7071f 279 int intersection(int i, int j);
Nikollao 5:ffa498d7071f 280
Nikollao 5:ffa498d7071f 281
Nikollao 7:f31a4b4beb91 282 //vars
Nikollao 7:f31a4b4beb91 283 volatile int rectX; /*!< used to determine x-axis position of the rect enemy */
Nikollao 7:f31a4b4beb91 284
Nikollao 7:f31a4b4beb91 285 volatile int rectY ;/*!< used to determine y-axis position of the rect enemy */
Nikollao 5:ffa498d7071f 286
Nikollao 6:c11bb31a06b3 287 volatile int circleX;/*!< used to determine x-axis position of the circular enemy */
Nikollao 5:ffa498d7071f 288
Nikollao 6:c11bb31a06b3 289 volatile int circleY;/*!< used to determine y-axis position of the circular enemy */
Nikollao 5:ffa498d7071f 290
Nikollao 6:c11bb31a06b3 291 volatile int heroX;/*!< used to move the hero along x-axis */
Nikollao 5:ffa498d7071f 292
Nikollao 6:c11bb31a06b3 293 volatile int heroY;/*!< used to move the hero along y-axis */
Nikollao 5:ffa498d7071f 294
Nikollao 6:c11bb31a06b3 295 volatile int level = 0; /*!< initiate the level difficulty of the game */
Nikollao 2:af5b5d42e835 296
Nikollao 6:c11bb31a06b3 297 volatile int g_timer_flag = 0; /*!< set timer flag in the isr, timer trigger interrupt */
Nikollao 5:ffa498d7071f 298
Nikollao 6:c11bb31a06b3 299 volatile int g_game_timer_flag = 0; /*!< set timer flag in the isr, timer trigger interrupt */
Nikollao 5:ffa498d7071f 300
Nikollao 6:c11bb31a06b3 301 volatile int g_sw2_flag = 0; /*!< set timer flag in the isr, event trigger interrupt */
Nikollao 5:ffa498d7071f 302
Nikollao 6:c11bb31a06b3 303 volatile int g_sw3_flag = 0; /*!< set timer flag in the isr, event trigger interrupt */
Nikollao 5:ffa498d7071f 304
Nikollao 10:1d229362c134 305 volatile int g_button_flag = 0; /*!< set flag in the isr, event trigger interrupt */
Nikollao 10:1d229362c134 306
Nikollao 10:1d229362c134 307 volatile int g_button1_flag = 0; /*!< set flag in the isr, event trigger interrupt */
Nikollao 2:af5b5d42e835 308
Nikollao 6:c11bb31a06b3 309 volatile int option = 0; /*!< select option in menu based on Joystick's movement */
Nikollao 5:ffa498d7071f 310
Nikollao 6:c11bb31a06b3 311 volatile int play = 0; /*!< counts the number of plays */
Nikollao 5:ffa498d7071f 312
Nikollao 15:c7af2ea5f164 313 volatile int tries = 3;/*!< counts the number of trials */
Nikollao 4:f31bdc212241 314
Nikollao 6:c11bb31a06b3 315 volatile int n;/*!< number of pixels overlapping */
Nikollao 13:359d3aa66352 316
Nikollao 16:a6ca6858af24 317 volatile float game_speed = 0.05; /*!< value is set to the ticker, allows user to select game speed */
Nikollao 4:f31bdc212241 318
Nikollao 6:c11bb31a06b3 319 int reset = 0; /*!< used to save current level of difficulty */
Nikollao 4:f31bdc212241 320
Nikollao 8:606a488fa720 321 int objectX = 0; /*!< used to move obstacles in the x-axis */
Nikollao 7:f31a4b4beb91 322
Nikollao 8:606a488fa720 323 int objectY = 20; /*!< used to move obstacles in the y-axis */
Nikollao 8:606a488fa720 324
Nikollao 8:606a488fa720 325 int state = 0; /*!< controls the direction of the objtacle */
Nikollao 9:ce2d9c42edea 326
Nikollao 9:ce2d9c42edea 327 int objectX1 = 58; /*!< used to move obstacles in the x-axis */
Nikollao 10:1d229362c134 328
Nikollao 9:ce2d9c42edea 329 int state1 = 1; /*!< controls the direction of the objtacle */
Nikollao 9:ce2d9c42edea 330
Nikollao 16:a6ca6858af24 331 //int menuY = 5; /*!< controls the position of the circle selector */
Nikollao 16:a6ca6858af24 332
Nikollao 16:a6ca6858af24 333 int speed = 1; /*!< controls the speed menu display */
Nikollao 11:53caf3d944a9 334
Nikollao 16:a6ca6858af24 335 bool normal=0; /*!< controls the lcd mode selection on menu */
Nikollao 16:a6ca6858af24 336
Nikollao 16:a6ca6858af24 337 bool sound = 0; /*!< determines if sound is on or off */
Nikollao 7:f31a4b4beb91 338
Nikollao 7:f31a4b4beb91 339 void enemies()
Nikollao 14:91ae0afe9037 340 { /// generate enemies in the screen depending on the level difficulty
Nikollao 7:f31a4b4beb91 341 if (level == 0) {
Nikollao 7:f31a4b4beb91 342
Nikollao 7:f31a4b4beb91 343 enemyRect();
Nikollao 7:f31a4b4beb91 344 //enemyCircle();
Nikollao 7:f31a4b4beb91 345 } else if (level == 1) {
Nikollao 7:f31a4b4beb91 346
Nikollao 7:f31a4b4beb91 347 enemyRect();
Nikollao 7:f31a4b4beb91 348 //enemyCircle();
Nikollao 7:f31a4b4beb91 349 } else if (level == 2) {
Nikollao 7:f31a4b4beb91 350
Nikollao 7:f31a4b4beb91 351 } else if (level == 3) {
Nikollao 7:f31a4b4beb91 352
Nikollao 7:f31a4b4beb91 353 }
Nikollao 7:f31a4b4beb91 354 enemyCircle();
Nikollao 16:a6ca6858af24 355 enemyRect();
Nikollao 7:f31a4b4beb91 356 }
Nikollao 7:f31a4b4beb91 357
Nikollao 7:f31a4b4beb91 358 void enemyRect()
Nikollao 14:91ae0afe9037 359 { ///generate rect shape enemy
Nikollao 7:f31a4b4beb91 360 lcd.drawRect(rectX,rectY,5,4,1);
Nikollao 7:f31a4b4beb91 361 rectX = rectX + rand()%4 - 2;
Nikollao 7:f31a4b4beb91 362 rectY++; ///enemy moving towards hero
Nikollao 16:a6ca6858af24 363 if (rectY == 50){
Nikollao 16:a6ca6858af24 364 rectY = 0;
Nikollao 16:a6ca6858af24 365 }
Nikollao 16:a6ca6858af24 366 if (rectX == 75 || rectX == 25) {
Nikollao 16:a6ca6858af24 367 rectX = 40+rand()%10 - 5;
Nikollao 16:a6ca6858af24 368 }
Nikollao 7:f31a4b4beb91 369 }
Nikollao 7:f31a4b4beb91 370
Nikollao 7:f31a4b4beb91 371 void hero()
Nikollao 14:91ae0afe9037 372 {///cotrol hero
Nikollao 14:91ae0afe9037 373 if (joystick.direction == RIGHT) {
Nikollao 11:53caf3d944a9 374 heroX--;
Nikollao 8:606a488fa720 375 }
Nikollao 14:91ae0afe9037 376 else if (joystick.direction == LEFT){
Nikollao 11:53caf3d944a9 377 heroX++;
Nikollao 7:f31a4b4beb91 378 } else {
Nikollao 8:606a488fa720 379 heroX = heroX;
Nikollao 7:f31a4b4beb91 380 }
Nikollao 7:f31a4b4beb91 381
Nikollao 14:91ae0afe9037 382 if (joystick.direction == UP) {
Nikollao 7:f31a4b4beb91 383 heroY--;
Nikollao 8:606a488fa720 384 }
Nikollao 14:91ae0afe9037 385 else if (joystick.direction == DOWN) {
Nikollao 8:606a488fa720 386 heroY++;
Nikollao 7:f31a4b4beb91 387 } else {
Nikollao 8:606a488fa720 388 heroY = heroY;
Nikollao 7:f31a4b4beb91 389 }
Nikollao 14:91ae0afe9037 390
Nikollao 14:91ae0afe9037 391 if (joystick.direction == UP_LEFT) {
Nikollao 14:91ae0afe9037 392 heroY--;
Nikollao 14:91ae0afe9037 393 heroX++;
Nikollao 14:91ae0afe9037 394 }
Nikollao 14:91ae0afe9037 395 else if (joystick.direction == UP_RIGHT) {
Nikollao 14:91ae0afe9037 396 heroY--;
Nikollao 14:91ae0afe9037 397 heroX--;
Nikollao 14:91ae0afe9037 398 }
Nikollao 14:91ae0afe9037 399 else if (joystick.direction == DOWN_RIGHT) {
Nikollao 14:91ae0afe9037 400 heroY++;
Nikollao 14:91ae0afe9037 401 heroX--;
Nikollao 14:91ae0afe9037 402 }
Nikollao 14:91ae0afe9037 403 else if (joystick.direction == DOWN_LEFT) {
Nikollao 14:91ae0afe9037 404 heroY++;
Nikollao 14:91ae0afe9037 405 heroX++;
Nikollao 14:91ae0afe9037 406 }
Nikollao 14:91ae0afe9037 407
Nikollao 7:f31a4b4beb91 408 ///set x-axis boundaries so hero does not go out of screen
Nikollao 15:c7af2ea5f164 409 if (heroX > 40) {
Nikollao 15:c7af2ea5f164 410 heroX = -40;
Nikollao 15:c7af2ea5f164 411 }
Nikollao 15:c7af2ea5f164 412 if (heroX < -45) {
Nikollao 7:f31a4b4beb91 413 heroX = 35;
Nikollao 7:f31a4b4beb91 414 }
Nikollao 15:c7af2ea5f164 415 if (heroY < -45) { ///if hero has reached the top of the screen
Nikollao 15:c7af2ea5f164 416 heroY = 0; ///hero goes back to the bottom of the screen
Nikollao 15:c7af2ea5f164 417 level++; ///level increases by 1
Nikollao 15:c7af2ea5f164 418 }
Nikollao 15:c7af2ea5f164 419
Nikollao 15:c7af2ea5f164 420 if (heroY >= 0) {/// hero cannot go to previous level
Nikollao 15:c7af2ea5f164 421 heroY = 0;
Nikollao 7:f31a4b4beb91 422 }
Nikollao 7:f31a4b4beb91 423 ///draw hero
Nikollao 7:f31a4b4beb91 424 lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1);
Nikollao 7:f31a4b4beb91 425 lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1);
Nikollao 7:f31a4b4beb91 426 lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1);
Nikollao 7:f31a4b4beb91 427 lcd.drawCircle(44+heroX, 39+heroY,2,0);
Nikollao 7:f31a4b4beb91 428 }
Nikollao 7:f31a4b4beb91 429
Nikollao 7:f31a4b4beb91 430 void enemyCircle()
Nikollao 14:91ae0afe9037 431 {///generate circle shape enemy
Nikollao 7:f31a4b4beb91 432 lcd.drawCircle(circleX,circleY,4,1);
Nikollao 7:f31a4b4beb91 433 circleY = circleY + rand() %4 - 2;
Nikollao 8:606a488fa720 434
Nikollao 8:606a488fa720 435 if (circleY <= 10) {
Nikollao 15:c7af2ea5f164 436 circleY = 20;
Nikollao 8:606a488fa720 437 }if (circleY >= 35) {
Nikollao 8:606a488fa720 438 circleY = 35;
Nikollao 8:606a488fa720 439 }
Nikollao 15:c7af2ea5f164 440 if (circleX > 84) {
Nikollao 15:c7af2ea5f164 441 circleX = 0;
Nikollao 15:c7af2ea5f164 442 }
Nikollao 7:f31a4b4beb91 443 circleX++; ///enemy moving towards hero
Nikollao 7:f31a4b4beb91 444 }
Nikollao 7:f31a4b4beb91 445
Nikollao 7:f31a4b4beb91 446 void init_game()
Nikollao 7:f31a4b4beb91 447 {
Nikollao 7:f31a4b4beb91 448 ///initialise game
Nikollao 7:f31a4b4beb91 449 srand(time(NULL)); /// generate random numbers
Nikollao 7:f31a4b4beb91 450 rectY = 0; /// init rectX, rectY
Nikollao 7:f31a4b4beb91 451 rectX = rand() %40 + 20;
Nikollao 7:f31a4b4beb91 452 circleY = rand() %20 + 10; /// init circleX, circleY
Nikollao 7:f31a4b4beb91 453 circleX = 0;
Nikollao 7:f31a4b4beb91 454
Nikollao 14:91ae0afe9037 455 lcd.setBrightness(0.5); // put LED backlight on 50%
Nikollao 14:91ae0afe9037 456 lcd.printString("Welcome to",11,1);
Nikollao 14:91ae0afe9037 457 lcd.printString("Treasure Hunt!",1,3);
Nikollao 14:91ae0afe9037 458 lcd.refresh();
Nikollao 16:a6ca6858af24 459 //timeout.attach(&timeout_isr,3);
Nikollao 16:a6ca6858af24 460 //sleep();
Nikollao 16:a6ca6858af24 461 wait(3);
Nikollao 14:91ae0afe9037 462 lcd.clear();
Nikollao 7:f31a4b4beb91 463
Nikollao 7:f31a4b4beb91 464 }
Nikollao 7:f31a4b4beb91 465 void guidance()
Nikollao 14:91ae0afe9037 466 { /// show arrow to act as guidance towards the treasure
Nikollao 7:f31a4b4beb91 467 if (level < 7) { ///check level of difficulty
Nikollao 7:f31a4b4beb91 468
Nikollao 7:f31a4b4beb91 469 lcd.drawLine(42,0,42,4,1);
Nikollao 7:f31a4b4beb91 470 lcd.drawLine(42,0,40,2,1);
Nikollao 7:f31a4b4beb91 471 lcd.drawLine(42,0,44,2,1);
Nikollao 14:91ae0afe9037 472 }
Nikollao 14:91ae0afe9037 473 else if (level == 7) {
Nikollao 7:f31a4b4beb91 474
Nikollao 7:f31a4b4beb91 475 lcd.printString("F",42,0); /// print the treasure icon
Nikollao 14:91ae0afe9037 476 }
Nikollao 14:91ae0afe9037 477 else if (level == 8) {
Nikollao 7:f31a4b4beb91 478
Nikollao 16:a6ca6858af24 479 //ticker.detach();
Nikollao 7:f31a4b4beb91 480 lcd.clear();
Nikollao 7:f31a4b4beb91 481 lcd.printString("Well done!",0,0);
Nikollao 7:f31a4b4beb91 482 lcd.refresh();
Nikollao 7:f31a4b4beb91 483 timeout.attach(&timeout_isr,2);
Nikollao 7:f31a4b4beb91 484 sleep();
Nikollao 7:f31a4b4beb91 485 lcd.clear();
Nikollao 16:a6ca6858af24 486 lcd.printString("Play again",0,0);
Nikollao 16:a6ca6858af24 487 lcd.drawCircle(70,4,2,1);
Nikollao 7:f31a4b4beb91 488 lcd.refresh();
Nikollao 16:a6ca6858af24 489 g_button1_flag = 0;
Nikollao 16:a6ca6858af24 490 while(1) {
Nikollao 16:a6ca6858af24 491 if (g_button1_flag) {
Nikollao 7:f31a4b4beb91 492
Nikollao 16:a6ca6858af24 493 g_button1_flag = 0;
Nikollao 16:a6ca6858af24 494 level = 0;
Nikollao 16:a6ca6858af24 495 // play++;
Nikollao 16:a6ca6858af24 496 lcd.clear();
Nikollao 16:a6ca6858af24 497 main();
Nikollao 16:a6ca6858af24 498 r_led = 0;
Nikollao 16:a6ca6858af24 499 lcd.refresh();
Nikollao 16:a6ca6858af24 500 }
Nikollao 16:a6ca6858af24 501 sleep();
Nikollao 7:f31a4b4beb91 502 }
Nikollao 7:f31a4b4beb91 503 }
Nikollao 7:f31a4b4beb91 504 }
Nikollao 7:f31a4b4beb91 505
Nikollao 7:f31a4b4beb91 506 void obstacles()
Nikollao 7:f31a4b4beb91 507 {
Nikollao 7:f31a4b4beb91 508 /// place obstacles in the screen
Nikollao 7:f31a4b4beb91 509 /// as level difficulty increases, more obstacles are added
Nikollao 7:f31a4b4beb91 510 if (level == 1) {
Nikollao 7:f31a4b4beb91 511
Nikollao 7:f31a4b4beb91 512 lcd.drawRect(10,15,2,2,1);
Nikollao 7:f31a4b4beb91 513 lcd.drawRect(74,15,2,2,1);
Nikollao 7:f31a4b4beb91 514 } else if (level == 2) {
Nikollao 7:f31a4b4beb91 515
Nikollao 7:f31a4b4beb91 516 lcd.drawRect(10,15,2,2,1);
Nikollao 7:f31a4b4beb91 517 lcd.drawRect(74,15,2,2,1);
Nikollao 7:f31a4b4beb91 518 lcd.drawRect(10,28,2,2,1);
Nikollao 7:f31a4b4beb91 519 lcd.drawRect(74,28,2,2,1);
Nikollao 7:f31a4b4beb91 520 } else if (level == 3) {
Nikollao 7:f31a4b4beb91 521
Nikollao 8:606a488fa720 522 lcd.drawRect(5,12,2,2,1);
Nikollao 8:606a488fa720 523 lcd.drawRect(79,12,2,2,1);
Nikollao 8:606a488fa720 524 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 525 lcd.drawRect(79,30,2,2,1);
Nikollao 8:606a488fa720 526 lcd.drawRect(28,12,2,2,1);
Nikollao 8:606a488fa720 527 lcd.drawRect(52,12,2,2,1);
Nikollao 8:606a488fa720 528 lcd.drawRect(28,30,2,2,1);
Nikollao 8:606a488fa720 529 lcd.drawRect(52,30,2,2,1);
Nikollao 7:f31a4b4beb91 530 } else if (level == 4) {
Nikollao 7:f31a4b4beb91 531
Nikollao 8:606a488fa720 532 lcd.drawRect(5 ,12+ rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 533 lcd.drawRect(79 + rand() %4 - 2,12 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 534 lcd.drawRect(5+ rand() %4 - 2,30 ,2,2,1);
Nikollao 8:606a488fa720 535 lcd.drawRect(79 + rand() %4 - 2,30,2,2,1);
Nikollao 8:606a488fa720 536 lcd.drawRect(28 + rand() %4 - 2,12+ rand() %4,2,2,1);
Nikollao 8:606a488fa720 537 lcd.drawRect(52,12 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 538 lcd.drawRect(28,30 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 539 lcd.drawRect(52 + rand() %4 - 2,30,2,2,1);
Nikollao 8:606a488fa720 540 }
Nikollao 9:ce2d9c42edea 541 if (objectX == 0) { ///check position of obstacle
Nikollao 9:ce2d9c42edea 542 state = 0; ///assign states to the position of the obstacle
Nikollao 8:606a488fa720 543 }
Nikollao 9:ce2d9c42edea 544 else if (objectX == 60) {
Nikollao 7:f31a4b4beb91 545 state = 1;
Nikollao 8:606a488fa720 546 } else {
Nikollao 8:606a488fa720 547 state = state;
Nikollao 7:f31a4b4beb91 548 }
Nikollao 9:ce2d9c42edea 549 if (state == 0) { ///if state is 0 increase position on x-axis
Nikollao 7:f31a4b4beb91 550 objectX++;
Nikollao 8:606a488fa720 551 } else {
Nikollao 9:ce2d9c42edea 552 objectX--; ///else if state is 1 decrease position on x-axis
Nikollao 9:ce2d9c42edea 553 }
Nikollao 9:ce2d9c42edea 554
Nikollao 9:ce2d9c42edea 555 if (objectX1 == 68) {
Nikollao 9:ce2d9c42edea 556
Nikollao 9:ce2d9c42edea 557 state1 = 1;
Nikollao 9:ce2d9c42edea 558 }
Nikollao 9:ce2d9c42edea 559 else if (objectX1 == 10) {
Nikollao 9:ce2d9c42edea 560 state1 = 0;
Nikollao 9:ce2d9c42edea 561 }
Nikollao 9:ce2d9c42edea 562 if (state1 == 1) {
Nikollao 9:ce2d9c42edea 563 objectX1--;
Nikollao 9:ce2d9c42edea 564 } else if (state1 == 0) {
Nikollao 9:ce2d9c42edea 565 objectX1++;
Nikollao 9:ce2d9c42edea 566 }
Nikollao 9:ce2d9c42edea 567 objectY = objectY + rand() %4 - 2; ///set poistion of obstacle on y-axis to be valuable
Nikollao 7:f31a4b4beb91 568 ///keep moving object within boundaries
Nikollao 7:f31a4b4beb91 569 if (objectY <= 10) {
Nikollao 7:f31a4b4beb91 570 objectY = 10;
Nikollao 7:f31a4b4beb91 571 }
Nikollao 7:f31a4b4beb91 572 if (objectY >= 37) {
Nikollao 7:f31a4b4beb91 573 objectY = 37;
Nikollao 7:f31a4b4beb91 574 }
Nikollao 8:606a488fa720 575 if ( level == 5) {
Nikollao 7:f31a4b4beb91 576
Nikollao 7:f31a4b4beb91 577 lcd.drawLine(15,10,15,37,1);
Nikollao 7:f31a4b4beb91 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 obstacle
Nikollao 8:606a488fa720 581
Nikollao 8:606a488fa720 582 lcd.drawRect(80,10,2,2,1);
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 }
Nikollao 8:606a488fa720 590 else if (level == 6) {
Nikollao 8:606a488fa720 591
Nikollao 9:ce2d9c42edea 592 lcd.drawLine(15,10,15,37,1); ///draw boundaries
Nikollao 8:606a488fa720 593 lcd.drawLine(71,10,71,37,1);
Nikollao 8:606a488fa720 594
Nikollao 9:ce2d9c42edea 595 lcd.drawRect(11+objectX,objectY,2,2,1); /// draw moving obstacles on screen
Nikollao 9:ce2d9c42edea 596 lcd.drawRect(objectX1,10+objectY,2,2,1);
Nikollao 9:ce2d9c42edea 597 lcd.drawRect(80,10,2,2,1); ///draw stable obstacles
Nikollao 8:606a488fa720 598 lcd.drawRect(5,10,2,2,1);
Nikollao 8:606a488fa720 599 lcd.drawRect(80,20,2,2,1);
Nikollao 8:606a488fa720 600 lcd.drawRect(5,20,2,2,1);
Nikollao 8:606a488fa720 601 lcd.drawRect(80,30,2,2,1);
Nikollao 8:606a488fa720 602 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 603 }
Nikollao 8:606a488fa720 604 else if (level == 7) {
Nikollao 7:f31a4b4beb91 605
Nikollao 7:f31a4b4beb91 606 /*
Nikollao 7:f31a4b4beb91 607 lcd.drawLine(50,15,30,15,1);
Nikollao 7:f31a4b4beb91 608 lcd.drawLine(30,15,30,35,1);
Nikollao 7:f31a4b4beb91 609 lcd.drawLine(30,25,45,25,1);
Nikollao 7:f31a4b4beb91 610 */
Nikollao 7:f31a4b4beb91 611 }
Nikollao 7:f31a4b4beb91 612 }
Nikollao 7:f31a4b4beb91 613
Nikollao 7:f31a4b4beb91 614
Nikollao 7:f31a4b4beb91 615 void calibrateJoystick()
Nikollao 7:f31a4b4beb91 616 {
Nikollao 7:f31a4b4beb91 617 // must not move during calibration
Nikollao 7:f31a4b4beb91 618 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
Nikollao 7:f31a4b4beb91 619 joystick.y0 = yPot;
Nikollao 7:f31a4b4beb91 620 }
Nikollao 7:f31a4b4beb91 621 void updateJoystick()
Nikollao 7:f31a4b4beb91 622 {
Nikollao 7:f31a4b4beb91 623 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
Nikollao 7:f31a4b4beb91 624 joystick.x = xPot - joystick.x0;
Nikollao 7:f31a4b4beb91 625 joystick.y = yPot - joystick.y0;
Nikollao 7:f31a4b4beb91 626 // read button state
Nikollao 7:f31a4b4beb91 627 joystick.button = button;
Nikollao 7:f31a4b4beb91 628
Nikollao 7:f31a4b4beb91 629 // calculate direction depending on x,y values
Nikollao 7:f31a4b4beb91 630 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
Nikollao 7:f31a4b4beb91 631 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 632 joystick.direction = CENTRE;
Nikollao 7:f31a4b4beb91 633 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 634 joystick.direction = UP;
Nikollao 7:f31a4b4beb91 635 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 636 joystick.direction = DOWN;
Nikollao 7:f31a4b4beb91 637 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 638 joystick.direction = RIGHT;
Nikollao 7:f31a4b4beb91 639 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 640 joystick.direction = LEFT;
Nikollao 7:f31a4b4beb91 641 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 642 joystick.direction = UP_LEFT;
Nikollao 7:f31a4b4beb91 643 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 644 joystick.direction = UP_RIGHT;
Nikollao 7:f31a4b4beb91 645 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 646 joystick.direction = DOWN_LEFT;
Nikollao 7:f31a4b4beb91 647 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 648 joystick.direction = DOWN_RIGHT;
Nikollao 7:f31a4b4beb91 649 }
Nikollao 7:f31a4b4beb91 650 }
Nikollao 7:f31a4b4beb91 651
Nikollao 7:f31a4b4beb91 652 int menu()
Nikollao 7:f31a4b4beb91 653 {
Nikollao 11:53caf3d944a9 654 while(1) {
Nikollao 16:a6ca6858af24 655 if (g_game_timer_flag) {
Nikollao 16:a6ca6858af24 656 g_game_timer_flag = 0;
Nikollao 11:53caf3d944a9 657
Nikollao 16:a6ca6858af24 658 updateJoystick();
Nikollao 16:a6ca6858af24 659 lcd.clear();
Nikollao 16:a6ca6858af24 660
Nikollao 16:a6ca6858af24 661 lcd.printString("Start Game",0,0); ///print the main
Nikollao 16:a6ca6858af24 662 lcd.printString("Settings",0,2);
Nikollao 16:a6ca6858af24 663 lcd.printString("Exit",0,4);
Nikollao 16:a6ca6858af24 664 //lcd.drawCircle(70,4,2,1);
Nikollao 11:53caf3d944a9 665
Nikollao 16:a6ca6858af24 666 switch (joystick.direction) { ///check the direction of joystick
Nikollao 16:a6ca6858af24 667 case UP:
Nikollao 16:a6ca6858af24 668 option--;
Nikollao 16:a6ca6858af24 669 break;
Nikollao 16:a6ca6858af24 670 case DOWN:
Nikollao 16:a6ca6858af24 671 option++;
Nikollao 16:a6ca6858af24 672 break;
Nikollao 16:a6ca6858af24 673 }
Nikollao 16:a6ca6858af24 674 if (option < 0) {
Nikollao 16:a6ca6858af24 675 option = 2;
Nikollao 16:a6ca6858af24 676 }
Nikollao 16:a6ca6858af24 677 if (option > 2) {
Nikollao 16:a6ca6858af24 678 option = 0;
Nikollao 16:a6ca6858af24 679 }
Nikollao 11:53caf3d944a9 680
Nikollao 16:a6ca6858af24 681 if (option == 0) { ///selection in menu depends on the value of int option
Nikollao 16:a6ca6858af24 682 lcd.drawCircle(70,4,2,1);
Nikollao 16:a6ca6858af24 683 } else if (option == 1) {
Nikollao 16:a6ca6858af24 684 lcd.drawCircle(55,20,2,1);
Nikollao 16:a6ca6858af24 685 } else if (option == 2) {
Nikollao 16:a6ca6858af24 686 lcd.drawCircle(35,35,2,1);
Nikollao 16:a6ca6858af24 687 }
Nikollao 11:53caf3d944a9 688
Nikollao 16:a6ca6858af24 689 if(g_button_flag) { /// if button is pressed
Nikollao 16:a6ca6858af24 690
Nikollao 16:a6ca6858af24 691 g_button_flag = 0; ///reset flag
Nikollao 11:53caf3d944a9 692
Nikollao 16:a6ca6858af24 693 if (option == 0) { ///break the while loop, start game
Nikollao 16:a6ca6858af24 694 break;
Nikollao 16:a6ca6858af24 695 }
Nikollao 16:a6ca6858af24 696
Nikollao 16:a6ca6858af24 697 else if (option == 1) { ///enter settings menu
Nikollao 11:53caf3d944a9 698
Nikollao 16:a6ca6858af24 699 option = 0;
Nikollao 13:359d3aa66352 700
Nikollao 16:a6ca6858af24 701 while(1) {
Nikollao 16:a6ca6858af24 702 if (g_game_timer_flag) {
Nikollao 16:a6ca6858af24 703 g_game_timer_flag = 0;
Nikollao 11:53caf3d944a9 704
Nikollao 16:a6ca6858af24 705 updateJoystick(); ///update joystick position
Nikollao 16:a6ca6858af24 706 lcd.clear();
Nikollao 16:a6ca6858af24 707 if (normal) {
Nikollao 16:a6ca6858af24 708 if (sound) {
Nikollao 16:a6ca6858af24 709 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 710 lcd.printString("Lcd:Inverse",0,1);
Nikollao 16:a6ca6858af24 711 lcd.printString("Sound:ON",0,2);
Nikollao 16:a6ca6858af24 712 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 713 } else {
Nikollao 16:a6ca6858af24 714 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 715 lcd.printString("Lcd:Inverse",0,1);
Nikollao 16:a6ca6858af24 716 lcd.printString("Sound:OFF",0,2);
Nikollao 16:a6ca6858af24 717 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 718 }
Nikollao 16:a6ca6858af24 719 } else {
Nikollao 16:a6ca6858af24 720 if (sound) {
Nikollao 16:a6ca6858af24 721 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 722 lcd.printString("Lcd: Normal",0,1);
Nikollao 16:a6ca6858af24 723 lcd.printString("Sound: ON",0,2);
Nikollao 16:a6ca6858af24 724 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 725 } else {
Nikollao 16:a6ca6858af24 726 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 727 lcd.printString("Lcd: Normal",0,1);
Nikollao 16:a6ca6858af24 728 lcd.printString("Sound: OFF",0,2);
Nikollao 16:a6ca6858af24 729 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 730 }
Nikollao 16:a6ca6858af24 731 }
Nikollao 16:a6ca6858af24 732 switch (joystick.direction) {
Nikollao 16:a6ca6858af24 733 case UP:
Nikollao 16:a6ca6858af24 734 option--;
Nikollao 16:a6ca6858af24 735 break;
Nikollao 16:a6ca6858af24 736 case DOWN:
Nikollao 16:a6ca6858af24 737 option++;
Nikollao 16:a6ca6858af24 738 break;
Nikollao 16:a6ca6858af24 739 case CENTRE:
Nikollao 16:a6ca6858af24 740 option = option;
Nikollao 16:a6ca6858af24 741 break;
Nikollao 16:a6ca6858af24 742 }
Nikollao 16:a6ca6858af24 743 if (option < 0) { ///if selector is on the top of the screen and UP is pressed, selector goes to the bottom
Nikollao 16:a6ca6858af24 744 option = 3;
Nikollao 16:a6ca6858af24 745 }
Nikollao 16:a6ca6858af24 746 if (option > 3) { ///if selector is on the bottom of the screen and DOWN is pressed, selector goes to the top
Nikollao 16:a6ca6858af24 747 option = 0;
Nikollao 16:a6ca6858af24 748 }
Nikollao 11:53caf3d944a9 749
Nikollao 16:a6ca6858af24 750 /// menu selection depends on the position of the Joystick
Nikollao 16:a6ca6858af24 751 if (option == 0) {
Nikollao 16:a6ca6858af24 752 lcd.drawCircle(70,4,2,1);
Nikollao 16:a6ca6858af24 753 } else if (option == 1) {
Nikollao 16:a6ca6858af24 754 lcd.drawCircle(70,12,2,1);
Nikollao 16:a6ca6858af24 755 } else if (option == 2) {
Nikollao 16:a6ca6858af24 756 lcd.drawCircle(70,20,2,1);
Nikollao 16:a6ca6858af24 757 } else {
Nikollao 16:a6ca6858af24 758 lcd.drawCircle(35,27,2,1);
Nikollao 16:a6ca6858af24 759 }
Nikollao 16:a6ca6858af24 760 if (g_button_flag) { ///if button is pressed
Nikollao 16:a6ca6858af24 761 g_button_flag = 0; ///reset button
Nikollao 11:53caf3d944a9 762
Nikollao 16:a6ca6858af24 763 if (option == 0) { /// if user selects to modify speed of the game
Nikollao 16:a6ca6858af24 764
Nikollao 16:a6ca6858af24 765 while(1) { ///set speed of the game
Nikollao 13:359d3aa66352 766
Nikollao 16:a6ca6858af24 767 if (g_game_timer_flag) {
Nikollao 16:a6ca6858af24 768 g_game_timer_flag = 0;
Nikollao 16:a6ca6858af24 769 updateJoystick();
Nikollao 16:a6ca6858af24 770 lcd.clear();
Nikollao 16:a6ca6858af24 771 if (speed == 0) {
Nikollao 16:a6ca6858af24 772 lcd.printString("Slow!",0,0); ///print game speed menu
Nikollao 16:a6ca6858af24 773 lcd.printString("Normal",0,1);
Nikollao 16:a6ca6858af24 774 lcd.printString("Fast",0,2);
Nikollao 16:a6ca6858af24 775 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 776 } else if (speed == 1) {
Nikollao 16:a6ca6858af24 777 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 16:a6ca6858af24 778 lcd.printString("Normal!",0,1);
Nikollao 16:a6ca6858af24 779 lcd.printString("Fast",0,2);
Nikollao 16:a6ca6858af24 780 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 781 } else if (speed == 2) {
Nikollao 16:a6ca6858af24 782 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 16:a6ca6858af24 783 lcd.printString("Normal",0,1);
Nikollao 16:a6ca6858af24 784 lcd.printString("Fast!",0,2);
Nikollao 16:a6ca6858af24 785 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 786 }
Nikollao 13:359d3aa66352 787
Nikollao 16:a6ca6858af24 788 switch (joystick.direction) {
Nikollao 16:a6ca6858af24 789 case UP:
Nikollao 16:a6ca6858af24 790 option--;
Nikollao 16:a6ca6858af24 791 break;
Nikollao 16:a6ca6858af24 792 case DOWN:
Nikollao 16:a6ca6858af24 793 option++;
Nikollao 16:a6ca6858af24 794 break;
Nikollao 16:a6ca6858af24 795 case CENTRE:
Nikollao 16:a6ca6858af24 796 option = option;
Nikollao 16:a6ca6858af24 797 break;
Nikollao 16:a6ca6858af24 798 }
Nikollao 16:a6ca6858af24 799 if (option < 0) {
Nikollao 16:a6ca6858af24 800 option = 3;
Nikollao 16:a6ca6858af24 801 }
Nikollao 16:a6ca6858af24 802 if (option > 3) {
Nikollao 16:a6ca6858af24 803 option = 0;
Nikollao 16:a6ca6858af24 804 }
Nikollao 15:c7af2ea5f164 805
Nikollao 16:a6ca6858af24 806 if (option == 0) {
Nikollao 16:a6ca6858af24 807 lcd.drawCircle(70,4,2,1);
Nikollao 16:a6ca6858af24 808 } else if (option == 1) {
Nikollao 16:a6ca6858af24 809 lcd.drawCircle(55,12,2,1);
Nikollao 16:a6ca6858af24 810 } else if (option == 2) {
Nikollao 16:a6ca6858af24 811 lcd.drawCircle(35,20,2,1);
Nikollao 16:a6ca6858af24 812 } else {
Nikollao 16:a6ca6858af24 813 lcd.drawCircle(35,27,2,1);
Nikollao 16:a6ca6858af24 814 }
Nikollao 13:359d3aa66352 815
Nikollao 16:a6ca6858af24 816 if (g_button_flag) {
Nikollao 16:a6ca6858af24 817 g_button_flag = 0;
Nikollao 13:359d3aa66352 818
Nikollao 16:a6ca6858af24 819 if (option == 0) {
Nikollao 16:a6ca6858af24 820 game_speed = 0.1;
Nikollao 16:a6ca6858af24 821 speed = 0;
Nikollao 16:a6ca6858af24 822 } else if (option == 1) {
Nikollao 16:a6ca6858af24 823 game_speed = 0.05;
Nikollao 16:a6ca6858af24 824 speed = 1;
Nikollao 16:a6ca6858af24 825 } else if (option == 2) {
Nikollao 16:a6ca6858af24 826 game_speed = 0.04;
Nikollao 16:a6ca6858af24 827 speed = 2;
Nikollao 16:a6ca6858af24 828 } else if (option == 3) {
Nikollao 16:a6ca6858af24 829 break;
Nikollao 16:a6ca6858af24 830 }
Nikollao 16:a6ca6858af24 831 }
Nikollao 16:a6ca6858af24 832 lcd.refresh();
Nikollao 16:a6ca6858af24 833 }
Nikollao 16:a6ca6858af24 834 sleep();
Nikollao 13:359d3aa66352 835 }
Nikollao 16:a6ca6858af24 836 } else if (option == 1) { /// Lcd inverse mode
Nikollao 16:a6ca6858af24 837 normal =! normal;
Nikollao 16:a6ca6858af24 838 if (normal) {
Nikollao 16:a6ca6858af24 839 lcd.inverseMode();
Nikollao 16:a6ca6858af24 840 } else {
Nikollao 16:a6ca6858af24 841 lcd.normalMode();
Nikollao 16:a6ca6858af24 842 }
Nikollao 16:a6ca6858af24 843 } else if (option == 2) { ///select sound or not
Nikollao 16:a6ca6858af24 844
Nikollao 16:a6ca6858af24 845 sound =! sound;
Nikollao 16:a6ca6858af24 846
Nikollao 16:a6ca6858af24 847 if (sound)
Nikollao 16:a6ca6858af24 848 buzzer.write(0.5);
Nikollao 16:a6ca6858af24 849 else
Nikollao 16:a6ca6858af24 850 buzzer.write(0.0);
Nikollao 16:a6ca6858af24 851 // buzzer.period(1/400);
Nikollao 16:a6ca6858af24 852 } else if(option == 3) { ///go back to main menu
Nikollao 16:a6ca6858af24 853 break;
Nikollao 13:359d3aa66352 854 }
Nikollao 13:359d3aa66352 855 }
Nikollao 16:a6ca6858af24 856 lcd.refresh();
Nikollao 13:359d3aa66352 857 }
Nikollao 16:a6ca6858af24 858 sleep();
Nikollao 11:53caf3d944a9 859 }
Nikollao 16:a6ca6858af24 860 } else if (option == 2) { ///turn off LED
Nikollao 16:a6ca6858af24 861 lcd.clear();
Nikollao 16:a6ca6858af24 862 lcd.turnOff();
Nikollao 16:a6ca6858af24 863 while(1) {
Nikollao 16:a6ca6858af24 864 deepsleep();
Nikollao 16:a6ca6858af24 865 }
Nikollao 11:53caf3d944a9 866 }
Nikollao 11:53caf3d944a9 867 }
Nikollao 16:a6ca6858af24 868 lcd.refresh();
Nikollao 11:53caf3d944a9 869 }
Nikollao 11:53caf3d944a9 870 sleep();
Nikollao 7:f31a4b4beb91 871 }
Nikollao 7:f31a4b4beb91 872 }
Nikollao 7:f31a4b4beb91 873
Nikollao 7:f31a4b4beb91 874 int intersection(int i, int j)
Nikollao 7:f31a4b4beb91 875 {
Nikollao 7:f31a4b4beb91 876 /// check for overlap between enemies and hero
Nikollao 7:f31a4b4beb91 877 n=0;
Nikollao 7:f31a4b4beb91 878
Nikollao 7:f31a4b4beb91 879 if (lcd.getPixel(i-1,j-1)!=0) //pixel to the top-left
Nikollao 7:f31a4b4beb91 880 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 881 if (lcd.getPixel(i-1,j)!=0) //pixel to the left
Nikollao 7:f31a4b4beb91 882 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 883 if (lcd.getPixel(i-1,j+1)!=0) //pixel to the bottom-left
Nikollao 7:f31a4b4beb91 884 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 885 if (lcd.getPixel(i,j-1)!=0) // pixel to the top
Nikollao 7:f31a4b4beb91 886 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 887 if (lcd.getPixel(i,j+1)!=0) //pixel to the bottom
Nikollao 7:f31a4b4beb91 888 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 889 if (lcd.getPixel(i+1,j-1)!=0) //pixel to the top-right
Nikollao 7:f31a4b4beb91 890 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 891 if (lcd.getPixel(i+1,j)!=0) // pixel to the right
Nikollao 7:f31a4b4beb91 892 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 893 if (lcd.getPixel(i+1,j+1)!=0) //pixel to the bottom right
Nikollao 7:f31a4b4beb91 894 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 895 return n;
Nikollao 7:f31a4b4beb91 896 }
Nikollao 7:f31a4b4beb91 897
Nikollao 7:f31a4b4beb91 898 void checkOverlap()
Nikollao 7:f31a4b4beb91 899 {
Nikollao 7:f31a4b4beb91 900
Nikollao 7:f31a4b4beb91 901 for (int i=40+heroX; i<50+heroX; i++) {
Nikollao 7:f31a4b4beb91 902 for (int j=35+heroY; j<48+heroY; j++) {
Nikollao 15:c7af2ea5f164 903
Nikollao 14:91ae0afe9037 904 int check = intersection(i,j);
Nikollao 14:91ae0afe9037 905 //lcd.setPixel(i,j);
Nikollao 14:91ae0afe9037 906 char bit[50];
Nikollao 14:91ae0afe9037 907 sprintf(bit,"Pixels: %d",check);
Nikollao 15:c7af2ea5f164 908
Nikollao 11:53caf3d944a9 909
Nikollao 15:c7af2ea5f164 910 for(int i = 40; i < 45; i++) {
Nikollao 15:c7af2ea5f164 911 for (int j = -5; i < 5; j++) {
Nikollao 15:c7af2ea5f164 912
Nikollao 15:c7af2ea5f164 913 if (check > 6) {
Nikollao 15:c7af2ea5f164 914 check = 6;
Nikollao 14:91ae0afe9037 915 }
Nikollao 14:91ae0afe9037 916 }
Nikollao 15:c7af2ea5f164 917 }
Nikollao 15:c7af2ea5f164 918 if (check > 7) {
Nikollao 14:91ae0afe9037 919
Nikollao 14:91ae0afe9037 920 lcd.printString(bit,0,0);
Nikollao 14:91ae0afe9037 921 lcd.refresh();
Nikollao 15:c7af2ea5f164 922 tries--;
Nikollao 15:c7af2ea5f164 923 if(tries == 2) {
Nikollao 15:c7af2ea5f164 924 right_led = 0;
Nikollao 15:c7af2ea5f164 925 }else if (tries == 1) {
Nikollao 15:c7af2ea5f164 926 centre_led = 0;
Nikollao 15:c7af2ea5f164 927 }else if(tries == 0){
Nikollao 15:c7af2ea5f164 928 left_led = 0;
Nikollao 15:c7af2ea5f164 929 //gameOver();
Nikollao 15:c7af2ea5f164 930 }
Nikollao 15:c7af2ea5f164 931 wait(2);
Nikollao 15:c7af2ea5f164 932 heroX = 0;
Nikollao 15:c7af2ea5f164 933 heroY = 0;
Nikollao 14:91ae0afe9037 934 }
Nikollao 15:c7af2ea5f164 935
Nikollao 7:f31a4b4beb91 936 }
Nikollao 7:f31a4b4beb91 937 }
Nikollao 7:f31a4b4beb91 938 }
Nikollao 7:f31a4b4beb91 939
Nikollao 7:f31a4b4beb91 940 void error()
Nikollao 7:f31a4b4beb91 941 {
Nikollao 7:f31a4b4beb91 942 /// display error message
Nikollao 7:f31a4b4beb91 943 while (1) {
Nikollao 7:f31a4b4beb91 944
Nikollao 7:f31a4b4beb91 945 lcd.printString("Error!",0,0);
Nikollao 7:f31a4b4beb91 946 r_led = 0;
Nikollao 7:f31a4b4beb91 947 wait(0.2);
Nikollao 7:f31a4b4beb91 948 r_led = 1;
Nikollao 7:f31a4b4beb91 949 wait(0.2);
Nikollao 7:f31a4b4beb91 950 }
Nikollao 7:f31a4b4beb91 951 }
Nikollao 7:f31a4b4beb91 952
Nikollao 5:ffa498d7071f 953 #endif
Nikollao 5:ffa498d7071f 954
Nikollao 7:f31a4b4beb91 955