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