My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Fri Apr 29 14:19:57 2016 +0000
Revision:
14:91ae0afe9037
Parent:
13:359d3aa66352
Child:
15:c7af2ea5f164
lcd normal and inverse!

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