Racing Cars game using N5110 LCD and thumb Joystick
Dependencies: N5110 PowerControl beep mbed
main.cpp@7:edf0f1fcb16b, 2015-05-08 (annotated)
- Committer:
- el13gs
- Date:
- Fri May 08 12:58:22 2015 +0000
- Revision:
- 7:edf0f1fcb16b
- Parent:
- 6:289f237b8d90
- Child:
- 8:699055e89c7d
*EXCELLENT WORKING VERSION *
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el13gs | 5:243718c3cd8b | 1 | /** |
el13gs | 5:243718c3cd8b | 2 | @file main.cpp |
el13gs | 5:243718c3cd8b | 3 | @brief Contains all functions implementations, and main program |
el13gs | 5:243718c3cd8b | 4 | */ |
el13gs | 5:243718c3cd8b | 5 | #include "main.h" |
el13gs | 4:f9a899c6ac50 | 6 | |
el13gs | 4:f9a899c6ac50 | 7 | int main() |
el13gs | 4:f9a899c6ac50 | 8 | |
el13gs | 4:f9a899c6ac50 | 9 | { |
el13gs | 7:edf0f1fcb16b | 10 | sprintf(soundString,"%s","YES"); //set the Sound Initial String to YES |
el13gs | 5:243718c3cd8b | 11 | |
el13gs | 4:f9a899c6ac50 | 12 | calibrateJoystick(); // get centred values of joystick |
el13gs | 5:243718c3cd8b | 13 | pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 30 times per second |
el13gs | 5:243718c3cd8b | 14 | |
el13gs | 5:243718c3cd8b | 15 | lcd.setXYAddress(0,0);//set the XY address to 0.0 as initialising condition |
el13gs | 5:243718c3cd8b | 16 | initTable();//initialise the array table |
el13gs | 5:243718c3cd8b | 17 | lcd.init();//initialise LCD screen |
el13gs | 4:f9a899c6ac50 | 18 | lcd.refresh(); |
el13gs | 7:edf0f1fcb16b | 19 | start.rise(&startButtonPressed); // Call function startButtonPressed when START button pressed |
el13gs | 7:edf0f1fcb16b | 20 | reset.rise(&resetButtonPressed); // Call function resetButtonPressed when RESET button pressed |
el13gs | 4:f9a899c6ac50 | 21 | |
el13gs | 4:f9a899c6ac50 | 22 | |
el13gs | 4:f9a899c6ac50 | 23 | MainMenu: |
el13gs | 7:edf0f1fcb16b | 24 | /* INITIAL DISPLAY IN MAIN MENU */ |
el13gs | 7:edf0f1fcb16b | 25 | calibrateJoystick(); // calibrate the Joystick |
el13gs | 7:edf0f1fcb16b | 26 | int menuPointer=1; // set the Pointer in Main Menu initially to 1 |
el13gs | 7:edf0f1fcb16b | 27 | startButtonFlag=0; // reset the pointing flags |
el13gs | 7:edf0f1fcb16b | 28 | resetButtonFlag=0; // reset the pointing flags |
el13gs | 7:edf0f1fcb16b | 29 | clearCells(84,48); // clear the whole Screen Cells |
el13gs | 7:edf0f1fcb16b | 30 | lcd.refresh(); // refresh are done after and before setting or clearing Pixels |
el13gs | 7:edf0f1fcb16b | 31 | lcd.drawCircle(22,19,2,1); //initial condition draw pointer around Play submenu |
el13gs | 7:edf0f1fcb16b | 32 | lcd.drawCircle(53,19,2,1); //initial condition draw pointer around Play submenu |
el13gs | 7:edf0f1fcb16b | 33 | |
el13gs | 4:f9a899c6ac50 | 34 | lcd.printString("MAIN MENU",15,0); //print title |
el13gs | 4:f9a899c6ac50 | 35 | lcd.printString("Play",26,2); //print submenu title |
el13gs | 4:f9a899c6ac50 | 36 | lcd.printString("Options",20,3); //print submenu title |
el13gs | 4:f9a899c6ac50 | 37 | lcd.drawLine(15,9,65,9,1);//underline main menu title |
el13gs | 4:f9a899c6ac50 | 38 | |
el13gs | 7:edf0f1fcb16b | 39 | /* While start Button is not pressed user can navigate through main Menu Submenus */ |
el13gs | 6:289f237b8d90 | 40 | while(startButtonFlag==0) { |
el13gs | 4:f9a899c6ac50 | 41 | |
el13gs | 7:edf0f1fcb16b | 42 | /* when joystick moves down, pointer selects Options subMenu */ |
el13gs | 4:f9a899c6ac50 | 43 | if (joystick.direction==DOWN) { |
el13gs | 4:f9a899c6ac50 | 44 | lcd.drawCircle(16,27,2,1); //draw pointer around Options submenu when selected |
el13gs | 4:f9a899c6ac50 | 45 | lcd.drawCircle(64,27,2,1); //draw pointer around Options submenu when selected |
el13gs | 4:f9a899c6ac50 | 46 | |
el13gs | 7:edf0f1fcb16b | 47 | lcd.clearCircle(53,19,2,1); //clear pointer around Play submenu |
el13gs | 7:edf0f1fcb16b | 48 | lcd.clearCircle(22,19,2,1); //clear pointer around Play submenu |
el13gs | 4:f9a899c6ac50 | 49 | |
el13gs | 7:edf0f1fcb16b | 50 | menuPointer=2; //set Pointer to 2 |
el13gs | 7:edf0f1fcb16b | 51 | } |
el13gs | 7:edf0f1fcb16b | 52 | wait(0.25); // some delay between joystick movement |
el13gs | 4:f9a899c6ac50 | 53 | |
el13gs | 7:edf0f1fcb16b | 54 | /* when joystick moves up, pointer selects Options subMenu */ |
el13gs | 4:f9a899c6ac50 | 55 | if(joystick.direction==UP) { |
el13gs | 4:f9a899c6ac50 | 56 | lcd.drawCircle(22,19,2,1); //draw pointer around Play submenu when selected |
el13gs | 4:f9a899c6ac50 | 57 | lcd.drawCircle(53,19,2,1); //draw pointer around Play submenu when selected |
el13gs | 4:f9a899c6ac50 | 58 | |
el13gs | 7:edf0f1fcb16b | 59 | lcd.clearCircle(16,27,2,1); //clear pointer around Options submenu |
el13gs | 7:edf0f1fcb16b | 60 | lcd.clearCircle(64,27,2,1); //clear pointer around Options submenu |
el13gs | 7:edf0f1fcb16b | 61 | menuPointer=1; //set Pointer to 1 |
el13gs | 4:f9a899c6ac50 | 62 | } |
el13gs | 4:f9a899c6ac50 | 63 | } |
el13gs | 4:f9a899c6ac50 | 64 | |
el13gs | 7:edf0f1fcb16b | 65 | /* SELECT POINTER CONDITION */ |
el13gs | 5:243718c3cd8b | 66 | switch(menuPointer) { |
el13gs | 4:f9a899c6ac50 | 67 | |
el13gs | 7:edf0f1fcb16b | 68 | /* Case when Play was selected */ |
el13gs | 4:f9a899c6ac50 | 69 | case 1: |
el13gs | 7:edf0f1fcb16b | 70 | /*INITIAL GAME CONDITIONS */ |
el13gs | 7:edf0f1fcb16b | 71 | startButtonFlag=0; //reset start Button Flag |
el13gs | 7:edf0f1fcb16b | 72 | gamePlays=1; // Begin the game with pointer set to 1 |
el13gs | 7:edf0f1fcb16b | 73 | lives=5; // set lives to 5 |
el13gs | 7:edf0f1fcb16b | 74 | round=1; // set round number to 1 |
el13gs | 7:edf0f1fcb16b | 75 | coins=0; // set coin number to 0 |
el13gs | 7:edf0f1fcb16b | 76 | clearCells(84,48); //clear the whole LCD screen |
el13gs | 7:edf0f1fcb16b | 77 | gameReset(); // set and draw initial player and enemies position |
el13gs | 4:f9a899c6ac50 | 78 | lcd.refresh(); |
el13gs | 7:edf0f1fcb16b | 79 | timer.attach(&movePlayer,0.1);// attach timer to call function that moves the Player |
el13gs | 5:243718c3cd8b | 80 | |
el13gs | 4:f9a899c6ac50 | 81 | |
el13gs | 5:243718c3cd8b | 82 | while(gamePlays) { |
el13gs | 4:f9a899c6ac50 | 83 | |
el13gs | 7:edf0f1fcb16b | 84 | //print Round number on buffer and display |
el13gs | 7:edf0f1fcb16b | 85 | sprintf(roundBuffer,"%d",round); |
el13gs | 7:edf0f1fcb16b | 86 | lcd.printString(roundBuffer,74,3); |
el13gs | 4:f9a899c6ac50 | 87 | |
el13gs | 7:edf0f1fcb16b | 88 | //print Lives number on buffer and display |
el13gs | 7:edf0f1fcb16b | 89 | sprintf(livesBuffer,"%d",lives); |
el13gs | 7:edf0f1fcb16b | 90 | lcd.printString(livesBuffer,74,1); |
el13gs | 6:289f237b8d90 | 91 | |
el13gs | 7:edf0f1fcb16b | 92 | //print Coins number on buffer and display |
el13gs | 7:edf0f1fcb16b | 93 | sprintf(coinsBuffer,"%d",coins); |
el13gs | 7:edf0f1fcb16b | 94 | lcd.printString(coinsBuffer,72,5); |
el13gs | 4:f9a899c6ac50 | 95 | |
el13gs | 7:edf0f1fcb16b | 96 | enemy1MovesDown(); //move enemy 1 downwards |
el13gs | 7:edf0f1fcb16b | 97 | checkPlayerPos(); //check player position frequently |
el13gs | 7:edf0f1fcb16b | 98 | // if gameplay is 0 returns to initial MAIN MENU |
el13gs | 7:edf0f1fcb16b | 99 | if (gamePlays==0) { |
el13gs | 7:edf0f1fcb16b | 100 | goto MainMenu; |
el13gs | 7:edf0f1fcb16b | 101 | } |
el13gs | 4:f9a899c6ac50 | 102 | |
el13gs | 7:edf0f1fcb16b | 103 | enemy2MovesDown(); //move enemy 2 downwards |
el13gs | 4:f9a899c6ac50 | 104 | checkPlayerPos(); |
el13gs | 7:edf0f1fcb16b | 105 | if (gamePlays==0) { |
el13gs | 7:edf0f1fcb16b | 106 | goto MainMenu; |
el13gs | 7:edf0f1fcb16b | 107 | } |
el13gs | 7:edf0f1fcb16b | 108 | |
el13gs | 7:edf0f1fcb16b | 109 | enemy3MovesDown(); //move enemy 3 downwards |
el13gs | 5:243718c3cd8b | 110 | |
el13gs | 7:edf0f1fcb16b | 111 | coinMoves(); // move coin downwards |
el13gs | 5:243718c3cd8b | 112 | checkPlayerPos(); |
el13gs | 7:edf0f1fcb16b | 113 | if (gamePlays==0) { |
el13gs | 7:edf0f1fcb16b | 114 | goto MainMenu; |
el13gs | 7:edf0f1fcb16b | 115 | } |
el13gs | 4:f9a899c6ac50 | 116 | } |
el13gs | 7:edf0f1fcb16b | 117 | |
el13gs | 4:f9a899c6ac50 | 118 | break; |
el13gs | 4:f9a899c6ac50 | 119 | |
el13gs | 4:f9a899c6ac50 | 120 | case 2: |
el13gs | 4:f9a899c6ac50 | 121 | |
el13gs | 7:edf0f1fcb16b | 122 | int optionsMenu=1; // set options Menu enabled |
el13gs | 4:f9a899c6ac50 | 123 | |
el13gs | 7:edf0f1fcb16b | 124 | startButtonFlag=0; //reset START Button Flag |
el13gs | 4:f9a899c6ac50 | 125 | |
el13gs | 7:edf0f1fcb16b | 126 | clearCells(84,48); // clear all screen Cells |
el13gs | 4:f9a899c6ac50 | 127 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 128 | wait(0.02); |
el13gs | 7:edf0f1fcb16b | 129 | /* PRINT OPTIONS SUBMENU DISPLAY */ |
el13gs | 4:f9a899c6ac50 | 130 | lcd.printString("OPTIONS",18,0); |
el13gs | 4:f9a899c6ac50 | 131 | lcd.printString("Exit",23,5); |
el13gs | 4:f9a899c6ac50 | 132 | lcd.printString("Brightness",6,3); |
el13gs | 4:f9a899c6ac50 | 133 | lcd.printString("Sound",6,2); |
el13gs | 7:edf0f1fcb16b | 134 | lcd.drawLine(15,8,61,8,1); //underline Options Menu title |
el13gs | 4:f9a899c6ac50 | 135 | |
el13gs | 7:edf0f1fcb16b | 136 | /* Print brightness value ranged from 1 to 10 to user */ |
el13gs | 7:edf0f1fcb16b | 137 | sprintf(brightnessBuffer,"%d",brightnessDisplay); |
el13gs | 7:edf0f1fcb16b | 138 | lcd.printString(brightnessBuffer,68,3); |
el13gs | 4:f9a899c6ac50 | 139 | |
el13gs | 7:edf0f1fcb16b | 140 | /* Print Sound string value , "YES" or "NO"*/ |
el13gs | 4:f9a899c6ac50 | 141 | lcd.printString(soundString,40,2); |
el13gs | 4:f9a899c6ac50 | 142 | |
el13gs | 7:edf0f1fcb16b | 143 | /* USER NAVIGATES WHILE IN OPTIONS MENU */ |
el13gs | 4:f9a899c6ac50 | 144 | while(optionsMenu) { |
el13gs | 4:f9a899c6ac50 | 145 | |
el13gs | 7:edf0f1fcb16b | 146 | /* If direction is up pointer value decrease by 1 (cannot decrease to less than 1) */ |
el13gs | 4:f9a899c6ac50 | 147 | if (joystick.direction==UP) { |
el13gs | 4:f9a899c6ac50 | 148 | optionsPointer--; |
el13gs | 4:f9a899c6ac50 | 149 | if(optionsPointer==0) { |
el13gs | 4:f9a899c6ac50 | 150 | optionsPointer=1; |
el13gs | 4:f9a899c6ac50 | 151 | } |
el13gs | 4:f9a899c6ac50 | 152 | } |
el13gs | 4:f9a899c6ac50 | 153 | wait(0.1); |
el13gs | 4:f9a899c6ac50 | 154 | |
el13gs | 7:edf0f1fcb16b | 155 | /* If direction is down pointer value increase by 1 (cannot increase to more than 3) */ |
el13gs | 4:f9a899c6ac50 | 156 | if(joystick.direction==DOWN) { |
el13gs | 4:f9a899c6ac50 | 157 | optionsPointer++; |
el13gs | 4:f9a899c6ac50 | 158 | if(optionsPointer>3) { |
el13gs | 4:f9a899c6ac50 | 159 | optionsPointer=3; |
el13gs | 4:f9a899c6ac50 | 160 | } |
el13gs | 4:f9a899c6ac50 | 161 | } |
el13gs | 7:edf0f1fcb16b | 162 | /* CASES FOR EACH POINTER VALUE */ |
el13gs | 7:edf0f1fcb16b | 163 | wait(0.1); |
el13gs | 7:edf0f1fcb16b | 164 | /* when it is 1, Sound submenu is selected */ |
el13gs | 4:f9a899c6ac50 | 165 | if (optionsPointer==1) { |
el13gs | 7:edf0f1fcb16b | 166 | /* print Circle pointer around Sound submenu */ |
el13gs | 4:f9a899c6ac50 | 167 | lcd.drawCircle(2,19,2,1); |
el13gs | 4:f9a899c6ac50 | 168 | lcd.clearCircle(2,27,2,1); |
el13gs | 4:f9a899c6ac50 | 169 | lcd.clearCircle(19,44,2,1); |
el13gs | 7:edf0f1fcb16b | 170 | /* if pointer is 1 and joystick direction is left, sound is enabled (=1)*/ |
el13gs | 4:f9a899c6ac50 | 171 | if(joystick.direction==LEFT) { |
el13gs | 4:f9a899c6ac50 | 172 | sounds=1; |
el13gs | 4:f9a899c6ac50 | 173 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 174 | sprintf(soundString,"%s","YES"); |
el13gs | 4:f9a899c6ac50 | 175 | lcd.printString(soundString,40,2); |
el13gs | 4:f9a899c6ac50 | 176 | } |
el13gs | 7:edf0f1fcb16b | 177 | /* if pointer is 1 and joystick direction is right, sound is disabled (=0)*/ |
el13gs | 4:f9a899c6ac50 | 178 | if(joystick.direction==RIGHT) { |
el13gs | 4:f9a899c6ac50 | 179 | sounds=0; |
el13gs | 4:f9a899c6ac50 | 180 | lcd.refresh(); |
el13gs | 7:edf0f1fcb16b | 181 | sprintf(soundString,"%s","NO "); //print string in buffer |
el13gs | 7:edf0f1fcb16b | 182 | lcd.printString(soundString,40,2); //display value of buffer |
el13gs | 4:f9a899c6ac50 | 183 | } |
el13gs | 4:f9a899c6ac50 | 184 | |
el13gs | 4:f9a899c6ac50 | 185 | } |
el13gs | 7:edf0f1fcb16b | 186 | /* when it is 2, brightness submenu is selected */ |
el13gs | 4:f9a899c6ac50 | 187 | if (optionsPointer==2) { |
el13gs | 7:edf0f1fcb16b | 188 | /* print Circle pointer around Brightness submenu */ |
el13gs | 4:f9a899c6ac50 | 189 | lcd.drawCircle(2,27,2,1); |
el13gs | 4:f9a899c6ac50 | 190 | lcd.clearCircle(2,19,2,1); |
el13gs | 4:f9a899c6ac50 | 191 | lcd.clearCircle(19,44,2,1); |
el13gs | 4:f9a899c6ac50 | 192 | |
el13gs | 7:edf0f1fcb16b | 193 | /* if pointer is 2 and joystick direction is left, brightness decreases by 0.1*/ |
el13gs | 4:f9a899c6ac50 | 194 | if(joystick.direction==LEFT) { |
el13gs | 4:f9a899c6ac50 | 195 | brightness=brightness-.1; |
el13gs | 7:edf0f1fcb16b | 196 | brightnessDisplay=brightnessDisplay-1; // user displayed value also decrease |
el13gs | 7:edf0f1fcb16b | 197 | if(brightness<0.1||brightnessDisplay<0) { // brightnessDisplay and brightness never go below 0 and 0.1 respectively |
el13gs | 4:f9a899c6ac50 | 198 | brightnessDisplay=1; |
el13gs | 4:f9a899c6ac50 | 199 | brightness=0.1; |
el13gs | 4:f9a899c6ac50 | 200 | } |
el13gs | 7:edf0f1fcb16b | 201 | lcd.setBrightness(brightness); //sets the brightness |
el13gs | 4:f9a899c6ac50 | 202 | |
el13gs | 7:edf0f1fcb16b | 203 | /* print brightness Display on screen */ |
el13gs | 7:edf0f1fcb16b | 204 | sprintf(brightnessBuffer,"%d",brightnessDisplay); |
el13gs | 7:edf0f1fcb16b | 205 | lcd.printString(brightnessBuffer,68,3); |
el13gs | 4:f9a899c6ac50 | 206 | } |
el13gs | 4:f9a899c6ac50 | 207 | |
el13gs | 7:edf0f1fcb16b | 208 | /* if pointer is 2 and joystick direction is right, brightness increases by 0.1*/ |
el13gs | 4:f9a899c6ac50 | 209 | if(joystick.direction==RIGHT) { |
el13gs | 4:f9a899c6ac50 | 210 | brightness=brightness+.1; |
el13gs | 7:edf0f1fcb16b | 211 | brightnessDisplay=brightnessDisplay+1; // user displayed value also increase |
el13gs | 7:edf0f1fcb16b | 212 | if(brightness>0.9||brightnessDisplay>9) {// brightnessDisplay and brightness never go above 9 and 0.9 respectively |
el13gs | 4:f9a899c6ac50 | 213 | brightnessDisplay=9; |
el13gs | 4:f9a899c6ac50 | 214 | brightness=0.9; |
el13gs | 4:f9a899c6ac50 | 215 | } |
el13gs | 7:edf0f1fcb16b | 216 | lcd.setBrightness(brightness); //sets the brightness |
el13gs | 4:f9a899c6ac50 | 217 | |
el13gs | 7:edf0f1fcb16b | 218 | /* print brightness Display on screen */ |
el13gs | 7:edf0f1fcb16b | 219 | sprintf(brightnessBuffer,"%d",brightnessDisplay); |
el13gs | 7:edf0f1fcb16b | 220 | lcd.printString(brightnessBuffer,68,3); |
el13gs | 4:f9a899c6ac50 | 221 | } |
el13gs | 4:f9a899c6ac50 | 222 | |
el13gs | 4:f9a899c6ac50 | 223 | } |
el13gs | 4:f9a899c6ac50 | 224 | if (optionsPointer==3) { |
el13gs | 7:edf0f1fcb16b | 225 | /* print Circle pointer around Exit submenu */ |
el13gs | 4:f9a899c6ac50 | 226 | lcd.drawCircle(19,44,2,1); |
el13gs | 4:f9a899c6ac50 | 227 | lcd.clearCircle(2,19,2,1); |
el13gs | 4:f9a899c6ac50 | 228 | lcd.clearCircle(2,27,2,1); |
el13gs | 4:f9a899c6ac50 | 229 | |
el13gs | 7:edf0f1fcb16b | 230 | /* if START button is press while pointer is on Exit goes back to Main Menu label */ |
el13gs | 6:289f237b8d90 | 231 | if(startButtonFlag) { |
el13gs | 7:edf0f1fcb16b | 232 | wait(0.1); |
el13gs | 6:289f237b8d90 | 233 | startButtonFlag=0; |
el13gs | 7:edf0f1fcb16b | 234 | optionsMenu=0; |
el13gs | 4:f9a899c6ac50 | 235 | goto MainMenu; |
el13gs | 4:f9a899c6ac50 | 236 | } |
el13gs | 4:f9a899c6ac50 | 237 | } |
el13gs | 5:243718c3cd8b | 238 | wait(0.1); |
el13gs | 4:f9a899c6ac50 | 239 | |
el13gs | 4:f9a899c6ac50 | 240 | } |
el13gs | 4:f9a899c6ac50 | 241 | break; |
el13gs | 4:f9a899c6ac50 | 242 | } |
el13gs | 4:f9a899c6ac50 | 243 | } |
el13gs | 4:f9a899c6ac50 | 244 | |
el13gs | 6:289f237b8d90 | 245 | void startButtonPressed() |
el13gs | 4:f9a899c6ac50 | 246 | { |
el13gs | 6:289f237b8d90 | 247 | startButtonFlag=!startButtonFlag; |
el13gs | 4:f9a899c6ac50 | 248 | } |
el13gs | 4:f9a899c6ac50 | 249 | |
el13gs | 6:289f237b8d90 | 250 | void resetButtonPressed() |
el13gs | 6:289f237b8d90 | 251 | { |
el13gs | 6:289f237b8d90 | 252 | resetButtonFlag=!resetButtonFlag; |
el13gs | 6:289f237b8d90 | 253 | } |
el13gs | 6:289f237b8d90 | 254 | |
el13gs | 4:f9a899c6ac50 | 255 | void movePlayer() |
el13gs | 4:f9a899c6ac50 | 256 | { |
el13gs | 4:f9a899c6ac50 | 257 | if (gamePlays) { |
el13gs | 4:f9a899c6ac50 | 258 | //lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 259 | if (joystick.direction==RIGHT&&x+w<58) { |
el13gs | 4:f9a899c6ac50 | 260 | |
el13gs | 5:243718c3cd8b | 261 | clearRect(x,v,w,h); |
el13gs | 5:243718c3cd8b | 262 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 263 | x=x+4; |
el13gs | 4:f9a899c6ac50 | 264 | lcd.drawRect(x,v,w,h,0); |
el13gs | 4:f9a899c6ac50 | 265 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 266 | } |
el13gs | 4:f9a899c6ac50 | 267 | |
el13gs | 4:f9a899c6ac50 | 268 | if (joystick.direction==LEFT&&x+w>10) { |
el13gs | 4:f9a899c6ac50 | 269 | |
el13gs | 5:243718c3cd8b | 270 | clearRect(x,v,w,h); |
el13gs | 5:243718c3cd8b | 271 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 272 | x=x-4; |
el13gs | 5:243718c3cd8b | 273 | |
el13gs | 4:f9a899c6ac50 | 274 | lcd.drawRect(x,v,w,h,0); |
el13gs | 5:243718c3cd8b | 275 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 276 | } |
el13gs | 4:f9a899c6ac50 | 277 | |
el13gs | 4:f9a899c6ac50 | 278 | if (joystick.direction==UP && v>2) { |
el13gs | 4:f9a899c6ac50 | 279 | |
el13gs | 5:243718c3cd8b | 280 | clearRect(x,v,w,h); |
el13gs | 5:243718c3cd8b | 281 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 282 | v=v-4; |
el13gs | 4:f9a899c6ac50 | 283 | lcd.drawRect(x,v,w,h,0); |
el13gs | 5:243718c3cd8b | 284 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 285 | } |
el13gs | 4:f9a899c6ac50 | 286 | if (joystick.direction==DOWN && v<32) { |
el13gs | 5:243718c3cd8b | 287 | clearRect(x,v,w,h); |
el13gs | 5:243718c3cd8b | 288 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 289 | v=v+4; |
el13gs | 4:f9a899c6ac50 | 290 | lcd.drawRect(x,v,w,h,0); |
el13gs | 5:243718c3cd8b | 291 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 292 | } |
el13gs | 4:f9a899c6ac50 | 293 | |
el13gs | 4:f9a899c6ac50 | 294 | } |
el13gs | 4:f9a899c6ac50 | 295 | } |
el13gs | 4:f9a899c6ac50 | 296 | |
el13gs | 4:f9a899c6ac50 | 297 | void calibrateJoystick() |
el13gs | 4:f9a899c6ac50 | 298 | { |
el13gs | 4:f9a899c6ac50 | 299 | button.mode(PullDown); |
el13gs | 4:f9a899c6ac50 | 300 | // must not move during calibration |
el13gs | 4:f9a899c6ac50 | 301 | joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly) |
el13gs | 4:f9a899c6ac50 | 302 | joystick.y0 = yPot; |
el13gs | 4:f9a899c6ac50 | 303 | } |
el13gs | 4:f9a899c6ac50 | 304 | void updateJoystick() |
el13gs | 4:f9a899c6ac50 | 305 | { |
el13gs | 4:f9a899c6ac50 | 306 | joystick.x = xPot - joystick.x0; |
el13gs | 4:f9a899c6ac50 | 307 | joystick.y = yPot - joystick.y0; |
el13gs | 4:f9a899c6ac50 | 308 | // read button state |
el13gs | 4:f9a899c6ac50 | 309 | joystick.button = button; |
el13gs | 4:f9a899c6ac50 | 310 | |
el13gs | 4:f9a899c6ac50 | 311 | // calculate direction depending on x,y values |
el13gs | 4:f9a899c6ac50 | 312 | // tolerance allows a little lee-way in case joystick not exactly in the stated direction |
el13gs | 4:f9a899c6ac50 | 313 | if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
el13gs | 4:f9a899c6ac50 | 314 | joystick.direction = CENTRE; |
el13gs | 4:f9a899c6ac50 | 315 | } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
el13gs | 4:f9a899c6ac50 | 316 | joystick.direction = UP; |
el13gs | 4:f9a899c6ac50 | 317 | } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
el13gs | 4:f9a899c6ac50 | 318 | joystick.direction = DOWN; |
el13gs | 4:f9a899c6ac50 | 319 | } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
el13gs | 4:f9a899c6ac50 | 320 | joystick.direction = LEFT; |
el13gs | 4:f9a899c6ac50 | 321 | } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
el13gs | 4:f9a899c6ac50 | 322 | joystick.direction = RIGHT; |
el13gs | 4:f9a899c6ac50 | 323 | } else { |
el13gs | 4:f9a899c6ac50 | 324 | joystick.direction = UNKNOWN; |
el13gs | 4:f9a899c6ac50 | 325 | } |
el13gs | 4:f9a899c6ac50 | 326 | |
el13gs | 4:f9a899c6ac50 | 327 | // set flag for printing |
el13gs | 4:f9a899c6ac50 | 328 | printFlag = 1; |
el13gs | 4:f9a899c6ac50 | 329 | } |
el13gs | 4:f9a899c6ac50 | 330 | |
el13gs | 4:f9a899c6ac50 | 331 | |
el13gs | 5:243718c3cd8b | 332 | void clearRect(int x,int v,int w,int h) |
el13gs | 4:f9a899c6ac50 | 333 | { |
el13gs | 4:f9a899c6ac50 | 334 | for(int i=x; i<=x+w; i++) { |
el13gs | 4:f9a899c6ac50 | 335 | for(int j=v; j<=v+h; j++) { |
el13gs | 4:f9a899c6ac50 | 336 | lcd.clearPixel(i,j); |
el13gs | 4:f9a899c6ac50 | 337 | table[i][j]=0; |
el13gs | 4:f9a899c6ac50 | 338 | } |
el13gs | 4:f9a899c6ac50 | 339 | } |
el13gs | 4:f9a899c6ac50 | 340 | } |
el13gs | 4:f9a899c6ac50 | 341 | |
el13gs | 4:f9a899c6ac50 | 342 | |
el13gs | 4:f9a899c6ac50 | 343 | void enemy1MovesDown() |
el13gs | 4:f9a899c6ac50 | 344 | { |
el13gs | 6:289f237b8d90 | 345 | clearRect(enemy1x,(j-a),w,h); |
el13gs | 5:243718c3cd8b | 346 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 347 | lcd.drawRect(enemy1x,j,w,h,1); |
el13gs | 5:243718c3cd8b | 348 | lcd.refresh(); |
el13gs | 5:243718c3cd8b | 349 | setRectCells(enemy1x,j,w,h); |
el13gs | 5:243718c3cd8b | 350 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 351 | wait(0.05); |
el13gs | 4:f9a899c6ac50 | 352 | |
el13gs | 6:289f237b8d90 | 353 | j=j+a; |
el13gs | 5:243718c3cd8b | 354 | //lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 355 | |
el13gs | 4:f9a899c6ac50 | 356 | if(j>60) { |
el13gs | 4:f9a899c6ac50 | 357 | j=-(rand()%100+80); |
el13gs | 4:f9a899c6ac50 | 358 | } |
el13gs | 4:f9a899c6ac50 | 359 | |
el13gs | 4:f9a899c6ac50 | 360 | } |
el13gs | 4:f9a899c6ac50 | 361 | |
el13gs | 4:f9a899c6ac50 | 362 | void enemy2MovesDown() |
el13gs | 4:f9a899c6ac50 | 363 | { |
el13gs | 6:289f237b8d90 | 364 | clearRect(enemy2x,(p-a),w,h); |
el13gs | 5:243718c3cd8b | 365 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 366 | lcd.drawRect(enemy2x,p,w,h,1); |
el13gs | 5:243718c3cd8b | 367 | lcd.refresh(); |
el13gs | 5:243718c3cd8b | 368 | setRectCells(enemy2x,p,w,h); |
el13gs | 5:243718c3cd8b | 369 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 370 | wait(0.05); |
el13gs | 6:289f237b8d90 | 371 | p=p+a; |
el13gs | 5:243718c3cd8b | 372 | //lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 373 | |
el13gs | 4:f9a899c6ac50 | 374 | if(p>60) { |
el13gs | 4:f9a899c6ac50 | 375 | p=-(rand()%40+20); |
el13gs | 4:f9a899c6ac50 | 376 | } |
el13gs | 4:f9a899c6ac50 | 377 | while(p==q) { |
el13gs | 4:f9a899c6ac50 | 378 | p=-(rand()%40+20); |
el13gs | 4:f9a899c6ac50 | 379 | } |
el13gs | 4:f9a899c6ac50 | 380 | |
el13gs | 4:f9a899c6ac50 | 381 | } |
el13gs | 4:f9a899c6ac50 | 382 | |
el13gs | 4:f9a899c6ac50 | 383 | void enemy3MovesDown() |
el13gs | 4:f9a899c6ac50 | 384 | { |
el13gs | 6:289f237b8d90 | 385 | clearRect(enemy3x,(q-a),w,h); |
el13gs | 5:243718c3cd8b | 386 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 387 | lcd.drawRect(enemy3x,q,w,h,1); |
el13gs | 5:243718c3cd8b | 388 | lcd.refresh(); |
el13gs | 5:243718c3cd8b | 389 | setRectCells(enemy3x,q,w,h); |
el13gs | 5:243718c3cd8b | 390 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 391 | wait(0.05); |
el13gs | 4:f9a899c6ac50 | 392 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 393 | q=q+a; |
el13gs | 4:f9a899c6ac50 | 394 | if (q>70) { |
el13gs | 4:f9a899c6ac50 | 395 | q=-(rand()%10+1); |
el13gs | 4:f9a899c6ac50 | 396 | } |
el13gs | 4:f9a899c6ac50 | 397 | |
el13gs | 4:f9a899c6ac50 | 398 | } |
el13gs | 4:f9a899c6ac50 | 399 | |
el13gs | 5:243718c3cd8b | 400 | void setRectCells(int x,int v,int w,int h) |
el13gs | 4:f9a899c6ac50 | 401 | { |
el13gs | 4:f9a899c6ac50 | 402 | |
el13gs | 4:f9a899c6ac50 | 403 | for(int i=x; i<=x+w; i++) { |
el13gs | 4:f9a899c6ac50 | 404 | for(int j=v; j<=v+h; j++) { |
el13gs | 4:f9a899c6ac50 | 405 | if(j>0&&j<48) { |
el13gs | 4:f9a899c6ac50 | 406 | table[i][j]=1; |
el13gs | 4:f9a899c6ac50 | 407 | } |
el13gs | 4:f9a899c6ac50 | 408 | } |
el13gs | 4:f9a899c6ac50 | 409 | } |
el13gs | 4:f9a899c6ac50 | 410 | } |
el13gs | 4:f9a899c6ac50 | 411 | |
el13gs | 4:f9a899c6ac50 | 412 | void initTable() |
el13gs | 4:f9a899c6ac50 | 413 | { |
el13gs | 5:243718c3cd8b | 414 | for (int i=0; i<=83; i++) { |
el13gs | 5:243718c3cd8b | 415 | for(int j=0; j<=47; j++) { |
el13gs | 4:f9a899c6ac50 | 416 | table[i][j]=0; |
el13gs | 4:f9a899c6ac50 | 417 | } |
el13gs | 4:f9a899c6ac50 | 418 | } |
el13gs | 4:f9a899c6ac50 | 419 | } |
el13gs | 4:f9a899c6ac50 | 420 | |
el13gs | 4:f9a899c6ac50 | 421 | void checkPlayerPos() |
el13gs | 4:f9a899c6ac50 | 422 | { |
el13gs | 4:f9a899c6ac50 | 423 | if (table[x+w][v+h]==1||table[x][v+h]==1||table[x][v]==1||table[x+w][v]==1) { |
el13gs | 4:f9a899c6ac50 | 424 | loose(); |
el13gs | 4:f9a899c6ac50 | 425 | } |
el13gs | 4:f9a899c6ac50 | 426 | if (table[x+w][v+h]==2||table[x][v+h]==2||table[x][v]==2||table[x+w][v]==2) { |
el13gs | 5:243718c3cd8b | 427 | coins=coins+5; |
el13gs | 5:243718c3cd8b | 428 | clearCoin(c); |
el13gs | 4:f9a899c6ac50 | 429 | if(sounds) { |
el13gs | 4:f9a899c6ac50 | 430 | buzzer.beep(2200,0.4); |
el13gs | 4:f9a899c6ac50 | 431 | buzzer.beep(1000,0.2); |
el13gs | 7:edf0f1fcb16b | 432 | lcd.setBrightness(brightness); |
el13gs | 4:f9a899c6ac50 | 433 | } |
el13gs | 5:243718c3cd8b | 434 | coinAppear=0; |
el13gs | 5:243718c3cd8b | 435 | |
el13gs | 7:edf0f1fcb16b | 436 | if(coins==30) { |
el13gs | 6:289f237b8d90 | 437 | round=2; |
el13gs | 6:289f237b8d90 | 438 | gamePlays=0; |
el13gs | 6:289f237b8d90 | 439 | clearCells(84,48); |
el13gs | 6:289f237b8d90 | 440 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 441 | lcd.printString("ROUND 2",10,2); |
el13gs | 6:289f237b8d90 | 442 | wait(1); |
el13gs | 6:289f237b8d90 | 443 | clearCells(84,48); |
el13gs | 6:289f237b8d90 | 444 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 445 | gamePlays=1; |
el13gs | 7:edf0f1fcb16b | 446 | gameReset(); |
el13gs | 6:289f237b8d90 | 447 | a=6; |
el13gs | 6:289f237b8d90 | 448 | } |
el13gs | 6:289f237b8d90 | 449 | if(coins==70) { |
el13gs | 6:289f237b8d90 | 450 | round=3; |
el13gs | 6:289f237b8d90 | 451 | gamePlays=0; |
el13gs | 6:289f237b8d90 | 452 | clearCells(84,48); |
el13gs | 6:289f237b8d90 | 453 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 454 | lcd.printString("ROUND 3",10,2); |
el13gs | 6:289f237b8d90 | 455 | wait(1); |
el13gs | 6:289f237b8d90 | 456 | clearCells(84,48); |
el13gs | 6:289f237b8d90 | 457 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 458 | gamePlays=1; |
el13gs | 7:edf0f1fcb16b | 459 | gameReset(); |
el13gs | 6:289f237b8d90 | 460 | a=8; |
el13gs | 6:289f237b8d90 | 461 | } |
el13gs | 6:289f237b8d90 | 462 | if(coins==90) { |
el13gs | 7:edf0f1fcb16b | 463 | lcd.printString("YOU WIN!",8,3); |
el13gs | 6:289f237b8d90 | 464 | wait(3); |
el13gs | 6:289f237b8d90 | 465 | gamePlays=0; |
el13gs | 6:289f237b8d90 | 466 | } |
el13gs | 4:f9a899c6ac50 | 467 | } |
el13gs | 4:f9a899c6ac50 | 468 | } |
el13gs | 4:f9a899c6ac50 | 469 | |
el13gs | 4:f9a899c6ac50 | 470 | |
el13gs | 4:f9a899c6ac50 | 471 | void coinMoves() |
el13gs | 4:f9a899c6ac50 | 472 | { |
el13gs | 6:289f237b8d90 | 473 | if(table[xPos][c]==1) { //prevent coin from appearing above enemies |
el13gs | 6:289f237b8d90 | 474 | coinAppear=0; |
el13gs | 6:289f237b8d90 | 475 | } |
el13gs | 4:f9a899c6ac50 | 476 | clearCoin(c); |
el13gs | 6:289f237b8d90 | 477 | c=c+4; |
el13gs | 4:f9a899c6ac50 | 478 | drawCoin(c); |
el13gs | 5:243718c3cd8b | 479 | if(c>80) { |
el13gs | 6:289f237b8d90 | 480 | c=-(rand()%10); |
el13gs | 6:289f237b8d90 | 481 | xPos=rand()%52+4; |
el13gs | 4:f9a899c6ac50 | 482 | coinAppear=1; |
el13gs | 4:f9a899c6ac50 | 483 | } |
el13gs | 4:f9a899c6ac50 | 484 | } |
el13gs | 4:f9a899c6ac50 | 485 | |
el13gs | 4:f9a899c6ac50 | 486 | void drawCoin(int c) |
el13gs | 4:f9a899c6ac50 | 487 | { |
el13gs | 6:289f237b8d90 | 488 | if (c>4&&c<48&&coinAppear==1) { |
el13gs | 6:289f237b8d90 | 489 | lcd.drawCircle(xPos,c,4,0); //Draw Coin Circle Pixels |
el13gs | 6:289f237b8d90 | 490 | setCircleCells(xPos,c,4);// Set Coin array's cells values to 2 |
el13gs | 4:f9a899c6ac50 | 491 | |
el13gs | 6:289f237b8d90 | 492 | // "c" character Print on coin |
el13gs | 4:f9a899c6ac50 | 493 | lcd.setPixel(xPos,c-1); |
el13gs | 4:f9a899c6ac50 | 494 | lcd.setPixel(xPos,c+2); |
el13gs | 4:f9a899c6ac50 | 495 | lcd.setPixel(xPos+1,c-1); |
el13gs | 4:f9a899c6ac50 | 496 | lcd.setPixel(xPos+1,c+2); |
el13gs | 4:f9a899c6ac50 | 497 | lcd.setPixel(xPos-1,c); |
el13gs | 4:f9a899c6ac50 | 498 | lcd.setPixel(xPos-1,c+1); |
el13gs | 5:243718c3cd8b | 499 | |
el13gs | 4:f9a899c6ac50 | 500 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 501 | } |
el13gs | 4:f9a899c6ac50 | 502 | } |
el13gs | 4:f9a899c6ac50 | 503 | |
el13gs | 4:f9a899c6ac50 | 504 | void clearCoin(int c) |
el13gs | 4:f9a899c6ac50 | 505 | { |
el13gs | 6:289f237b8d90 | 506 | if(c>4&&c<48&&coinAppear==1) { |
el13gs | 7:edf0f1fcb16b | 507 | lcd.clearCircle(xPos,c,4,1); //Clear the Coin |
el13gs | 6:289f237b8d90 | 508 | clearCircleCells(xPos,c,4);// Set Coin array's cells values to 0 |
el13gs | 6:289f237b8d90 | 509 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 510 | } |
el13gs | 4:f9a899c6ac50 | 511 | } |
el13gs | 4:f9a899c6ac50 | 512 | |
el13gs | 4:f9a899c6ac50 | 513 | |
el13gs | 4:f9a899c6ac50 | 514 | void setCircleCells(int x0,int y0,int radius) |
el13gs | 4:f9a899c6ac50 | 515 | { |
el13gs | 6:289f237b8d90 | 516 | //function from N5110 Library |
el13gs | 4:f9a899c6ac50 | 517 | int x = radius; |
el13gs | 4:f9a899c6ac50 | 518 | int y = 0; |
el13gs | 4:f9a899c6ac50 | 519 | |
el13gs | 6:289f237b8d90 | 520 | while(x >= y) { |
el13gs | 4:f9a899c6ac50 | 521 | |
el13gs | 6:289f237b8d90 | 522 | setLineCells(x+x0,y+y0,-x+x0,y+y0,0); //set line's Cells values to 2 |
el13gs | 6:289f237b8d90 | 523 | setLineCells(y+x0,x+y0,-y+x0,x+y0,0);//set line's Cells values to 2 |
el13gs | 6:289f237b8d90 | 524 | setLineCells(y+x0,-x+y0,-y+x0,-x+y0,0);//set line's Cells values to 2 |
el13gs | 6:289f237b8d90 | 525 | setLineCells(x+x0,-y+y0,-x+x0,-y+y0,0);//set line's Cells values to 2 |
el13gs | 4:f9a899c6ac50 | 526 | |
el13gs | 6:289f237b8d90 | 527 | y++; |
el13gs | 4:f9a899c6ac50 | 528 | } |
el13gs | 4:f9a899c6ac50 | 529 | } |
el13gs | 4:f9a899c6ac50 | 530 | |
el13gs | 4:f9a899c6ac50 | 531 | void clearCircleCells(int x0,int y0,int radius) |
el13gs | 4:f9a899c6ac50 | 532 | { |
el13gs | 6:289f237b8d90 | 533 | //function from N5110 Library |
el13gs | 4:f9a899c6ac50 | 534 | int x = radius; |
el13gs | 4:f9a899c6ac50 | 535 | int y = 0; |
el13gs | 4:f9a899c6ac50 | 536 | |
el13gs | 4:f9a899c6ac50 | 537 | while(x >= y) { |
el13gs | 6:289f237b8d90 | 538 | clearLineCells(x+x0,y+y0,-x+x0,y+y0,0); |
el13gs | 6:289f237b8d90 | 539 | clearLineCells(y+x0,x+y0,-y+x0,x+y0,0); |
el13gs | 6:289f237b8d90 | 540 | clearLineCells(y+x0,-x+y0,-y+x0,-x+y0,0); |
el13gs | 6:289f237b8d90 | 541 | clearLineCells(x+x0,-y+y0,-x+x0,-y+y0,0); |
el13gs | 4:f9a899c6ac50 | 542 | y++; |
el13gs | 4:f9a899c6ac50 | 543 | } |
el13gs | 4:f9a899c6ac50 | 544 | } |
el13gs | 4:f9a899c6ac50 | 545 | |
el13gs | 4:f9a899c6ac50 | 546 | void clearCells(int x,int y) |
el13gs | 4:f9a899c6ac50 | 547 | { |
el13gs | 4:f9a899c6ac50 | 548 | for(int i=0; i<=x; i++) { |
el13gs | 4:f9a899c6ac50 | 549 | for (int j=0; j<=y; j++) { |
el13gs | 4:f9a899c6ac50 | 550 | lcd.clearPixel(i,j); |
el13gs | 4:f9a899c6ac50 | 551 | table[i][j]=0; |
el13gs | 4:f9a899c6ac50 | 552 | } |
el13gs | 4:f9a899c6ac50 | 553 | } |
el13gs | 5:243718c3cd8b | 554 | lcd.refresh(); |
el13gs | 4:f9a899c6ac50 | 555 | } |
el13gs | 4:f9a899c6ac50 | 556 | |
el13gs | 4:f9a899c6ac50 | 557 | void loose() |
el13gs | 4:f9a899c6ac50 | 558 | { |
el13gs | 4:f9a899c6ac50 | 559 | if (sounds) { |
el13gs | 5:243718c3cd8b | 560 | buzzer.beep(500,0.2); |
el13gs | 7:edf0f1fcb16b | 561 | lcd.setBrightness(brightness); |
el13gs | 4:f9a899c6ac50 | 562 | } |
el13gs | 7:edf0f1fcb16b | 563 | timer.detach(); |
el13gs | 4:f9a899c6ac50 | 564 | lives=lives-1; |
el13gs | 7:edf0f1fcb16b | 565 | startButtonFlag=0; |
el13gs | 7:edf0f1fcb16b | 566 | resetButtonFlag=0; |
el13gs | 5:243718c3cd8b | 567 | if(lives==0) { |
el13gs | 7:edf0f1fcb16b | 568 | |
el13gs | 5:243718c3cd8b | 569 | clearCells(84,48); |
el13gs | 5:243718c3cd8b | 570 | lcd.refresh(); |
el13gs | 5:243718c3cd8b | 571 | lcd.clear(); |
el13gs | 5:243718c3cd8b | 572 | |
el13gs | 7:edf0f1fcb16b | 573 | wait(1); |
el13gs | 6:289f237b8d90 | 574 | while(startButtonFlag==0&&resetButtonFlag==0) { |
el13gs | 6:289f237b8d90 | 575 | lcd.printString("Game Over!!!",0,0); |
el13gs | 6:289f237b8d90 | 576 | lcd.printString("Press START",0,2); |
el13gs | 6:289f237b8d90 | 577 | lcd.printString("to try again",0,3); |
el13gs | 6:289f237b8d90 | 578 | lcd.printString("or RESET",0,4); |
el13gs | 6:289f237b8d90 | 579 | lcd.printString("to exit :)",0,5); |
el13gs | 6:289f237b8d90 | 580 | } |
el13gs | 6:289f237b8d90 | 581 | if(startButtonFlag) { |
el13gs | 6:289f237b8d90 | 582 | a=4; |
el13gs | 6:289f237b8d90 | 583 | gamePlays=1; |
el13gs | 6:289f237b8d90 | 584 | lives=5; |
el13gs | 6:289f237b8d90 | 585 | coins=0; |
el13gs | 6:289f237b8d90 | 586 | round=1; |
el13gs | 6:289f237b8d90 | 587 | clearCells(84,48); |
el13gs | 7:edf0f1fcb16b | 588 | gameReset(); |
el13gs | 6:289f237b8d90 | 589 | startButtonFlag=0; |
el13gs | 6:289f237b8d90 | 590 | wait(1); |
el13gs | 6:289f237b8d90 | 591 | timer.attach(&movePlayer,0.1); |
el13gs | 6:289f237b8d90 | 592 | } |
el13gs | 6:289f237b8d90 | 593 | if (resetButtonFlag) { |
el13gs | 6:289f237b8d90 | 594 | gamePlays=0; |
el13gs | 6:289f237b8d90 | 595 | resetButtonFlag=0; |
el13gs | 6:289f237b8d90 | 596 | } |
el13gs | 5:243718c3cd8b | 597 | } |
el13gs | 4:f9a899c6ac50 | 598 | |
el13gs | 5:243718c3cd8b | 599 | else { |
el13gs | 5:243718c3cd8b | 600 | clearCells(60,48); |
el13gs | 5:243718c3cd8b | 601 | lcd.refresh(); |
el13gs | 7:edf0f1fcb16b | 602 | gameReset(); |
el13gs | 5:243718c3cd8b | 603 | wait(2); |
el13gs | 6:289f237b8d90 | 604 | gamePlays=1; |
el13gs | 7:edf0f1fcb16b | 605 | timer.attach(&movePlayer,0.1); |
el13gs | 5:243718c3cd8b | 606 | } |
el13gs | 4:f9a899c6ac50 | 607 | } |
el13gs | 4:f9a899c6ac50 | 608 | |
el13gs | 7:edf0f1fcb16b | 609 | void gameReset() |
el13gs | 6:289f237b8d90 | 610 | { |
el13gs | 6:289f237b8d90 | 611 | initTable(); |
el13gs | 6:289f237b8d90 | 612 | x=26; |
el13gs | 6:289f237b8d90 | 613 | v=30; |
el13gs | 6:289f237b8d90 | 614 | lcd.drawRect(x,v,w,h,0); |
el13gs | 6:289f237b8d90 | 615 | lcd.refresh(); |
el13gs | 6:289f237b8d90 | 616 | j=-70; |
el13gs | 6:289f237b8d90 | 617 | q=-10; |
el13gs | 6:289f237b8d90 | 618 | p=-40; |
el13gs | 7:edf0f1fcb16b | 619 | |
el13gs | 6:289f237b8d90 | 620 | } |
el13gs | 6:289f237b8d90 | 621 | |
el13gs | 6:289f237b8d90 | 622 | |
el13gs | 6:289f237b8d90 | 623 | void setLineCells(int x0,int y0,int x1,int y1,int type) |
el13gs | 6:289f237b8d90 | 624 | { |
el13gs | 6:289f237b8d90 | 625 | //function from N5110 Library |
el13gs | 6:289f237b8d90 | 626 | int y_range = y1-y0; // calc range of y and x |
el13gs | 6:289f237b8d90 | 627 | int x_range = x1-x0; |
el13gs | 6:289f237b8d90 | 628 | int start,stop,step; |
el13gs | 6:289f237b8d90 | 629 | |
el13gs | 6:289f237b8d90 | 630 | // if dotted line, set step to 2, else step is 1 |
el13gs | 6:289f237b8d90 | 631 | step = (type==2) ? 2:1; |
el13gs | 6:289f237b8d90 | 632 | |
el13gs | 6:289f237b8d90 | 633 | // make sure we loop over the largest range to get the most pixels on the display |
el13gs | 6:289f237b8d90 | 634 | // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels |
el13gs | 6:289f237b8d90 | 635 | // or else we'll only end up with 1 pixel in the x column |
el13gs | 6:289f237b8d90 | 636 | if ( abs(x_range) > abs(y_range) ) { |
el13gs | 6:289f237b8d90 | 637 | |
el13gs | 6:289f237b8d90 | 638 | // ensure we loop from smallest to largest or else for-loop won't run as expected |
el13gs | 6:289f237b8d90 | 639 | start = x1>x0 ? x0:x1; |
el13gs | 6:289f237b8d90 | 640 | stop = x1>x0 ? x1:x0; |
el13gs | 6:289f237b8d90 | 641 | |
el13gs | 6:289f237b8d90 | 642 | // loop between x pixels |
el13gs | 6:289f237b8d90 | 643 | for (int x = start; x<= stop ; x+=step) { |
el13gs | 6:289f237b8d90 | 644 | // do linear interpolation |
el13gs | 6:289f237b8d90 | 645 | int y = y0 + (y1-y0)*(x-x0)/(x1-x0); |
el13gs | 6:289f237b8d90 | 646 | |
el13gs | 6:289f237b8d90 | 647 | if (type == 0) // if 'white' line, turn off pixel |
el13gs | 6:289f237b8d90 | 648 | table[x][y]=2; |
el13gs | 6:289f237b8d90 | 649 | else |
el13gs | 6:289f237b8d90 | 650 | table[x][y]=2; // else if 'black' or 'dotted' turn on pixel |
el13gs | 6:289f237b8d90 | 651 | |
el13gs | 6:289f237b8d90 | 652 | } |
el13gs | 6:289f237b8d90 | 653 | } else { |
el13gs | 6:289f237b8d90 | 654 | |
el13gs | 6:289f237b8d90 | 655 | // ensure we loop from smallest to largest or else for-loop won't run as expected |
el13gs | 6:289f237b8d90 | 656 | start = y1>y0 ? y0:y1; |
el13gs | 6:289f237b8d90 | 657 | stop = y1>y0 ? y1:y0; |
el13gs | 6:289f237b8d90 | 658 | |
el13gs | 6:289f237b8d90 | 659 | for (int y = start; y<= stop ; y+=step) { |
el13gs | 6:289f237b8d90 | 660 | // do linear interpolation |
el13gs | 6:289f237b8d90 | 661 | int x = x0 + (x1-x0)*(y-y0)/(y1-y0); |
el13gs | 6:289f237b8d90 | 662 | |
el13gs | 6:289f237b8d90 | 663 | if (type == 0) // if 'white' line, turn off pixel |
el13gs | 6:289f237b8d90 | 664 | table[x][y]=2; |
el13gs | 6:289f237b8d90 | 665 | else |
el13gs | 6:289f237b8d90 | 666 | table[x][y]=2; // else if 'black' or 'dotted' turn on pixel |
el13gs | 6:289f237b8d90 | 667 | |
el13gs | 6:289f237b8d90 | 668 | } |
el13gs | 6:289f237b8d90 | 669 | } |
el13gs | 6:289f237b8d90 | 670 | |
el13gs | 6:289f237b8d90 | 671 | } |
el13gs | 6:289f237b8d90 | 672 | |
el13gs | 6:289f237b8d90 | 673 | void clearLineCells(int x0,int y0,int x1,int y1,int type) |
el13gs | 6:289f237b8d90 | 674 | { |
el13gs | 6:289f237b8d90 | 675 | //function from N5110 Library |
el13gs | 6:289f237b8d90 | 676 | int y_range = y1-y0; // calc range of y and x |
el13gs | 6:289f237b8d90 | 677 | int x_range = x1-x0; |
el13gs | 6:289f237b8d90 | 678 | int start,stop,step; |
el13gs | 6:289f237b8d90 | 679 | |
el13gs | 6:289f237b8d90 | 680 | // if dotted line, set step to 2, else step is 1 |
el13gs | 6:289f237b8d90 | 681 | step = (type==2) ? 2:1; |
el13gs | 6:289f237b8d90 | 682 | |
el13gs | 6:289f237b8d90 | 683 | // make sure we loop over the largest range to get the most pixels on the display |
el13gs | 6:289f237b8d90 | 684 | // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels |
el13gs | 6:289f237b8d90 | 685 | // or else we'll only end up with 1 pixel in the x column |
el13gs | 6:289f237b8d90 | 686 | if ( abs(x_range) > abs(y_range) ) { |
el13gs | 6:289f237b8d90 | 687 | |
el13gs | 6:289f237b8d90 | 688 | // ensure we loop from smallest to largest or else for-loop won't run as expected |
el13gs | 6:289f237b8d90 | 689 | start = x1>x0 ? x0:x1; |
el13gs | 6:289f237b8d90 | 690 | stop = x1>x0 ? x1:x0; |
el13gs | 6:289f237b8d90 | 691 | |
el13gs | 6:289f237b8d90 | 692 | // loop between x pixels |
el13gs | 6:289f237b8d90 | 693 | for (int x = start; x<= stop ; x+=step) { |
el13gs | 6:289f237b8d90 | 694 | // do linear interpolation |
el13gs | 6:289f237b8d90 | 695 | int y = y0 + (y1-y0)*(x-x0)/(x1-x0); |
el13gs | 6:289f237b8d90 | 696 | |
el13gs | 6:289f237b8d90 | 697 | if (type == 0) // if 'white' line, turn off pixel |
el13gs | 6:289f237b8d90 | 698 | table[x][y]=0; |
el13gs | 6:289f237b8d90 | 699 | else |
el13gs | 6:289f237b8d90 | 700 | table[x][y]=0; // else if 'black' or 'dotted' turn on pixel |
el13gs | 6:289f237b8d90 | 701 | |
el13gs | 6:289f237b8d90 | 702 | } |
el13gs | 6:289f237b8d90 | 703 | } else { |
el13gs | 6:289f237b8d90 | 704 | |
el13gs | 6:289f237b8d90 | 705 | // ensure we loop from smallest to largest or else for-loop won't run as expected |
el13gs | 6:289f237b8d90 | 706 | start = y1>y0 ? y0:y1; |
el13gs | 6:289f237b8d90 | 707 | stop = y1>y0 ? y1:y0; |
el13gs | 6:289f237b8d90 | 708 | |
el13gs | 6:289f237b8d90 | 709 | for (int y = start; y<= stop ; y+=step) { |
el13gs | 6:289f237b8d90 | 710 | // do linear interpolation |
el13gs | 6:289f237b8d90 | 711 | int x = x0 + (x1-x0)*(y-y0)/(y1-y0); |
el13gs | 6:289f237b8d90 | 712 | |
el13gs | 6:289f237b8d90 | 713 | if (type == 0) // if 'white' line, turn off pixel |
el13gs | 6:289f237b8d90 | 714 | table[x][y]=0; |
el13gs | 6:289f237b8d90 | 715 | else |
el13gs | 6:289f237b8d90 | 716 | table[x][y]=0; // else if 'black' or 'dotted' turn on pixel |
el13gs | 6:289f237b8d90 | 717 | |
el13gs | 6:289f237b8d90 | 718 | } |
el13gs | 6:289f237b8d90 | 719 | } |
el13gs | 6:289f237b8d90 | 720 | } |