Racing Cars game using N5110 LCD and thumb Joystick

Dependencies:   N5110 PowerControl beep mbed

Committer:
el13gs
Date:
Sat May 02 17:32:04 2015 +0000
Revision:
4:f9a899c6ac50
Child:
5:243718c3cd8b
good working version 1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el13gs 4:f9a899c6ac50 1 #include "N5110.h"
el13gs 4:f9a899c6ac50 2 #include "mbed.h"
el13gs 4:f9a899c6ac50 3 #include "PowerControl.h"
el13gs 4:f9a899c6ac50 4 #include "beep.h"
el13gs 4:f9a899c6ac50 5
el13gs 4:f9a899c6ac50 6
el13gs 4:f9a899c6ac50 7 // change this to alter tolerance of joystick direction
el13gs 4:f9a899c6ac50 8 #define DIRECTION_TOLERANCE 0.05
el13gs 4:f9a899c6ac50 9
el13gs 4:f9a899c6ac50 10 // connections for joystick
el13gs 4:f9a899c6ac50 11 DigitalIn button(p17);
el13gs 4:f9a899c6ac50 12 DigitalIn select(p25);
el13gs 4:f9a899c6ac50 13 InterruptIn start(p24);
el13gs 4:f9a899c6ac50 14
el13gs 4:f9a899c6ac50 15 AnalogIn yPot(p18);
el13gs 4:f9a899c6ac50 16 AnalogIn xPot(p19);
el13gs 4:f9a899c6ac50 17 Beep buzzer(p21);
el13gs 4:f9a899c6ac50 18
el13gs 4:f9a899c6ac50 19
el13gs 4:f9a899c6ac50 20 //nokia display connections
el13gs 4:f9a899c6ac50 21 N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
el13gs 4:f9a899c6ac50 22
el13gs 4:f9a899c6ac50 23 // timer to regularly read the joystick
el13gs 4:f9a899c6ac50 24 Ticker pollJoystick;
el13gs 4:f9a899c6ac50 25 Ticker timer;
el13gs 4:f9a899c6ac50 26 Ticker randomize;
el13gs 4:f9a899c6ac50 27
el13gs 4:f9a899c6ac50 28
el13gs 4:f9a899c6ac50 29 // create enumerated type (0,1,2,3 etc. for direction)
el13gs 4:f9a899c6ac50 30 // could be extended for diagonals etc.
el13gs 4:f9a899c6ac50 31 enum DirectionName {
el13gs 4:f9a899c6ac50 32 UP,
el13gs 4:f9a899c6ac50 33 DOWN,
el13gs 4:f9a899c6ac50 34 LEFT,
el13gs 4:f9a899c6ac50 35 RIGHT,
el13gs 4:f9a899c6ac50 36 CENTRE,
el13gs 4:f9a899c6ac50 37 UNKNOWN
el13gs 4:f9a899c6ac50 38 };
el13gs 4:f9a899c6ac50 39
el13gs 4:f9a899c6ac50 40 // struct for Joystick
el13gs 4:f9a899c6ac50 41 typedef struct JoyStick Joystick;
el13gs 4:f9a899c6ac50 42 struct JoyStick {
el13gs 4:f9a899c6ac50 43 float x; // current x value
el13gs 4:f9a899c6ac50 44 float x0; // 'centred' x value
el13gs 4:f9a899c6ac50 45 float y; // current y value
el13gs 4:f9a899c6ac50 46 float y0; // 'centred' y value
el13gs 4:f9a899c6ac50 47 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
el13gs 4:f9a899c6ac50 48 DirectionName direction; // current direction
el13gs 4:f9a899c6ac50 49 };
el13gs 4:f9a899c6ac50 50 // create struct variable
el13gs 4:f9a899c6ac50 51 Joystick joystick;
el13gs 4:f9a899c6ac50 52
el13gs 4:f9a899c6ac50 53 //flag pointers when interrupt comes in
el13gs 4:f9a899c6ac50 54 int printFlag = 0;
el13gs 4:f9a899c6ac50 55 int buttonFlag=0;
el13gs 4:f9a899c6ac50 56
el13gs 4:f9a899c6ac50 57 //initial enemies Y positions (p,q,c)
el13gs 4:f9a899c6ac50 58 int p=-20;
el13gs 4:f9a899c6ac50 59 int q=-100;
el13gs 4:f9a899c6ac50 60 int c=0;
el13gs 4:f9a899c6ac50 61 int j=0;
el13gs 4:f9a899c6ac50 62
el13gs 4:f9a899c6ac50 63 //enemies X positions (p,q,c)
el13gs 4:f9a899c6ac50 64 int enemy1x=46;
el13gs 4:f9a899c6ac50 65 int enemy2x=6;
el13gs 4:f9a899c6ac50 66 int enemy3x=26;
el13gs 4:f9a899c6ac50 67
el13gs 4:f9a899c6ac50 68
el13gs 4:f9a899c6ac50 69 //initial player's Car position and its dimensions(w,h)
el13gs 4:f9a899c6ac50 70 int x=26; //x-position
el13gs 4:f9a899c6ac50 71 int v=30; //y-position
el13gs 4:f9a899c6ac50 72 int w=8; // width
el13gs 4:f9a899c6ac50 73 int h=12; // height
el13gs 4:f9a899c6ac50 74
el13gs 4:f9a899c6ac50 75 //initial Coin Xposition
el13gs 4:f9a899c6ac50 76 int xPos=6;
el13gs 4:f9a899c6ac50 77
el13gs 4:f9a899c6ac50 78 int lives=5;
el13gs 4:f9a899c6ac50 79 int coins=0;
el13gs 4:f9a899c6ac50 80 int round=1;
el13gs 4:f9a899c6ac50 81
el13gs 4:f9a899c6ac50 82 float brightness=0.9;
el13gs 4:f9a899c6ac50 83 int brightnessDisplay=9;
el13gs 4:f9a899c6ac50 84
el13gs 4:f9a899c6ac50 85 int table[84][48];
el13gs 4:f9a899c6ac50 86
el13gs 4:f9a899c6ac50 87 // function prototypes
el13gs 4:f9a899c6ac50 88 void calibrateJoystick();
el13gs 4:f9a899c6ac50 89 void updateJoystick();
el13gs 4:f9a899c6ac50 90 void ClearCar(int x,int v,int w,int h);
el13gs 4:f9a899c6ac50 91 void gameInitial();
el13gs 4:f9a899c6ac50 92 void enemy1MovesDown();
el13gs 4:f9a899c6ac50 93 void enemy2MovesDown();
el13gs 4:f9a899c6ac50 94 void enemy3MovesDown();
el13gs 4:f9a899c6ac50 95
el13gs 4:f9a899c6ac50 96 void movePlayer();
el13gs 4:f9a899c6ac50 97 void initTable();
el13gs 4:f9a899c6ac50 98 void loose();
el13gs 4:f9a899c6ac50 99 void resetPlayer();
el13gs 4:f9a899c6ac50 100 void checkPlayerPos();
el13gs 4:f9a899c6ac50 101 void coinMoves();
el13gs 4:f9a899c6ac50 102 void drawCoin(int c);
el13gs 4:f9a899c6ac50 103 void clearCoin(int c);
el13gs 4:f9a899c6ac50 104 void randomizeCoin();
el13gs 4:f9a899c6ac50 105 void setCircleCells(int x0,int y0,int radius);
el13gs 4:f9a899c6ac50 106 void clearCircleCells(int x0,int y0,int radius);
el13gs 4:f9a899c6ac50 107 void buttonPressed();
el13gs 4:f9a899c6ac50 108 void clearCells(int x,int y);
el13gs 4:f9a899c6ac50 109 void setCells(int x,int v,int w,int h);
el13gs 4:f9a899c6ac50 110
el13gs 4:f9a899c6ac50 111 int gamePlays=1;
el13gs 4:f9a899c6ac50 112 int coinAppear=1;
el13gs 4:f9a899c6ac50 113 int enemiesMoving=1;
el13gs 4:f9a899c6ac50 114 int optionsPointer=1;
el13gs 4:f9a899c6ac50 115 int pointerSelect;
el13gs 4:f9a899c6ac50 116 int sounds=1;
el13gs 4:f9a899c6ac50 117
el13gs 4:f9a899c6ac50 118 float joystickCheckTime=1.0/30.0;
el13gs 4:f9a899c6ac50 119
el13gs 4:f9a899c6ac50 120
el13gs 4:f9a899c6ac50 121
el13gs 4:f9a899c6ac50 122 int main()
el13gs 4:f9a899c6ac50 123
el13gs 4:f9a899c6ac50 124 {
el13gs 4:f9a899c6ac50 125 char soundString[3];
el13gs 4:f9a899c6ac50 126 sprintf(soundString,"%s","YES");
el13gs 4:f9a899c6ac50 127 calibrateJoystick(); // get centred values of joystick
el13gs 4:f9a899c6ac50 128 pollJoystick.attach(&updateJoystick,joystickCheckTime); // read joystick 0 times per second
el13gs 4:f9a899c6ac50 129 lcd.setXYAddress(0,0);
el13gs 4:f9a899c6ac50 130 initTable();
el13gs 4:f9a899c6ac50 131 lcd.init();
el13gs 4:f9a899c6ac50 132 lcd.refresh();
el13gs 4:f9a899c6ac50 133 start.rise(&buttonPressed);
el13gs 4:f9a899c6ac50 134
el13gs 4:f9a899c6ac50 135
el13gs 4:f9a899c6ac50 136 MainMenu:
el13gs 4:f9a899c6ac50 137 buttonFlag=0;
el13gs 4:f9a899c6ac50 138 pointerSelect=1;
el13gs 4:f9a899c6ac50 139 clearCells(84,48);
el13gs 4:f9a899c6ac50 140 lcd.drawCircle(22,19,2,1); //draw pointer around Play submenu when selected
el13gs 4:f9a899c6ac50 141 lcd.drawCircle(53,19,2,1); //draw pointer around Play submenu when selected
el13gs 4:f9a899c6ac50 142 lcd.printString("MAIN MENU",15,0); //print title
el13gs 4:f9a899c6ac50 143 lcd.printString("Play",26,2); //print submenu title
el13gs 4:f9a899c6ac50 144 lcd.printString("Options",20,3); //print submenu title
el13gs 4:f9a899c6ac50 145 lcd.drawLine(15,9,65,9,1);//underline main menu title
el13gs 4:f9a899c6ac50 146
el13gs 4:f9a899c6ac50 147 while(buttonFlag==0) {
el13gs 4:f9a899c6ac50 148
el13gs 4:f9a899c6ac50 149 if (joystick.direction==DOWN) {
el13gs 4:f9a899c6ac50 150 lcd.drawCircle(16,27,2,1); //draw pointer around Options submenu when selected
el13gs 4:f9a899c6ac50 151 lcd.drawCircle(64,27,2,1); //draw pointer around Options submenu when selected
el13gs 4:f9a899c6ac50 152
el13gs 4:f9a899c6ac50 153 lcd.clearCircle(53,19,2,1);
el13gs 4:f9a899c6ac50 154 lcd.clearCircle(22,19,2,1);
el13gs 4:f9a899c6ac50 155
el13gs 4:f9a899c6ac50 156 pointerSelect=2;
el13gs 4:f9a899c6ac50 157
el13gs 4:f9a899c6ac50 158 }
el13gs 4:f9a899c6ac50 159 wait(0.1);
el13gs 4:f9a899c6ac50 160 if(joystick.direction==UP) {
el13gs 4:f9a899c6ac50 161 lcd.drawCircle(22,19,2,1); //draw pointer around Play submenu when selected
el13gs 4:f9a899c6ac50 162 lcd.drawCircle(53,19,2,1); //draw pointer around Play submenu when selected
el13gs 4:f9a899c6ac50 163
el13gs 4:f9a899c6ac50 164 lcd.clearCircle(16,27,2,1); //draw pointer around Options submenu when selected
el13gs 4:f9a899c6ac50 165 lcd.clearCircle(64,27,2,1);
el13gs 4:f9a899c6ac50 166 pointerSelect=1;
el13gs 4:f9a899c6ac50 167 }
el13gs 4:f9a899c6ac50 168
el13gs 4:f9a899c6ac50 169
el13gs 4:f9a899c6ac50 170
el13gs 4:f9a899c6ac50 171 }
el13gs 4:f9a899c6ac50 172
el13gs 4:f9a899c6ac50 173 switch(pointerSelect) {
el13gs 4:f9a899c6ac50 174
el13gs 4:f9a899c6ac50 175 case 1:
el13gs 4:f9a899c6ac50 176 //GameBegins:
el13gs 4:f9a899c6ac50 177
el13gs 4:f9a899c6ac50 178 buttonFlag=0;
el13gs 4:f9a899c6ac50 179 clearCells(84,48);
el13gs 4:f9a899c6ac50 180 wait(2);
el13gs 4:f9a899c6ac50 181 lcd.refresh();
el13gs 4:f9a899c6ac50 182 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 183 timer.attach(&movePlayer,0.1);
el13gs 4:f9a899c6ac50 184 gameInitial();
el13gs 4:f9a899c6ac50 185 char buffer[1];
el13gs 4:f9a899c6ac50 186 sprintf(buffer,"%d",lives);
el13gs 4:f9a899c6ac50 187 lcd.printString(buffer,74,1);
el13gs 4:f9a899c6ac50 188
el13gs 4:f9a899c6ac50 189
el13gs 4:f9a899c6ac50 190 char buffer1[1];
el13gs 4:f9a899c6ac50 191 sprintf(buffer1,"%d",round);
el13gs 4:f9a899c6ac50 192 lcd.printString(buffer1,74,3);
el13gs 4:f9a899c6ac50 193
el13gs 4:f9a899c6ac50 194 char buffer2[2];
el13gs 4:f9a899c6ac50 195 sprintf(buffer2,"%d",coins);
el13gs 4:f9a899c6ac50 196 lcd.printString(buffer2,72,5);
el13gs 4:f9a899c6ac50 197
el13gs 4:f9a899c6ac50 198
el13gs 4:f9a899c6ac50 199 //int pointerSelect;
el13gs 4:f9a899c6ac50 200
el13gs 4:f9a899c6ac50 201 while(gamePlays) {
el13gs 4:f9a899c6ac50 202
el13gs 4:f9a899c6ac50 203 int a=select.read();
el13gs 4:f9a899c6ac50 204 if(a){
el13gs 4:f9a899c6ac50 205 gamePlays=0;
el13gs 4:f9a899c6ac50 206 goto MainMenu;}
el13gs 4:f9a899c6ac50 207
el13gs 4:f9a899c6ac50 208 enemiesMoving=1;
el13gs 4:f9a899c6ac50 209 sprintf(buffer,"%d",lives);
el13gs 4:f9a899c6ac50 210 lcd.printString(buffer,74,1);
el13gs 4:f9a899c6ac50 211
el13gs 4:f9a899c6ac50 212 sprintf(buffer2,"%d",coins);
el13gs 4:f9a899c6ac50 213 lcd.printString(buffer2,72,5);
el13gs 4:f9a899c6ac50 214
el13gs 4:f9a899c6ac50 215 checkPlayerPos();
el13gs 4:f9a899c6ac50 216 lcd.refresh();
el13gs 4:f9a899c6ac50 217 enemy1MovesDown();
el13gs 4:f9a899c6ac50 218 lcd.refresh();
el13gs 4:f9a899c6ac50 219 enemy2MovesDown();
el13gs 4:f9a899c6ac50 220 lcd.refresh();
el13gs 4:f9a899c6ac50 221 enemy3MovesDown();
el13gs 4:f9a899c6ac50 222 lcd.refresh();
el13gs 4:f9a899c6ac50 223 coinMoves();
el13gs 4:f9a899c6ac50 224 }
el13gs 4:f9a899c6ac50 225 break;
el13gs 4:f9a899c6ac50 226
el13gs 4:f9a899c6ac50 227 case 2:
el13gs 4:f9a899c6ac50 228
el13gs 4:f9a899c6ac50 229 int optionsMenu=1;
el13gs 4:f9a899c6ac50 230
el13gs 4:f9a899c6ac50 231 buttonFlag=0;
el13gs 4:f9a899c6ac50 232
el13gs 4:f9a899c6ac50 233 clearCells(84,48);
el13gs 4:f9a899c6ac50 234 lcd.refresh();
el13gs 4:f9a899c6ac50 235 wait(0.02);
el13gs 4:f9a899c6ac50 236 lcd.printString("OPTIONS",18,0);
el13gs 4:f9a899c6ac50 237 lcd.printString("Exit",23,5);
el13gs 4:f9a899c6ac50 238 lcd.printString("Brightness",6,3);
el13gs 4:f9a899c6ac50 239 lcd.printString("Sound",6,2);
el13gs 4:f9a899c6ac50 240 lcd.drawLine(15,8,61,8,1);//underline Options Menu title
el13gs 4:f9a899c6ac50 241
el13gs 4:f9a899c6ac50 242 char buffer3[2];
el13gs 4:f9a899c6ac50 243 sprintf(buffer3,"%d",brightnessDisplay);
el13gs 4:f9a899c6ac50 244 lcd.printString(buffer3,68,3);
el13gs 4:f9a899c6ac50 245
el13gs 4:f9a899c6ac50 246
el13gs 4:f9a899c6ac50 247 lcd.printString(soundString,40,2);
el13gs 4:f9a899c6ac50 248
el13gs 4:f9a899c6ac50 249 while(optionsMenu) {
el13gs 4:f9a899c6ac50 250 char pointerbuffer[2];
el13gs 4:f9a899c6ac50 251 sprintf(pointerbuffer,"%d",optionsPointer);
el13gs 4:f9a899c6ac50 252 lcd.printString(pointerbuffer,0,0);
el13gs 4:f9a899c6ac50 253
el13gs 4:f9a899c6ac50 254 if (joystick.direction==UP) {
el13gs 4:f9a899c6ac50 255 optionsPointer--;
el13gs 4:f9a899c6ac50 256 if(optionsPointer==0) {
el13gs 4:f9a899c6ac50 257 optionsPointer=1;
el13gs 4:f9a899c6ac50 258 }
el13gs 4:f9a899c6ac50 259 }
el13gs 4:f9a899c6ac50 260 wait(0.1);
el13gs 4:f9a899c6ac50 261
el13gs 4:f9a899c6ac50 262 if(joystick.direction==DOWN) {
el13gs 4:f9a899c6ac50 263 optionsPointer++;
el13gs 4:f9a899c6ac50 264 if(optionsPointer>3) {
el13gs 4:f9a899c6ac50 265 optionsPointer=3;
el13gs 4:f9a899c6ac50 266 }
el13gs 4:f9a899c6ac50 267
el13gs 4:f9a899c6ac50 268 }
el13gs 4:f9a899c6ac50 269
el13gs 4:f9a899c6ac50 270
el13gs 4:f9a899c6ac50 271 if (optionsPointer==1) {
el13gs 4:f9a899c6ac50 272 lcd.drawCircle(2,19,2,1);
el13gs 4:f9a899c6ac50 273 lcd.clearCircle(2,27,2,1);
el13gs 4:f9a899c6ac50 274 lcd.clearCircle(19,44,2,1);
el13gs 4:f9a899c6ac50 275 if(joystick.direction==LEFT) {
el13gs 4:f9a899c6ac50 276 sounds=1;
el13gs 4:f9a899c6ac50 277 lcd.refresh();
el13gs 4:f9a899c6ac50 278 sprintf(soundString,"%s","YES");
el13gs 4:f9a899c6ac50 279 lcd.printString(soundString,40,2);
el13gs 4:f9a899c6ac50 280 }
el13gs 4:f9a899c6ac50 281 if(joystick.direction==RIGHT) {
el13gs 4:f9a899c6ac50 282 sounds=0;
el13gs 4:f9a899c6ac50 283 lcd.refresh();
el13gs 4:f9a899c6ac50 284 sprintf(soundString,"%s","NO ");
el13gs 4:f9a899c6ac50 285 lcd.printString(soundString,40,2);
el13gs 4:f9a899c6ac50 286 }
el13gs 4:f9a899c6ac50 287
el13gs 4:f9a899c6ac50 288 }
el13gs 4:f9a899c6ac50 289 if (optionsPointer==2) {
el13gs 4:f9a899c6ac50 290 lcd.drawCircle(2,27,2,1);
el13gs 4:f9a899c6ac50 291 lcd.clearCircle(2,19,2,1);
el13gs 4:f9a899c6ac50 292 lcd.clearCircle(19,44,2,1);
el13gs 4:f9a899c6ac50 293
el13gs 4:f9a899c6ac50 294 if(joystick.direction==LEFT) {
el13gs 4:f9a899c6ac50 295 brightness=brightness-.1;
el13gs 4:f9a899c6ac50 296 brightnessDisplay=brightnessDisplay-1;
el13gs 4:f9a899c6ac50 297 if(brightness<0.1||brightnessDisplay<0) {
el13gs 4:f9a899c6ac50 298 brightnessDisplay=1;
el13gs 4:f9a899c6ac50 299 brightness=0.1;
el13gs 4:f9a899c6ac50 300 }
el13gs 4:f9a899c6ac50 301 lcd.setBrightness(brightness);
el13gs 4:f9a899c6ac50 302
el13gs 4:f9a899c6ac50 303 char buffer3[2];
el13gs 4:f9a899c6ac50 304 sprintf(buffer3,"%d",brightnessDisplay);
el13gs 4:f9a899c6ac50 305 lcd.printString(buffer3,68,3);
el13gs 4:f9a899c6ac50 306 }
el13gs 4:f9a899c6ac50 307
el13gs 4:f9a899c6ac50 308 if(joystick.direction==RIGHT) {
el13gs 4:f9a899c6ac50 309 brightness=brightness+.1;
el13gs 4:f9a899c6ac50 310 brightnessDisplay=brightnessDisplay+1;
el13gs 4:f9a899c6ac50 311 if(brightness>0.9||brightnessDisplay>9) {
el13gs 4:f9a899c6ac50 312 brightnessDisplay=9;
el13gs 4:f9a899c6ac50 313 brightness=0.9;
el13gs 4:f9a899c6ac50 314 }
el13gs 4:f9a899c6ac50 315 lcd.setBrightness(brightness);
el13gs 4:f9a899c6ac50 316
el13gs 4:f9a899c6ac50 317 char buffer4[2];
el13gs 4:f9a899c6ac50 318 sprintf(buffer4,"%d",brightnessDisplay);
el13gs 4:f9a899c6ac50 319 lcd.printString(buffer4,68,3);
el13gs 4:f9a899c6ac50 320 }
el13gs 4:f9a899c6ac50 321
el13gs 4:f9a899c6ac50 322 }
el13gs 4:f9a899c6ac50 323 if (optionsPointer==3) {
el13gs 4:f9a899c6ac50 324 lcd.drawCircle(19,44,2,1);
el13gs 4:f9a899c6ac50 325 lcd.clearCircle(2,19,2,1);
el13gs 4:f9a899c6ac50 326 lcd.clearCircle(2,27,2,1);
el13gs 4:f9a899c6ac50 327
el13gs 4:f9a899c6ac50 328 if(buttonFlag) {
el13gs 4:f9a899c6ac50 329 goto MainMenu;
el13gs 4:f9a899c6ac50 330 }
el13gs 4:f9a899c6ac50 331 }
el13gs 4:f9a899c6ac50 332 wait(0.1);
el13gs 4:f9a899c6ac50 333
el13gs 4:f9a899c6ac50 334 }
el13gs 4:f9a899c6ac50 335 break;
el13gs 4:f9a899c6ac50 336 }
el13gs 4:f9a899c6ac50 337 }
el13gs 4:f9a899c6ac50 338
el13gs 4:f9a899c6ac50 339 void buttonPressed()
el13gs 4:f9a899c6ac50 340 {
el13gs 4:f9a899c6ac50 341 buttonFlag=!buttonFlag;
el13gs 4:f9a899c6ac50 342 }
el13gs 4:f9a899c6ac50 343
el13gs 4:f9a899c6ac50 344 void movePlayer()
el13gs 4:f9a899c6ac50 345 {
el13gs 4:f9a899c6ac50 346 if (gamePlays) {
el13gs 4:f9a899c6ac50 347 //lcd.refresh();
el13gs 4:f9a899c6ac50 348 if (joystick.direction==RIGHT&&x+w<58) {
el13gs 4:f9a899c6ac50 349
el13gs 4:f9a899c6ac50 350 ClearCar(x,v,w,h);
el13gs 4:f9a899c6ac50 351 x=x+4;
el13gs 4:f9a899c6ac50 352 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 353 lcd.refresh();
el13gs 4:f9a899c6ac50 354 if (table[x+w][v+h]==1||table[x+w][v]==1) {
el13gs 4:f9a899c6ac50 355 loose();
el13gs 4:f9a899c6ac50 356 }
el13gs 4:f9a899c6ac50 357
el13gs 4:f9a899c6ac50 358
el13gs 4:f9a899c6ac50 359 }
el13gs 4:f9a899c6ac50 360
el13gs 4:f9a899c6ac50 361 if (joystick.direction==LEFT&&x+w>10) {
el13gs 4:f9a899c6ac50 362
el13gs 4:f9a899c6ac50 363 ClearCar(x,v,w,h);
el13gs 4:f9a899c6ac50 364 x=x-4;
el13gs 4:f9a899c6ac50 365 lcd.refresh();
el13gs 4:f9a899c6ac50 366 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 367 if (table[x][v]==1||table[x][v+h]==1) {
el13gs 4:f9a899c6ac50 368 loose();
el13gs 4:f9a899c6ac50 369 }
el13gs 4:f9a899c6ac50 370
el13gs 4:f9a899c6ac50 371 }
el13gs 4:f9a899c6ac50 372
el13gs 4:f9a899c6ac50 373 if (joystick.direction==UP && v>2) {
el13gs 4:f9a899c6ac50 374
el13gs 4:f9a899c6ac50 375 ClearCar(x,v,w,h);
el13gs 4:f9a899c6ac50 376 v=v-4;
el13gs 4:f9a899c6ac50 377 lcd.refresh();
el13gs 4:f9a899c6ac50 378 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 379 if (table[x][v]==1||table[x+w][v]==1) {
el13gs 4:f9a899c6ac50 380 loose();
el13gs 4:f9a899c6ac50 381 }
el13gs 4:f9a899c6ac50 382
el13gs 4:f9a899c6ac50 383 }
el13gs 4:f9a899c6ac50 384 if (joystick.direction==DOWN && v<32) {
el13gs 4:f9a899c6ac50 385 ClearCar(x,v,w,h);
el13gs 4:f9a899c6ac50 386 v=v+4;
el13gs 4:f9a899c6ac50 387 lcd.refresh();
el13gs 4:f9a899c6ac50 388 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 389 if (table[x][v+h]==1||table[x+w][v+h]==1) {
el13gs 4:f9a899c6ac50 390 loose();
el13gs 4:f9a899c6ac50 391 }
el13gs 4:f9a899c6ac50 392
el13gs 4:f9a899c6ac50 393 }
el13gs 4:f9a899c6ac50 394
el13gs 4:f9a899c6ac50 395 }
el13gs 4:f9a899c6ac50 396 }
el13gs 4:f9a899c6ac50 397
el13gs 4:f9a899c6ac50 398 // read default positions of the joystick to calibrate later readings
el13gs 4:f9a899c6ac50 399 void calibrateJoystick()
el13gs 4:f9a899c6ac50 400 {
el13gs 4:f9a899c6ac50 401 button.mode(PullDown);
el13gs 4:f9a899c6ac50 402 // must not move during calibration
el13gs 4:f9a899c6ac50 403 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
el13gs 4:f9a899c6ac50 404 joystick.y0 = yPot;
el13gs 4:f9a899c6ac50 405 }
el13gs 4:f9a899c6ac50 406 void updateJoystick()
el13gs 4:f9a899c6ac50 407 {
el13gs 4:f9a899c6ac50 408 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
el13gs 4:f9a899c6ac50 409 joystick.x = xPot - joystick.x0;
el13gs 4:f9a899c6ac50 410 joystick.y = yPot - joystick.y0;
el13gs 4:f9a899c6ac50 411 // read button state
el13gs 4:f9a899c6ac50 412 joystick.button = button;
el13gs 4:f9a899c6ac50 413
el13gs 4:f9a899c6ac50 414 // calculate direction depending on x,y values
el13gs 4:f9a899c6ac50 415 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
el13gs 4:f9a899c6ac50 416 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 417 joystick.direction = CENTRE;
el13gs 4:f9a899c6ac50 418 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 419 joystick.direction = UP;
el13gs 4:f9a899c6ac50 420 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 421 joystick.direction = DOWN;
el13gs 4:f9a899c6ac50 422 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 423 joystick.direction = LEFT;
el13gs 4:f9a899c6ac50 424 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 425 joystick.direction = RIGHT;
el13gs 4:f9a899c6ac50 426 } else {
el13gs 4:f9a899c6ac50 427 joystick.direction = UNKNOWN;
el13gs 4:f9a899c6ac50 428 }
el13gs 4:f9a899c6ac50 429
el13gs 4:f9a899c6ac50 430 // set flag for printing
el13gs 4:f9a899c6ac50 431 printFlag = 1;
el13gs 4:f9a899c6ac50 432 }
el13gs 4:f9a899c6ac50 433
el13gs 4:f9a899c6ac50 434
el13gs 4:f9a899c6ac50 435 void ClearCar(int x,int v,int w,int h)
el13gs 4:f9a899c6ac50 436 {
el13gs 4:f9a899c6ac50 437 for(int i=x; i<=x+w; i++) {
el13gs 4:f9a899c6ac50 438 for(int j=v; j<=v+h; j++) {
el13gs 4:f9a899c6ac50 439 lcd.clearPixel(i,j);
el13gs 4:f9a899c6ac50 440 table[i][j]=0;
el13gs 4:f9a899c6ac50 441 }
el13gs 4:f9a899c6ac50 442 }
el13gs 4:f9a899c6ac50 443 }
el13gs 4:f9a899c6ac50 444
el13gs 4:f9a899c6ac50 445 void gameInitial()
el13gs 4:f9a899c6ac50 446 {
el13gs 4:f9a899c6ac50 447 lcd.drawLine(60,0,60,48,1);
el13gs 4:f9a899c6ac50 448 lcd.drawLine(60,16,84,16,1);
el13gs 4:f9a899c6ac50 449 lcd.drawLine(60,32,84,32,1);
el13gs 4:f9a899c6ac50 450 lcd.drawLine(20,0,20,48,2);
el13gs 4:f9a899c6ac50 451 lcd.drawLine(40,0,40,48,2);
el13gs 4:f9a899c6ac50 452 }
el13gs 4:f9a899c6ac50 453
el13gs 4:f9a899c6ac50 454
el13gs 4:f9a899c6ac50 455
el13gs 4:f9a899c6ac50 456
el13gs 4:f9a899c6ac50 457 void enemy1MovesDown()
el13gs 4:f9a899c6ac50 458 {
el13gs 4:f9a899c6ac50 459 ClearCar(enemy1x,(j-4),w,h);
el13gs 4:f9a899c6ac50 460 lcd.drawRect(enemy1x,j,w,h,1);
el13gs 4:f9a899c6ac50 461 setCells(enemy1x,j,w,h);
el13gs 4:f9a899c6ac50 462 wait(0.05);
el13gs 4:f9a899c6ac50 463 lcd.refresh();
el13gs 4:f9a899c6ac50 464
el13gs 4:f9a899c6ac50 465
el13gs 4:f9a899c6ac50 466 j=j+4;
el13gs 4:f9a899c6ac50 467 lcd.refresh();
el13gs 4:f9a899c6ac50 468
el13gs 4:f9a899c6ac50 469 if(j>60) {
el13gs 4:f9a899c6ac50 470 j=-(rand()%100+80);
el13gs 4:f9a899c6ac50 471 }
el13gs 4:f9a899c6ac50 472
el13gs 4:f9a899c6ac50 473 }
el13gs 4:f9a899c6ac50 474
el13gs 4:f9a899c6ac50 475
el13gs 4:f9a899c6ac50 476
el13gs 4:f9a899c6ac50 477 void enemy2MovesDown()
el13gs 4:f9a899c6ac50 478 {
el13gs 4:f9a899c6ac50 479 ClearCar(enemy2x,(p-4),w,h);
el13gs 4:f9a899c6ac50 480 lcd.drawRect(enemy2x,p,w,h,1);
el13gs 4:f9a899c6ac50 481 setCells(enemy2x,p,w,h);
el13gs 4:f9a899c6ac50 482 wait(0.05);
el13gs 4:f9a899c6ac50 483 lcd.refresh();
el13gs 4:f9a899c6ac50 484 p=p+4;
el13gs 4:f9a899c6ac50 485 lcd.refresh();
el13gs 4:f9a899c6ac50 486
el13gs 4:f9a899c6ac50 487 if(p>60) {
el13gs 4:f9a899c6ac50 488 p=-(rand()%40+20);
el13gs 4:f9a899c6ac50 489 }
el13gs 4:f9a899c6ac50 490 while(p==q) {
el13gs 4:f9a899c6ac50 491 p=-(rand()%40+20);
el13gs 4:f9a899c6ac50 492 }
el13gs 4:f9a899c6ac50 493
el13gs 4:f9a899c6ac50 494 }
el13gs 4:f9a899c6ac50 495
el13gs 4:f9a899c6ac50 496 void enemy3MovesDown()
el13gs 4:f9a899c6ac50 497 {
el13gs 4:f9a899c6ac50 498 ClearCar(enemy3x,(q-4),w,h);
el13gs 4:f9a899c6ac50 499 lcd.drawRect(enemy3x,q,w,h,1);
el13gs 4:f9a899c6ac50 500 setCells(enemy3x,q,w,h);
el13gs 4:f9a899c6ac50 501 wait(0.05);
el13gs 4:f9a899c6ac50 502 lcd.refresh();
el13gs 4:f9a899c6ac50 503 q=q+4;
el13gs 4:f9a899c6ac50 504 lcd.refresh();
el13gs 4:f9a899c6ac50 505 if (q>70) {
el13gs 4:f9a899c6ac50 506 q=-(rand()%10+1);
el13gs 4:f9a899c6ac50 507 }
el13gs 4:f9a899c6ac50 508
el13gs 4:f9a899c6ac50 509 }
el13gs 4:f9a899c6ac50 510
el13gs 4:f9a899c6ac50 511 void setCells(int x,int v,int w,int h)
el13gs 4:f9a899c6ac50 512 {
el13gs 4:f9a899c6ac50 513
el13gs 4:f9a899c6ac50 514 for(int i=x; i<=x+w; i++) {
el13gs 4:f9a899c6ac50 515 for(int j=v; j<=v+h; j++) {
el13gs 4:f9a899c6ac50 516 if(j>0&&j<48) {
el13gs 4:f9a899c6ac50 517 table[i][j]=1;
el13gs 4:f9a899c6ac50 518 }
el13gs 4:f9a899c6ac50 519 }
el13gs 4:f9a899c6ac50 520 }
el13gs 4:f9a899c6ac50 521 }
el13gs 4:f9a899c6ac50 522
el13gs 4:f9a899c6ac50 523 void initTable()
el13gs 4:f9a899c6ac50 524 {
el13gs 4:f9a899c6ac50 525 for (int i=0; i<=84; i++) {
el13gs 4:f9a899c6ac50 526 for(int j=0; j<=48; j++) {
el13gs 4:f9a899c6ac50 527 table[i][j]=0;
el13gs 4:f9a899c6ac50 528 }
el13gs 4:f9a899c6ac50 529 }
el13gs 4:f9a899c6ac50 530 }
el13gs 4:f9a899c6ac50 531
el13gs 4:f9a899c6ac50 532 void checkPlayerPos()
el13gs 4:f9a899c6ac50 533 {
el13gs 4:f9a899c6ac50 534 if (table[x+w][v+h]==1||table[x][v+h]==1||table[x][v]==1||table[x+w][v]==1) {
el13gs 4:f9a899c6ac50 535 loose();
el13gs 4:f9a899c6ac50 536
el13gs 4:f9a899c6ac50 537 }
el13gs 4:f9a899c6ac50 538 if (table[x+w][v+h]==2||table[x][v+h]==2||table[x][v]==2||table[x+w][v]==2) {
el13gs 4:f9a899c6ac50 539 coins=coins+10;
el13gs 4:f9a899c6ac50 540 coinAppear=0;
el13gs 4:f9a899c6ac50 541 if(sounds) {
el13gs 4:f9a899c6ac50 542 buzzer.beep(2200,0.4);
el13gs 4:f9a899c6ac50 543 buzzer.beep(1000,0.2);
el13gs 4:f9a899c6ac50 544 }
el13gs 4:f9a899c6ac50 545 }
el13gs 4:f9a899c6ac50 546
el13gs 4:f9a899c6ac50 547 }
el13gs 4:f9a899c6ac50 548
el13gs 4:f9a899c6ac50 549
el13gs 4:f9a899c6ac50 550 void coinMoves()
el13gs 4:f9a899c6ac50 551 {
el13gs 4:f9a899c6ac50 552 clearCoin(c);
el13gs 4:f9a899c6ac50 553 c=c+2;
el13gs 4:f9a899c6ac50 554 drawCoin(c);
el13gs 4:f9a899c6ac50 555
el13gs 4:f9a899c6ac50 556 wait(0.05);
el13gs 4:f9a899c6ac50 557 if(c>70) {
el13gs 4:f9a899c6ac50 558 randomizeCoin();
el13gs 4:f9a899c6ac50 559 coinAppear=1;
el13gs 4:f9a899c6ac50 560 c=-100;
el13gs 4:f9a899c6ac50 561 }
el13gs 4:f9a899c6ac50 562 }
el13gs 4:f9a899c6ac50 563
el13gs 4:f9a899c6ac50 564 void drawCoin(int c)
el13gs 4:f9a899c6ac50 565 {
el13gs 4:f9a899c6ac50 566 if (table[xPos][c+4]==0&&table[xPos][c-4]==0&&coinAppear) {
el13gs 4:f9a899c6ac50 567 lcd.drawCircle(xPos,c,4,0);
el13gs 4:f9a899c6ac50 568 setCircleCells(xPos,c,4);
el13gs 4:f9a899c6ac50 569
el13gs 4:f9a899c6ac50 570 lcd.setPixel(xPos,c-1);
el13gs 4:f9a899c6ac50 571 lcd.setPixel(xPos,c+2);
el13gs 4:f9a899c6ac50 572
el13gs 4:f9a899c6ac50 573 lcd.setPixel(xPos+1,c-1);
el13gs 4:f9a899c6ac50 574 lcd.setPixel(xPos+1,c+2);
el13gs 4:f9a899c6ac50 575
el13gs 4:f9a899c6ac50 576 lcd.setPixel(xPos-1,c);
el13gs 4:f9a899c6ac50 577 lcd.setPixel(xPos-1,c+1);
el13gs 4:f9a899c6ac50 578 lcd.refresh();
el13gs 4:f9a899c6ac50 579 }
el13gs 4:f9a899c6ac50 580 }
el13gs 4:f9a899c6ac50 581
el13gs 4:f9a899c6ac50 582 void clearCoin(int c)
el13gs 4:f9a899c6ac50 583 {
el13gs 4:f9a899c6ac50 584 lcd.clearCircle(xPos,c,4,0);
el13gs 4:f9a899c6ac50 585 clearCircleCells(xPos,c,4);
el13gs 4:f9a899c6ac50 586
el13gs 4:f9a899c6ac50 587 lcd.clearPixel(xPos,c-1);
el13gs 4:f9a899c6ac50 588 lcd.clearPixel(xPos,c+2);
el13gs 4:f9a899c6ac50 589
el13gs 4:f9a899c6ac50 590 lcd.clearPixel(xPos+1,c-1);
el13gs 4:f9a899c6ac50 591 lcd.clearPixel(xPos+1,c+2);
el13gs 4:f9a899c6ac50 592
el13gs 4:f9a899c6ac50 593 lcd.clearPixel(xPos-1,c);
el13gs 4:f9a899c6ac50 594 lcd.clearPixel(xPos-1,c+1);
el13gs 4:f9a899c6ac50 595 lcd.refresh();
el13gs 4:f9a899c6ac50 596
el13gs 4:f9a899c6ac50 597 }
el13gs 4:f9a899c6ac50 598
el13gs 4:f9a899c6ac50 599 void randomizeCoin()
el13gs 4:f9a899c6ac50 600 {
el13gs 4:f9a899c6ac50 601 int randX;
el13gs 4:f9a899c6ac50 602
el13gs 4:f9a899c6ac50 603 randX=rand()%3+1;
el13gs 4:f9a899c6ac50 604
el13gs 4:f9a899c6ac50 605 if (randX==1) {
el13gs 4:f9a899c6ac50 606 xPos=6;
el13gs 4:f9a899c6ac50 607 }
el13gs 4:f9a899c6ac50 608 if (randX==2) {
el13gs 4:f9a899c6ac50 609 xPos=26;
el13gs 4:f9a899c6ac50 610 }
el13gs 4:f9a899c6ac50 611 if (randX==3) {
el13gs 4:f9a899c6ac50 612 xPos=46;
el13gs 4:f9a899c6ac50 613 }
el13gs 4:f9a899c6ac50 614 }
el13gs 4:f9a899c6ac50 615
el13gs 4:f9a899c6ac50 616 void setCircleCells(int x0,int y0,int radius)
el13gs 4:f9a899c6ac50 617 {
el13gs 4:f9a899c6ac50 618 int x = radius;
el13gs 4:f9a899c6ac50 619 int y = 0;
el13gs 4:f9a899c6ac50 620 if(y0>0) {
el13gs 4:f9a899c6ac50 621 while(x >= y) {
el13gs 4:f9a899c6ac50 622
el13gs 4:f9a899c6ac50 623 table[x+x0][y+y0]=2;
el13gs 4:f9a899c6ac50 624 table[-x+x0][y+y0]=2;
el13gs 4:f9a899c6ac50 625 table[y+x0][x+y0]=2;
el13gs 4:f9a899c6ac50 626
el13gs 4:f9a899c6ac50 627 table[-y+x0][x+y0]=2;
el13gs 4:f9a899c6ac50 628 table[-y+x0][-x+y0]=2;
el13gs 4:f9a899c6ac50 629
el13gs 4:f9a899c6ac50 630 table[y+x0][-x+y0]=2;
el13gs 4:f9a899c6ac50 631 table[-x+x0][-y+y0]=2;
el13gs 4:f9a899c6ac50 632 table[-x+x0][-y+y0]=2;
el13gs 4:f9a899c6ac50 633 y++;
el13gs 4:f9a899c6ac50 634 }
el13gs 4:f9a899c6ac50 635 }
el13gs 4:f9a899c6ac50 636 }
el13gs 4:f9a899c6ac50 637
el13gs 4:f9a899c6ac50 638 void clearCircleCells(int x0,int y0,int radius)
el13gs 4:f9a899c6ac50 639 {
el13gs 4:f9a899c6ac50 640 int x = radius;
el13gs 4:f9a899c6ac50 641 int y = 0;
el13gs 4:f9a899c6ac50 642
el13gs 4:f9a899c6ac50 643 while(x >= y) {
el13gs 4:f9a899c6ac50 644
el13gs 4:f9a899c6ac50 645 // if transparent, just draw outline
el13gs 4:f9a899c6ac50 646 table[x+x0][y+y0]=0;
el13gs 4:f9a899c6ac50 647 table[-x+x0][y+y0]=0;
el13gs 4:f9a899c6ac50 648 table[y+x0][x+y0]=0;
el13gs 4:f9a899c6ac50 649
el13gs 4:f9a899c6ac50 650 table[-y+x0][x+y0]=0;
el13gs 4:f9a899c6ac50 651 table[-y+x0][-x+y0]=0;
el13gs 4:f9a899c6ac50 652
el13gs 4:f9a899c6ac50 653 table[y+x0][-x+y0]=0;
el13gs 4:f9a899c6ac50 654 table[-x+x0][-y+y0]=0;
el13gs 4:f9a899c6ac50 655 table[-x+x0][-y+y0]=0;
el13gs 4:f9a899c6ac50 656 y++;
el13gs 4:f9a899c6ac50 657 }
el13gs 4:f9a899c6ac50 658 }
el13gs 4:f9a899c6ac50 659
el13gs 4:f9a899c6ac50 660 void clearCells(int x,int y)
el13gs 4:f9a899c6ac50 661 {
el13gs 4:f9a899c6ac50 662 for(int i=0; i<=x; i++) {
el13gs 4:f9a899c6ac50 663 for (int j=0; j<=y; j++) {
el13gs 4:f9a899c6ac50 664 lcd.clearPixel(i,j);
el13gs 4:f9a899c6ac50 665 table[i][j]=0;
el13gs 4:f9a899c6ac50 666 }
el13gs 4:f9a899c6ac50 667 }
el13gs 4:f9a899c6ac50 668
el13gs 4:f9a899c6ac50 669 }
el13gs 4:f9a899c6ac50 670
el13gs 4:f9a899c6ac50 671 void loose()
el13gs 4:f9a899c6ac50 672 {
el13gs 4:f9a899c6ac50 673 if (sounds) {
el13gs 4:f9a899c6ac50 674 buzzer.beep(500,0.1);
el13gs 4:f9a899c6ac50 675 }
el13gs 4:f9a899c6ac50 676 lives=lives-1;
el13gs 4:f9a899c6ac50 677 gamePlays=0;
el13gs 4:f9a899c6ac50 678 wait(0.5);
el13gs 4:f9a899c6ac50 679 ClearCar(x,v,w,h);
el13gs 4:f9a899c6ac50 680 lcd.refresh();
el13gs 4:f9a899c6ac50 681 clearCells(60,48);
el13gs 4:f9a899c6ac50 682 lcd.setXYAddress(0,0);
el13gs 4:f9a899c6ac50 683
el13gs 4:f9a899c6ac50 684 wait(1);
el13gs 4:f9a899c6ac50 685 lcd.refresh();
el13gs 4:f9a899c6ac50 686 x=26;
el13gs 4:f9a899c6ac50 687 v=30;
el13gs 4:f9a899c6ac50 688 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 689 wait(0.5);
el13gs 4:f9a899c6ac50 690 gamePlays=1;
el13gs 4:f9a899c6ac50 691 j=-100;
el13gs 4:f9a899c6ac50 692 p=-50;
el13gs 4:f9a899c6ac50 693 q=-40;
el13gs 4:f9a899c6ac50 694 }
el13gs 4:f9a899c6ac50 695