My ELEC2645 project. Nikollao Sulollari. 200804685
Dependencies: N5110 SoftPWM mbed
Fork of Treasure_Hunt by
main.cpp@6:c11bb31a06b3, 2016-03-28 (annotated)
- Committer:
- Nikollao
- Date:
- Mon Mar 28 12:10:24 2016 +0000
- Revision:
- 6:c11bb31a06b3
- Parent:
- 5:ffa498d7071f
- Child:
- 7:f31a4b4beb91
close to getting overlap, needs improvement.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Nikollao | 4:f31bdc212241 | 1 | //Fadia |
Nikollao | 5:ffa498d7071f | 2 | /** |
Nikollao | 5:ffa498d7071f | 3 | @file main.cpp |
Nikollao | 5:ffa498d7071f | 4 | @brief Game implementation |
Nikollao | 4:f31bdc212241 | 5 | |
Nikollao | 5:ffa498d7071f | 6 | */ |
Nikollao | 5:ffa498d7071f | 7 | #include "main.h" |
Nikollao | 0:2d0f77943105 | 8 | #include "N5110.h" |
Nikollao | 0:2d0f77943105 | 9 | #include "stdlib.h" |
Nikollao | 2:af5b5d42e835 | 10 | |
Nikollao | 0:2d0f77943105 | 11 | N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); |
Nikollao | 6:c11bb31a06b3 | 12 | |
Nikollao | 6:c11bb31a06b3 | 13 | |
Nikollao | 0:2d0f77943105 | 14 | Serial pc(USBTX,USBRX); |
Nikollao | 0:2d0f77943105 | 15 | |
Nikollao | 4:f31bdc212241 | 16 | #define DIRECTION_TOLERANCE 0.05 |
Nikollao | 0:2d0f77943105 | 17 | |
Nikollao | 0:2d0f77943105 | 18 | Ticker ticker; |
Nikollao | 1:12803d645d32 | 19 | Ticker game_ticker; |
Nikollao | 1:12803d645d32 | 20 | Timeout timeout; |
Nikollao | 0:2d0f77943105 | 21 | |
Nikollao | 4:f31bdc212241 | 22 | enum DirectionName { |
Nikollao | 4:f31bdc212241 | 23 | UP, |
Nikollao | 4:f31bdc212241 | 24 | DOWN, |
Nikollao | 4:f31bdc212241 | 25 | LEFT, |
Nikollao | 4:f31bdc212241 | 26 | RIGHT, |
Nikollao | 4:f31bdc212241 | 27 | CENTRE, |
Nikollao | 4:f31bdc212241 | 28 | UP_LEFT, |
Nikollao | 4:f31bdc212241 | 29 | UP_RIGHT, |
Nikollao | 4:f31bdc212241 | 30 | DOWN_LEFT, |
Nikollao | 4:f31bdc212241 | 31 | DOWN_RIGHT |
Nikollao | 4:f31bdc212241 | 32 | }; |
Nikollao | 0:2d0f77943105 | 33 | |
Nikollao | 0:2d0f77943105 | 34 | typedef struct JoyStick Joystick; |
Nikollao | 0:2d0f77943105 | 35 | struct JoyStick { |
Nikollao | 5:ffa498d7071f | 36 | double x; /// current x value |
Nikollao | 5:ffa498d7071f | 37 | double x0; /// 'centred' x value |
Nikollao | 5:ffa498d7071f | 38 | double y; /// current y value |
Nikollao | 5:ffa498d7071f | 39 | double y0; /// 'centred' y value |
Nikollao | 5:ffa498d7071f | 40 | int button; /// button state (assume pull-down used, so 1 = pressed, 0 = unpressed) |
Nikollao | 0:2d0f77943105 | 41 | DirectionName direction; // current direction |
Nikollao | 0:2d0f77943105 | 42 | }; |
Nikollao | 5:ffa498d7071f | 43 | /// create struct variable |
Nikollao | 0:2d0f77943105 | 44 | Joystick joystick; |
Nikollao | 0:2d0f77943105 | 45 | |
Nikollao | 0:2d0f77943105 | 46 | |
Nikollao | 0:2d0f77943105 | 47 | int main() |
Nikollao | 0:2d0f77943105 | 48 | { |
Nikollao | 6:c11bb31a06b3 | 49 | lcd.init(); |
Nikollao | 6:c11bb31a06b3 | 50 | init_K64F(); |
Nikollao | 6:c11bb31a06b3 | 51 | init_serial(); |
Nikollao | 6:c11bb31a06b3 | 52 | button.rise(&button_isr); ///assign rise with ISR |
Nikollao | 5:ffa498d7071f | 53 | init_game(); ///initialize game |
Nikollao | 5:ffa498d7071f | 54 | calibrateJoystick(); ///calibrate joystick |
Nikollao | 0:2d0f77943105 | 55 | |
Nikollao | 6:c11bb31a06b3 | 56 | ticker.attach(&timer_isr,0.1); ///attach ticker with ISR every 0.1 sec |
Nikollao | 5:ffa498d7071f | 57 | reset = level; ///set reset = level to check later if level has increased |
Nikollao | 0:2d0f77943105 | 58 | |
Nikollao | 0:2d0f77943105 | 59 | while (1) { |
Nikollao | 0:2d0f77943105 | 60 | |
Nikollao | 0:2d0f77943105 | 61 | if (g_timer_flag) { |
Nikollao | 0:2d0f77943105 | 62 | |
Nikollao | 6:c11bb31a06b3 | 63 | g_timer_flag = 0; ///reset flag |
Nikollao | 0:2d0f77943105 | 64 | lcd.clear(); |
Nikollao | 6:c11bb31a06b3 | 65 | guidance(); |
Nikollao | 0:2d0f77943105 | 66 | hero(); |
Nikollao | 3:d2cc054e8605 | 67 | enemies(); |
Nikollao | 0:2d0f77943105 | 68 | obstacles(); |
Nikollao | 0:2d0f77943105 | 69 | |
Nikollao | 5:ffa498d7071f | 70 | if (heroY < -45) { ///if hero has reached the top of the screen |
Nikollao | 5:ffa498d7071f | 71 | heroY = 0; ///hero goes back to the bottom of the screen |
Nikollao | 5:ffa498d7071f | 72 | level++; ///level increases by 1 |
Nikollao | 0:2d0f77943105 | 73 | } |
Nikollao | 0:2d0f77943105 | 74 | |
Nikollao | 5:ffa498d7071f | 75 | if (reset < level) { ///if level has increased |
Nikollao | 0:2d0f77943105 | 76 | |
Nikollao | 6:c11bb31a06b3 | 77 | reset = level; ///update reset |
Nikollao | 5:ffa498d7071f | 78 | rectX = rand() % 84; ///set the position of rect enemy |
Nikollao | 0:2d0f77943105 | 79 | rectY = 0; |
Nikollao | 5:ffa498d7071f | 80 | circleX = 0; ///set position of circle enemy |
Nikollao | 6:c11bb31a06b3 | 81 | circleY = rand() % 47; |
Nikollao | 0:2d0f77943105 | 82 | } |
Nikollao | 6:c11bb31a06b3 | 83 | pc.printf("x = %f y = %f button = %d \n",joystick.x,joystick.y,joystick.button); |
Nikollao | 6:c11bb31a06b3 | 84 | pc.printf("heroY = %d , heroX = %d , n = %d \n",heroY, heroX, n); |
Nikollao | 0:2d0f77943105 | 85 | } |
Nikollao | 6:c11bb31a06b3 | 86 | checkOverlap(); |
Nikollao | 0:2d0f77943105 | 87 | updateJoystick(); |
Nikollao | 1:12803d645d32 | 88 | //callibrateJoystick(); |
Nikollao | 0:2d0f77943105 | 89 | lcd.refresh(); |
Nikollao | 0:2d0f77943105 | 90 | sleep(); |
Nikollao | 6:c11bb31a06b3 | 91 | // break; |
Nikollao | 0:2d0f77943105 | 92 | } |
Nikollao | 0:2d0f77943105 | 93 | } |
Nikollao | 0:2d0f77943105 | 94 | |
Nikollao | 0:2d0f77943105 | 95 | void init_serial() |
Nikollao | 0:2d0f77943105 | 96 | { |
Nikollao | 0:2d0f77943105 | 97 | // set to highest baud - ensure terminal software matches |
Nikollao | 0:2d0f77943105 | 98 | pc.baud(115200); |
Nikollao | 0:2d0f77943105 | 99 | } |
Nikollao | 0:2d0f77943105 | 100 | |
Nikollao | 0:2d0f77943105 | 101 | void init_K64F() |
Nikollao | 0:2d0f77943105 | 102 | { |
Nikollao | 0:2d0f77943105 | 103 | // on-board LEDs are active-low, so set pin high to turn them off. |
Nikollao | 0:2d0f77943105 | 104 | r_led = 1; |
Nikollao | 0:2d0f77943105 | 105 | g_led = 1; |
Nikollao | 0:2d0f77943105 | 106 | b_led = 1; |
Nikollao | 0:2d0f77943105 | 107 | |
Nikollao | 0:2d0f77943105 | 108 | // since the on-board switches have external pull-ups, we should disable the internal pull-down |
Nikollao | 0:2d0f77943105 | 109 | // resistors that are enabled by default using InterruptIn |
Nikollao | 0:2d0f77943105 | 110 | sw2.mode(PullNone); |
Nikollao | 0:2d0f77943105 | 111 | sw3.mode(PullNone); |
Nikollao | 0:2d0f77943105 | 112 | } |
Nikollao | 0:2d0f77943105 | 113 | |
Nikollao | 0:2d0f77943105 | 114 | void timer_isr () |
Nikollao | 0:2d0f77943105 | 115 | { |
Nikollao | 0:2d0f77943105 | 116 | |
Nikollao | 0:2d0f77943105 | 117 | g_timer_flag = 1; |
Nikollao | 0:2d0f77943105 | 118 | } |
Nikollao | 0:2d0f77943105 | 119 | |
Nikollao | 0:2d0f77943105 | 120 | void game_timer_isr() |
Nikollao | 0:2d0f77943105 | 121 | { |
Nikollao | 0:2d0f77943105 | 122 | g_game_timer_flag = 1; |
Nikollao | 0:2d0f77943105 | 123 | } |
Nikollao | 0:2d0f77943105 | 124 | |
Nikollao | 0:2d0f77943105 | 125 | void sw2_isr() |
Nikollao | 0:2d0f77943105 | 126 | { |
Nikollao | 0:2d0f77943105 | 127 | g_sw2_flag = 1; |
Nikollao | 0:2d0f77943105 | 128 | } |
Nikollao | 0:2d0f77943105 | 129 | |
Nikollao | 4:f31bdc212241 | 130 | void sw3_isr() |
Nikollao | 4:f31bdc212241 | 131 | { |
Nikollao | 1:12803d645d32 | 132 | g_sw3_flag = 1; |
Nikollao | 1:12803d645d32 | 133 | } |
Nikollao | 1:12803d645d32 | 134 | |
Nikollao | 1:12803d645d32 | 135 | void button_isr() |
Nikollao | 1:12803d645d32 | 136 | { |
Nikollao | 1:12803d645d32 | 137 | g_button_flag =1; |
Nikollao | 1:12803d645d32 | 138 | } |
Nikollao | 1:12803d645d32 | 139 | |
Nikollao | 1:12803d645d32 | 140 | void timeout_isr() |
Nikollao | 1:12803d645d32 | 141 | { |
Nikollao | 1:12803d645d32 | 142 | if (button) { |
Nikollao | 4:f31bdc212241 | 143 | pc.printf("button is pressed! \n"); |
Nikollao | 1:12803d645d32 | 144 | } |
Nikollao | 1:12803d645d32 | 145 | } |
Nikollao | 1:12803d645d32 | 146 | |
Nikollao | 0:2d0f77943105 | 147 | void enemyRect() |
Nikollao | 0:2d0f77943105 | 148 | { |
Nikollao | 6:c11bb31a06b3 | 149 | ///generate rect shape enemy |
Nikollao | 0:2d0f77943105 | 150 | lcd.drawRect(rectX,rectY,5,4,1); |
Nikollao | 0:2d0f77943105 | 151 | rectX = rectX + rand()%4 - 2; |
Nikollao | 6:c11bb31a06b3 | 152 | rectY++; ///enemy moving towards hero |
Nikollao | 0:2d0f77943105 | 153 | } |
Nikollao | 0:2d0f77943105 | 154 | |
Nikollao | 0:2d0f77943105 | 155 | void hero() |
Nikollao | 0:2d0f77943105 | 156 | { |
Nikollao | 6:c11bb31a06b3 | 157 | ///draw hero |
Nikollao | 6:c11bb31a06b3 | 158 | heroX = heroX + 5*xPot; /// control hero's x direction |
Nikollao | 6:c11bb31a06b3 | 159 | heroY = heroY - 5*yPot; /// control hero's y direction |
Nikollao | 4:f31bdc212241 | 160 | |
Nikollao | 6:c11bb31a06b3 | 161 | ///set x-axis boundaries so hero does not go out of screen |
Nikollao | 3:d2cc054e8605 | 162 | if (heroX > 35) { |
Nikollao | 3:d2cc054e8605 | 163 | heroX = 35; |
Nikollao | 4:f31bdc212241 | 164 | } |
Nikollao | 4:f31bdc212241 | 165 | if (heroX < 5) { |
Nikollao | 4:f31bdc212241 | 166 | heroX = 5; |
Nikollao | 4:f31bdc212241 | 167 | } |
Nikollao | 3:d2cc054e8605 | 168 | lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1); |
Nikollao | 3:d2cc054e8605 | 169 | lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1); |
Nikollao | 3:d2cc054e8605 | 170 | lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1); |
Nikollao | 3:d2cc054e8605 | 171 | lcd.drawCircle(44+heroX, 39+heroY,2,0); |
Nikollao | 0:2d0f77943105 | 172 | } |
Nikollao | 0:2d0f77943105 | 173 | |
Nikollao | 0:2d0f77943105 | 174 | void enemyCircle() |
Nikollao | 0:2d0f77943105 | 175 | { |
Nikollao | 6:c11bb31a06b3 | 176 | ///generate circle shape enemy |
Nikollao | 4:f31bdc212241 | 177 | lcd.drawCircle(circleX,circleY,4,1); |
Nikollao | 4:f31bdc212241 | 178 | circleY = circleY + rand() %4 - 2; |
Nikollao | 0:2d0f77943105 | 179 | |
Nikollao | 6:c11bb31a06b3 | 180 | circleX++; ///enemy moving towards hero |
Nikollao | 0:2d0f77943105 | 181 | } |
Nikollao | 0:2d0f77943105 | 182 | |
Nikollao | 0:2d0f77943105 | 183 | void init_game() |
Nikollao | 0:2d0f77943105 | 184 | { |
Nikollao | 6:c11bb31a06b3 | 185 | ///initialise game |
Nikollao | 4:f31bdc212241 | 186 | //button.mode(PullNone); |
Nikollao | 6:c11bb31a06b3 | 187 | srand(time(NULL)); /// generate random numbers |
Nikollao | 6:c11bb31a06b3 | 188 | rectY = 0; /// init rectX, rectY |
Nikollao | 4:f31bdc212241 | 189 | rectX = rand() %40 + 20; |
Nikollao | 6:c11bb31a06b3 | 190 | circleY = rand() %20 + 10; /// init circleX, circleY |
Nikollao | 0:2d0f77943105 | 191 | circleX = 0; |
Nikollao | 4:f31bdc212241 | 192 | |
Nikollao | 6:c11bb31a06b3 | 193 | if ( play == 0) { ///if its first play print welcome message, otherwise don't |
Nikollao | 4:f31bdc212241 | 194 | |
Nikollao | 4:f31bdc212241 | 195 | lcd.setBrightness(0.5); // put LED backlight on 50% |
Nikollao | 4:f31bdc212241 | 196 | timeout.attach(&timeout_isr,2); |
Nikollao | 4:f31bdc212241 | 197 | lcd.printString("Welcome to",11,1); |
Nikollao | 4:f31bdc212241 | 198 | lcd.printString("Treasure Hunt!",1,3); |
Nikollao | 4:f31bdc212241 | 199 | lcd.refresh(); |
Nikollao | 4:f31bdc212241 | 200 | sleep(); |
Nikollao | 4:f31bdc212241 | 201 | lcd.clear(); |
Nikollao | 4:f31bdc212241 | 202 | } |
Nikollao | 4:f31bdc212241 | 203 | game_ticker.attach(game_timer_isr,0.2); |
Nikollao | 0:2d0f77943105 | 204 | |
Nikollao | 0:2d0f77943105 | 205 | while (1) { |
Nikollao | 0:2d0f77943105 | 206 | |
Nikollao | 0:2d0f77943105 | 207 | if (g_game_timer_flag) { |
Nikollao | 0:2d0f77943105 | 208 | |
Nikollao | 0:2d0f77943105 | 209 | g_game_timer_flag = 0; |
Nikollao | 0:2d0f77943105 | 210 | updateJoystick(); |
Nikollao | 0:2d0f77943105 | 211 | lcd.clear(); |
Nikollao | 6:c11bb31a06b3 | 212 | menu(); ///get Joystick's value to select option in menu |
Nikollao | 3:d2cc054e8605 | 213 | //option = menu(); |
Nikollao | 0:2d0f77943105 | 214 | |
Nikollao | 6:c11bb31a06b3 | 215 | if (option == 0) { /// select Start Game |
Nikollao | 0:2d0f77943105 | 216 | |
Nikollao | 0:2d0f77943105 | 217 | lcd.printString("Start Game <",0,0); |
Nikollao | 0:2d0f77943105 | 218 | lcd.printString("Settings",0,2); |
Nikollao | 0:2d0f77943105 | 219 | lcd.printString("Exit",0,4); |
Nikollao | 6:c11bb31a06b3 | 220 | } else if (option == 1) { /// select Settings |
Nikollao | 0:2d0f77943105 | 221 | |
Nikollao | 0:2d0f77943105 | 222 | lcd.printString("Start Game",0,0); |
Nikollao | 0:2d0f77943105 | 223 | lcd.printString("Settings <",0,2); |
Nikollao | 0:2d0f77943105 | 224 | lcd.printString("Exit",0,4); |
Nikollao | 6:c11bb31a06b3 | 225 | } else { /// select Exit |
Nikollao | 0:2d0f77943105 | 226 | |
Nikollao | 0:2d0f77943105 | 227 | lcd.printString("Start Game",0,0); |
Nikollao | 0:2d0f77943105 | 228 | lcd.printString("Settings",0,2); |
Nikollao | 0:2d0f77943105 | 229 | lcd.printString("Exit <",0,4); |
Nikollao | 0:2d0f77943105 | 230 | } |
Nikollao | 0:2d0f77943105 | 231 | } |
Nikollao | 4:f31bdc212241 | 232 | if (g_button_flag) { |
Nikollao | 4:f31bdc212241 | 233 | |
Nikollao | 4:f31bdc212241 | 234 | g_button_flag = 0; |
Nikollao | 6:c11bb31a06b3 | 235 | |
Nikollao | 3:d2cc054e8605 | 236 | if (option == 0) { |
Nikollao | 6:c11bb31a06b3 | 237 | |
Nikollao | 4:f31bdc212241 | 238 | game_ticker.detach(); |
Nikollao | 4:f31bdc212241 | 239 | break; |
Nikollao | 6:c11bb31a06b3 | 240 | } else if (option == 1) { |
Nikollao | 4:f31bdc212241 | 241 | |
Nikollao | 3:d2cc054e8605 | 242 | //settings_menu(); |
Nikollao | 3:d2cc054e8605 | 243 | pc.printf("Modify Settings!"); |
Nikollao | 6:c11bb31a06b3 | 244 | } else { |
Nikollao | 4:f31bdc212241 | 245 | |
Nikollao | 3:d2cc054e8605 | 246 | lcd.turnOff(); |
Nikollao | 3:d2cc054e8605 | 247 | deepsleep(); |
Nikollao | 3:d2cc054e8605 | 248 | } |
Nikollao | 4:f31bdc212241 | 249 | } |
Nikollao | 4:f31bdc212241 | 250 | sleep(); |
Nikollao | 0:2d0f77943105 | 251 | } |
Nikollao | 0:2d0f77943105 | 252 | } |
Nikollao | 0:2d0f77943105 | 253 | void guidance() |
Nikollao | 0:2d0f77943105 | 254 | { |
Nikollao | 6:c11bb31a06b3 | 255 | /// show arrow to act as guidance towards the treasure |
Nikollao | 6:c11bb31a06b3 | 256 | if (level < 7) { ///check level of difficulty |
Nikollao | 0:2d0f77943105 | 257 | |
Nikollao | 0:2d0f77943105 | 258 | lcd.drawLine(42,0,42,4,1); |
Nikollao | 0:2d0f77943105 | 259 | lcd.drawLine(42,0,40,2,1); |
Nikollao | 0:2d0f77943105 | 260 | lcd.drawLine(42,0,44,2,1); |
Nikollao | 0:2d0f77943105 | 261 | } else if (level == 7) { |
Nikollao | 0:2d0f77943105 | 262 | |
Nikollao | 6:c11bb31a06b3 | 263 | lcd.printString("F",42,0); /// print the treasure icon |
Nikollao | 0:2d0f77943105 | 264 | } else if (level == 8) { |
Nikollao | 0:2d0f77943105 | 265 | |
Nikollao | 0:2d0f77943105 | 266 | ticker.detach(); |
Nikollao | 0:2d0f77943105 | 267 | lcd.clear(); |
Nikollao | 0:2d0f77943105 | 268 | lcd.printString("Well done!",0,0); |
Nikollao | 0:2d0f77943105 | 269 | lcd.refresh(); |
Nikollao | 4:f31bdc212241 | 270 | timeout.attach(&timeout_isr,2); |
Nikollao | 4:f31bdc212241 | 271 | sleep(); |
Nikollao | 0:2d0f77943105 | 272 | lcd.clear(); |
Nikollao | 4:f31bdc212241 | 273 | lcd.printString("Play again <",0,0); |
Nikollao | 0:2d0f77943105 | 274 | lcd.refresh(); |
Nikollao | 4:f31bdc212241 | 275 | sleep(); |
Nikollao | 4:f31bdc212241 | 276 | |
Nikollao | 4:f31bdc212241 | 277 | if (g_button_flag) { |
Nikollao | 4:f31bdc212241 | 278 | |
Nikollao | 4:f31bdc212241 | 279 | g_button_flag = 0; |
Nikollao | 4:f31bdc212241 | 280 | level = 0; |
Nikollao | 4:f31bdc212241 | 281 | play++; |
Nikollao | 4:f31bdc212241 | 282 | lcd.clear(); |
Nikollao | 4:f31bdc212241 | 283 | main(); |
Nikollao | 4:f31bdc212241 | 284 | } |
Nikollao | 0:2d0f77943105 | 285 | } |
Nikollao | 0:2d0f77943105 | 286 | } |
Nikollao | 0:2d0f77943105 | 287 | |
Nikollao | 0:2d0f77943105 | 288 | void obstacles() |
Nikollao | 0:2d0f77943105 | 289 | { |
Nikollao | 6:c11bb31a06b3 | 290 | /// place obstacles in the screen |
Nikollao | 6:c11bb31a06b3 | 291 | /// as level difficulty increases, more obstacles are added |
Nikollao | 0:2d0f77943105 | 292 | if (level == 1) { |
Nikollao | 0:2d0f77943105 | 293 | |
Nikollao | 0:2d0f77943105 | 294 | lcd.drawRect(10,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 295 | lcd.drawRect(74,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 296 | } else if (level == 2) { |
Nikollao | 0:2d0f77943105 | 297 | |
Nikollao | 0:2d0f77943105 | 298 | lcd.drawRect(10,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 299 | lcd.drawRect(74,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 300 | lcd.drawRect(10,28,2,2,1); |
Nikollao | 0:2d0f77943105 | 301 | lcd.drawRect(74,28,2,2,1); |
Nikollao | 0:2d0f77943105 | 302 | } else if (level == 3) { |
Nikollao | 0:2d0f77943105 | 303 | |
Nikollao | 0:2d0f77943105 | 304 | lcd.drawRect(10,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 305 | lcd.drawRect(74,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 306 | lcd.drawRect(10,28,2,2,1); |
Nikollao | 0:2d0f77943105 | 307 | lcd.drawRect(74,28,2,2,1); |
Nikollao | 0:2d0f77943105 | 308 | lcd.drawRect(30,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 309 | lcd.drawRect(54,15,2,2,1); |
Nikollao | 0:2d0f77943105 | 310 | lcd.drawRect(30,28,2,2,1); |
Nikollao | 0:2d0f77943105 | 311 | lcd.drawRect(54,28,2,2,1); |
Nikollao | 0:2d0f77943105 | 312 | } else if (level == 4) { |
Nikollao | 0:2d0f77943105 | 313 | |
Nikollao | 0:2d0f77943105 | 314 | lcd.drawRect(10 + rand() %4 - 2,15 + rand() &4 -2,2,2,1); |
Nikollao | 1:12803d645d32 | 315 | lcd.drawRect(74 + rand() %4 - 2,15 + rand() %4 - 2,2,2,1); |
Nikollao | 1:12803d645d32 | 316 | lcd.drawRect(10 + rand() %4 - 2,28 + rand() %4 - 2,2,2,1); |
Nikollao | 1:12803d645d32 | 317 | lcd.drawRect(74 + rand() %4 - 2,28 + rand() %4 - 2,2,2,1); |
Nikollao | 1:12803d645d32 | 318 | lcd.drawRect(30 + rand() %4 - 2,15,2,2,1); |
Nikollao | 1:12803d645d32 | 319 | lcd.drawRect(54,15 + rand() %4 - 2,2,2,1); |
Nikollao | 1:12803d645d32 | 320 | lcd.drawRect(30,28 + rand() %4 - 2,2,2,1); |
Nikollao | 1:12803d645d32 | 321 | lcd.drawRect(54 + rand() %4 - 2,28,2,2,1); |
Nikollao | 4:f31bdc212241 | 322 | } else if ( level == 5) { |
Nikollao | 4:f31bdc212241 | 323 | |
Nikollao | 1:12803d645d32 | 324 | lcd.drawLine(50,35,65,35,1); |
Nikollao | 1:12803d645d32 | 325 | lcd.drawLine(38,30,28,30,1); |
Nikollao | 1:12803d645d32 | 326 | lcd.drawLine(60,25,70,25,1); |
Nikollao | 1:12803d645d32 | 327 | lcd.drawLine(28,25,18,25,1); |
Nikollao | 1:12803d645d32 | 328 | lcd.drawLine(70,20,80,20,1); |
Nikollao | 1:12803d645d32 | 329 | lcd.drawLine(18,20,8,20,1); |
Nikollao | 4:f31bdc212241 | 330 | } else if (level == 6) { |
Nikollao | 4:f31bdc212241 | 331 | |
Nikollao | 4:f31bdc212241 | 332 | } else if (level == 7) { |
Nikollao | 4:f31bdc212241 | 333 | |
Nikollao | 4:f31bdc212241 | 334 | /* |
Nikollao | 4:f31bdc212241 | 335 | lcd.drawLine(50,15,30,15,1); |
Nikollao | 4:f31bdc212241 | 336 | lcd.drawLine(30,15,30,35,1); |
Nikollao | 4:f31bdc212241 | 337 | lcd.drawLine(30,25,45,25,1); |
Nikollao | 4:f31bdc212241 | 338 | */ |
Nikollao | 0:2d0f77943105 | 339 | } |
Nikollao | 0:2d0f77943105 | 340 | } |
Nikollao | 0:2d0f77943105 | 341 | |
Nikollao | 4:f31bdc212241 | 342 | void enemies() |
Nikollao | 4:f31bdc212241 | 343 | { |
Nikollao | 6:c11bb31a06b3 | 344 | /// generate enemies in the screen depending on the level difficulty |
Nikollao | 4:f31bdc212241 | 345 | |
Nikollao | 3:d2cc054e8605 | 346 | if (level == 0) { |
Nikollao | 3:d2cc054e8605 | 347 | |
Nikollao | 4:f31bdc212241 | 348 | enemyRect(); |
Nikollao | 4:f31bdc212241 | 349 | //enemyCircle(); |
Nikollao | 4:f31bdc212241 | 350 | } else if (level == 1) { |
Nikollao | 3:d2cc054e8605 | 351 | |
Nikollao | 4:f31bdc212241 | 352 | enemyRect(); |
Nikollao | 4:f31bdc212241 | 353 | //enemyCircle(); |
Nikollao | 4:f31bdc212241 | 354 | } else if (level == 2) { |
Nikollao | 3:d2cc054e8605 | 355 | |
Nikollao | 4:f31bdc212241 | 356 | } else if (level == 3) { |
Nikollao | 3:d2cc054e8605 | 357 | |
Nikollao | 4:f31bdc212241 | 358 | } |
Nikollao | 4:f31bdc212241 | 359 | enemyCircle(); |
Nikollao | 3:d2cc054e8605 | 360 | } |
Nikollao | 0:2d0f77943105 | 361 | void calibrateJoystick() |
Nikollao | 0:2d0f77943105 | 362 | { |
Nikollao | 0:2d0f77943105 | 363 | // must not move during calibration |
Nikollao | 0:2d0f77943105 | 364 | joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly) |
Nikollao | 0:2d0f77943105 | 365 | joystick.y0 = yPot; |
Nikollao | 0:2d0f77943105 | 366 | } |
Nikollao | 0:2d0f77943105 | 367 | void updateJoystick() |
Nikollao | 0:2d0f77943105 | 368 | { |
Nikollao | 0:2d0f77943105 | 369 | // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred) |
Nikollao | 0:2d0f77943105 | 370 | joystick.x = xPot - joystick.x0; |
Nikollao | 0:2d0f77943105 | 371 | joystick.y = yPot - joystick.y0; |
Nikollao | 0:2d0f77943105 | 372 | // read button state |
Nikollao | 0:2d0f77943105 | 373 | joystick.button = button; |
Nikollao | 0:2d0f77943105 | 374 | |
Nikollao | 0:2d0f77943105 | 375 | // calculate direction depending on x,y values |
Nikollao | 0:2d0f77943105 | 376 | // tolerance allows a little lee-way in case joystick not exactly in the stated direction |
Nikollao | 0:2d0f77943105 | 377 | if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
Nikollao | 0:2d0f77943105 | 378 | joystick.direction = CENTRE; |
Nikollao | 0:2d0f77943105 | 379 | } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
Nikollao | 0:2d0f77943105 | 380 | joystick.direction = UP; |
Nikollao | 0:2d0f77943105 | 381 | } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
Nikollao | 0:2d0f77943105 | 382 | joystick.direction = DOWN; |
Nikollao | 0:2d0f77943105 | 383 | } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
Nikollao | 0:2d0f77943105 | 384 | joystick.direction = RIGHT; |
Nikollao | 0:2d0f77943105 | 385 | } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
Nikollao | 0:2d0f77943105 | 386 | joystick.direction = LEFT; |
Nikollao | 1:12803d645d32 | 387 | } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) { |
Nikollao | 1:12803d645d32 | 388 | joystick.direction = UP_LEFT; |
Nikollao | 1:12803d645d32 | 389 | } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) { |
Nikollao | 1:12803d645d32 | 390 | joystick.direction = UP_RIGHT; |
Nikollao | 1:12803d645d32 | 391 | } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) { |
Nikollao | 1:12803d645d32 | 392 | joystick.direction = DOWN_LEFT; |
Nikollao | 1:12803d645d32 | 393 | } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) { |
Nikollao | 1:12803d645d32 | 394 | joystick.direction = DOWN_RIGHT; |
Nikollao | 0:2d0f77943105 | 395 | } |
Nikollao | 0:2d0f77943105 | 396 | } |
Nikollao | 0:2d0f77943105 | 397 | |
Nikollao | 0:2d0f77943105 | 398 | int menu() |
Nikollao | 0:2d0f77943105 | 399 | { |
Nikollao | 0:2d0f77943105 | 400 | |
Nikollao | 6:c11bb31a06b3 | 401 | if (joystick.y <= 0.33) { /// if Joystick moves up |
Nikollao | 6:c11bb31a06b3 | 402 | option = 0; /// the pointer moves upper in the menu display |
Nikollao | 6:c11bb31a06b3 | 403 | } else if (joystick.y <= 0.66) { /// if joystick moves down |
Nikollao | 6:c11bb31a06b3 | 404 | option = 1; /// else pointer moves down |
Nikollao | 0:2d0f77943105 | 405 | } else { |
Nikollao | 0:2d0f77943105 | 406 | option = 2; |
Nikollao | 0:2d0f77943105 | 407 | } |
Nikollao | 0:2d0f77943105 | 408 | return option; |
Nikollao | 0:2d0f77943105 | 409 | } |
Nikollao | 3:d2cc054e8605 | 410 | |
Nikollao | 6:c11bb31a06b3 | 411 | int intersection(int i, int j) |
Nikollao | 4:f31bdc212241 | 412 | { |
Nikollao | 6:c11bb31a06b3 | 413 | /// check for overlap between enemies and hero |
Nikollao | 6:c11bb31a06b3 | 414 | n=0; |
Nikollao | 3:d2cc054e8605 | 415 | |
Nikollao | 5:ffa498d7071f | 416 | if (lcd.getPixel(i-1,j-1)!=0) //pixel to the top-left |
Nikollao | 5:ffa498d7071f | 417 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 418 | if (lcd.getPixel(i-1,j)!=0) //pixel to the left |
Nikollao | 5:ffa498d7071f | 419 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 420 | if (lcd.getPixel(i-1,j+1)!=0) //pixel to the bottom-left |
Nikollao | 5:ffa498d7071f | 421 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 422 | if (lcd.getPixel(i,j-1)!=0) // pixel to the top |
Nikollao | 5:ffa498d7071f | 423 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 424 | if (lcd.getPixel(i,j+1)!=0) //pixel to the bottom |
Nikollao | 5:ffa498d7071f | 425 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 426 | if (lcd.getPixel(i+1,j-1)!=0) //pixel to the top-right |
Nikollao | 5:ffa498d7071f | 427 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 428 | if (lcd.getPixel(i+1,j)!=0) // pixel to the right |
Nikollao | 5:ffa498d7071f | 429 | n++; // increase n by 1 |
Nikollao | 5:ffa498d7071f | 430 | if (lcd.getPixel(i+1,j+1)!=0) //pixel to the bottom right |
Nikollao | 5:ffa498d7071f | 431 | n++; // increase n by 1 |
Nikollao | 3:d2cc054e8605 | 432 | return n; |
Nikollao | 3:d2cc054e8605 | 433 | } |
Nikollao | 3:d2cc054e8605 | 434 | |
Nikollao | 6:c11bb31a06b3 | 435 | void checkOverlap() |
Nikollao | 6:c11bb31a06b3 | 436 | { |
Nikollao | 6:c11bb31a06b3 | 437 | |
Nikollao | 6:c11bb31a06b3 | 438 | for (int i=40+heroX; i<50+heroX; i++) { |
Nikollao | 6:c11bb31a06b3 | 439 | for (int j=35+heroY; j<48+heroY; j++) { |
Nikollao | 6:c11bb31a06b3 | 440 | |
Nikollao | 6:c11bb31a06b3 | 441 | lcd.setPixel(i,j); |
Nikollao | 6:c11bb31a06b3 | 442 | |
Nikollao | 6:c11bb31a06b3 | 443 | |
Nikollao | 6:c11bb31a06b3 | 444 | } |
Nikollao | 6:c11bb31a06b3 | 445 | } |
Nikollao | 6:c11bb31a06b3 | 446 | } |
Nikollao | 6:c11bb31a06b3 | 447 | |
Nikollao | 6:c11bb31a06b3 | 448 | |
Nikollao | 6:c11bb31a06b3 | 449 | |
Nikollao | 0:2d0f77943105 | 450 | void error() |
Nikollao | 0:2d0f77943105 | 451 | { |
Nikollao | 6:c11bb31a06b3 | 452 | /// display error message |
Nikollao | 0:2d0f77943105 | 453 | while (1) { |
Nikollao | 6:c11bb31a06b3 | 454 | |
Nikollao | 0:2d0f77943105 | 455 | lcd.printString("Error!",0,0); |
Nikollao | 0:2d0f77943105 | 456 | r_led = 0; |
Nikollao | 0:2d0f77943105 | 457 | wait(0.2); |
Nikollao | 0:2d0f77943105 | 458 | r_led = 1; |
Nikollao | 0:2d0f77943105 | 459 | wait(0.2); |
Nikollao | 0:2d0f77943105 | 460 | } |
Nikollao | 0:2d0f77943105 | 461 | } |