A retro gaming programme, designed for use on a portable embedded system. Incorporates power saving techniques.

Dependencies:   ConfigFile N5110 PowerControl beep mbed

Committer:
el13drt
Date:
Thu Apr 16 16:23:42 2015 +0000
Revision:
10:947d35365ab8
Parent:
9:bb550cff98b3
Child:
11:6b8416a8ddb3
preLocalFileSystem

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el13drt 0:a8bc3aac5f69 1 /**
el13drt 0:a8bc3aac5f69 2 @file main.cpp
el13drt 0:a8bc3aac5f69 3 @brief Program implementation
el13drt 0:a8bc3aac5f69 4 */
el13drt 0:a8bc3aac5f69 5
el13drt 0:a8bc3aac5f69 6 #include "mbed.h"
el13drt 0:a8bc3aac5f69 7 #include "N5110.h"
el13drt 10:947d35365ab8 8 #include "beep.h"
el13drt 0:a8bc3aac5f69 9
el13drt 0:a8bc3aac5f69 10 #include <ctime>
el13drt 0:a8bc3aac5f69 11 #include <cstdlib>
el13drt 0:a8bc3aac5f69 12
el13drt 0:a8bc3aac5f69 13 // change this to alter tolerance of joystick direction
el13drt 0:a8bc3aac5f69 14 #define DIRECTION_TOLERANCE 0.05
el13drt 0:a8bc3aac5f69 15
el13drt 0:a8bc3aac5f69 16 // VCC,SCE,RST,D/C,MOSI,SCLK,LED - set pins for LCD
el13drt 0:a8bc3aac5f69 17 N5110 lcd(p7,p8,p9,p10,p11,p13,p22);
el13drt 0:a8bc3aac5f69 18
el13drt 10:947d35365ab8 19 // create buzzer objecct
el13drt 10:947d35365ab8 20 Beep buzzer(p21);
el13drt 10:947d35365ab8 21
el13drt 9:bb550cff98b3 22 // create local file system
el13drt 10:947d35365ab8 23 //LocalFileSytem local("local");
el13drt 9:bb550cff98b3 24
el13drt 0:a8bc3aac5f69 25 // navigation/action buttons
el13drt 0:a8bc3aac5f69 26 DigitalIn buttonA(p19);
el13drt 0:a8bc3aac5f69 27 DigitalIn buttonB(p20);
el13drt 0:a8bc3aac5f69 28
el13drt 3:57bab3b1c974 29 // LED indicators
el13drt 3:57bab3b1c974 30 AnalogOut ledR(p18);// RED LED
el13drt 3:57bab3b1c974 31 DigitalOut ledY(p24);// YELLOW LED
el13drt 3:57bab3b1c974 32
el13drt 0:a8bc3aac5f69 33 // connections for joystick
el13drt 3:57bab3b1c974 34 DigitalIn button(p17);
el13drt 0:a8bc3aac5f69 35 AnalogIn xPot(p15);
el13drt 0:a8bc3aac5f69 36 AnalogIn yPot(p16);
el13drt 0:a8bc3aac5f69 37
el13drt 0:a8bc3aac5f69 38 // boundary conditions
el13drt 0:a8bc3aac5f69 39 int cells [84][48];
el13drt 0:a8bc3aac5f69 40
el13drt 0:a8bc3aac5f69 41 // Globabl Variables /////////////////////////
el13drt 0:a8bc3aac5f69 42
el13drt 4:c6305031f80d 43 // player's score
el13drt 4:c6305031f80d 44 int score = 0;
el13drt 4:c6305031f80d 45
el13drt 7:217810c90306 46 // difficulty - number of pixels hazards incrememnt by
el13drt 7:217810c90306 47 int fall = 2;
el13drt 7:217810c90306 48
el13drt 4:c6305031f80d 49 // global variables for movement (pixelNinja)
el13drt 0:a8bc3aac5f69 50 int a1 = 22;
el13drt 0:a8bc3aac5f69 51 int a2 = 24;
el13drt 0:a8bc3aac5f69 52 int a3 = 23;
el13drt 0:a8bc3aac5f69 53 int a4 = 25;
el13drt 0:a8bc3aac5f69 54 int a5 = 20;
el13drt 0:a8bc3aac5f69 55 int a6 = 26;
el13drt 0:a8bc3aac5f69 56 int a7 = 19;
el13drt 0:a8bc3aac5f69 57 int a8 = 21;
el13drt 0:a8bc3aac5f69 58
el13drt 0:a8bc3aac5f69 59 //global variable for random X co-ordinates
el13drt 0:a8bc3aac5f69 60 int randX1;
el13drt 0:a8bc3aac5f69 61 int randX2;
el13drt 0:a8bc3aac5f69 62 int randX3;
el13drt 0:a8bc3aac5f69 63 int randX4;
el13drt 0:a8bc3aac5f69 64 int randX5;
el13drt 0:a8bc3aac5f69 65 int randX6;
el13drt 0:a8bc3aac5f69 66
el13drt 7:217810c90306 67 // global variable for Y co-ordinates
el13drt 0:a8bc3aac5f69 68 int randY1 = 0;
el13drt 0:a8bc3aac5f69 69 int randY2 = 0;
el13drt 0:a8bc3aac5f69 70 int randY3 = 0;
el13drt 0:a8bc3aac5f69 71 int randY4 = 0;
el13drt 0:a8bc3aac5f69 72 int randY5 = 0;
el13drt 0:a8bc3aac5f69 73 int randY6 = 0;
el13drt 0:a8bc3aac5f69 74
el13drt 0:a8bc3aac5f69 75 // timer to regularly read the joystick
el13drt 0:a8bc3aac5f69 76 Ticker pollJoystick;
el13drt 1:352c50e88ffa 77
el13drt 3:57bab3b1c974 78 // serial for debug
el13drt 0:a8bc3aac5f69 79 Serial serial(USBTX,USBRX);
el13drt 0:a8bc3aac5f69 80
el13drt 0:a8bc3aac5f69 81 // create enumerated type (0,1,2,3 etc. for direction)
el13drt 0:a8bc3aac5f69 82 // could be extended for diagonals etc.
el13drt 0:a8bc3aac5f69 83 enum DirectionName {
el13drt 0:a8bc3aac5f69 84 UP,
el13drt 0:a8bc3aac5f69 85 DOWN,
el13drt 0:a8bc3aac5f69 86 LEFT,
el13drt 0:a8bc3aac5f69 87 RIGHT,
el13drt 0:a8bc3aac5f69 88 CENTRE,
el13drt 0:a8bc3aac5f69 89 UNKNOWN
el13drt 0:a8bc3aac5f69 90 };
el13drt 0:a8bc3aac5f69 91
el13drt 0:a8bc3aac5f69 92 // struct for Joystick
el13drt 0:a8bc3aac5f69 93 typedef struct JoyStick Joystick;
el13drt 0:a8bc3aac5f69 94 struct JoyStick {
el13drt 0:a8bc3aac5f69 95 float x; // current x value
el13drt 0:a8bc3aac5f69 96 float x0; // 'centred' x value
el13drt 0:a8bc3aac5f69 97 float y; // current y value
el13drt 0:a8bc3aac5f69 98 float y0; // 'centred' y value
el13drt 0:a8bc3aac5f69 99 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
el13drt 0:a8bc3aac5f69 100 DirectionName direction; // current direction
el13drt 0:a8bc3aac5f69 101 };
el13drt 0:a8bc3aac5f69 102
el13drt 0:a8bc3aac5f69 103 // create struct variable
el13drt 0:a8bc3aac5f69 104 Joystick joystick;
el13drt 0:a8bc3aac5f69 105
el13drt 0:a8bc3aac5f69 106 int printFlag = 0;
el13drt 0:a8bc3aac5f69 107
el13drt 0:a8bc3aac5f69 108 // function prototypes
el13drt 0:a8bc3aac5f69 109 void calibrateJoystick();
el13drt 0:a8bc3aac5f69 110 void updateJoystick();
el13drt 0:a8bc3aac5f69 111
el13drt 0:a8bc3aac5f69 112 //intro screen
el13drt 0:a8bc3aac5f69 113 void welcome()
el13drt 0:a8bc3aac5f69 114 {
el13drt 0:a8bc3aac5f69 115 //bottom border
el13drt 0:a8bc3aac5f69 116 lcd.drawRect(0,44,84,2,1);
el13drt 0:a8bc3aac5f69 117
el13drt 0:a8bc3aac5f69 118 //top border
el13drt 0:a8bc3aac5f69 119 lcd.drawRect(0,1,84,2,1);
el13drt 0:a8bc3aac5f69 120
el13drt 0:a8bc3aac5f69 121 //print initials 'DRT'
el13drt 0:a8bc3aac5f69 122 lcd.printChar('D',30,14);
el13drt 0:a8bc3aac5f69 123 wait(0.6);
el13drt 0:a8bc3aac5f69 124 lcd.printChar('R',37,14);
el13drt 0:a8bc3aac5f69 125 wait(0.6);
el13drt 0:a8bc3aac5f69 126 lcd.printChar('T',44,14);
el13drt 0:a8bc3aac5f69 127 wait(0.6);
el13drt 0:a8bc3aac5f69 128
el13drt 0:a8bc3aac5f69 129 //print 'presents...'
el13drt 0:a8bc3aac5f69 130 lcd.printString("presents...",8,21);
el13drt 0:a8bc3aac5f69 131 wait(1.0);
el13drt 0:a8bc3aac5f69 132
el13drt 0:a8bc3aac5f69 133 //dramatic flashing
el13drt 0:a8bc3aac5f69 134 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 135 wait(0.2);
el13drt 0:a8bc3aac5f69 136 lcd.normalMode();
el13drt 0:a8bc3aac5f69 137 wait(0.2);
el13drt 0:a8bc3aac5f69 138 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 139 wait(0.2);
el13drt 0:a8bc3aac5f69 140 lcd.normalMode();
el13drt 0:a8bc3aac5f69 141 wait(1.0);
el13drt 0:a8bc3aac5f69 142
el13drt 0:a8bc3aac5f69 143 //more dramatic flashing
el13drt 0:a8bc3aac5f69 144 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 145 wait(0.2);
el13drt 0:a8bc3aac5f69 146 lcd.normalMode();
el13drt 0:a8bc3aac5f69 147 wait(0.2);
el13drt 0:a8bc3aac5f69 148 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 149 wait(0.2);
el13drt 0:a8bc3aac5f69 150 lcd.normalMode();
el13drt 0:a8bc3aac5f69 151 wait(0.6);
el13drt 0:a8bc3aac5f69 152 }
el13drt 0:a8bc3aac5f69 153
el13drt 0:a8bc3aac5f69 154 //selection menu///////////////////////////////////////////
el13drt 0:a8bc3aac5f69 155 void mainMenu()
el13drt 0:a8bc3aac5f69 156 {
el13drt 0:a8bc3aac5f69 157 //bottom border
el13drt 0:a8bc3aac5f69 158 lcd.drawRect(0,47,84,0,1);
el13drt 0:a8bc3aac5f69 159 //top border
el13drt 0:a8bc3aac5f69 160 lcd.drawRect(0,0,84,2,1);
el13drt 0:a8bc3aac5f69 161
el13drt 0:a8bc3aac5f69 162 //print 'Xtreme Tower'
el13drt 0:a8bc3aac5f69 163 lcd.printString("Xtreme",4,25);
el13drt 0:a8bc3aac5f69 164 lcd.printString("Tower",44,25);
el13drt 0:a8bc3aac5f69 165
el13drt 0:a8bc3aac5f69 166 //title outline
el13drt 0:a8bc3aac5f69 167 lcd.drawRect(3,6,77,10,0);
el13drt 0:a8bc3aac5f69 168
el13drt 0:a8bc3aac5f69 169 ////castle //x, y, w, h, fill//////////////////////
el13drt 0:a8bc3aac5f69 170
el13drt 0:a8bc3aac5f69 171 //castle main bulk
el13drt 0:a8bc3aac5f69 172 lcd.drawRect(59,32,21,8,1);
el13drt 0:a8bc3aac5f69 173
el13drt 0:a8bc3aac5f69 174 //left window bulk
el13drt 0:a8bc3aac5f69 175 lcd.drawRect(59,22,2,10,1);
el13drt 0:a8bc3aac5f69 176 //centre left window bulk
el13drt 0:a8bc3aac5f69 177 lcd.drawRect(65,22,2,10,1);
el13drt 0:a8bc3aac5f69 178 //centre right window bulk
el13drt 0:a8bc3aac5f69 179 lcd.drawRect(72,22,2,10,1);
el13drt 0:a8bc3aac5f69 180 //right window bulk
el13drt 0:a8bc3aac5f69 181 lcd.drawRect(78,22,2,10,1);
el13drt 0:a8bc3aac5f69 182 //central window bulk
el13drt 0:a8bc3aac5f69 183 lcd.drawRect(68,25,3,7,1);
el13drt 0:a8bc3aac5f69 184
el13drt 0:a8bc3aac5f69 185 //central window bulk
el13drt 0:a8bc3aac5f69 186 lcd.drawRect(75,28,0,0,1);
el13drt 0:a8bc3aac5f69 187 lcd.drawRect(77,28,0,0,1);
el13drt 0:a8bc3aac5f69 188 lcd.drawRect(64,28,0,0,1);
el13drt 0:a8bc3aac5f69 189 lcd.drawRect(62,28,0,0,1);
el13drt 0:a8bc3aac5f69 190
el13drt 0:a8bc3aac5f69 191 //above left window bulk
el13drt 0:a8bc3aac5f69 192 lcd.drawRect(62,25,3,2,1);
el13drt 0:a8bc3aac5f69 193 //above right window bulk
el13drt 0:a8bc3aac5f69 194 lcd.drawRect(75,25,2,2,1);
el13drt 0:a8bc3aac5f69 195
el13drt 0:a8bc3aac5f69 196 //lower right line
el13drt 0:a8bc3aac5f69 197 lcd.drawRect(71,42,9,0,1);
el13drt 0:a8bc3aac5f69 198 //upper right line
el13drt 0:a8bc3aac5f69 199 lcd.drawRect(70,41,10,0,1);
el13drt 0:a8bc3aac5f69 200
el13drt 0:a8bc3aac5f69 201 //upper left line
el13drt 0:a8bc3aac5f69 202 lcd.drawRect(59,41,10,0,1);
el13drt 0:a8bc3aac5f69 203 //lower left line
el13drt 0:a8bc3aac5f69 204 lcd.drawRect(59,42,9,0,1);
el13drt 0:a8bc3aac5f69 205
el13drt 0:a8bc3aac5f69 206 //bottom left bulk
el13drt 0:a8bc3aac5f69 207 lcd.drawRect(59,43,8,3,1);
el13drt 0:a8bc3aac5f69 208 //bottom right bulk
el13drt 0:a8bc3aac5f69 209 lcd.drawRect(72,43,8,3,1);
el13drt 0:a8bc3aac5f69 210
el13drt 0:a8bc3aac5f69 211 //option arrows - lower
el13drt 0:a8bc3aac5f69 212 lcd.drawRect(27,42,4,0,1);
el13drt 0:a8bc3aac5f69 213 lcd.drawRect(28,43,2,0,1);
el13drt 0:a8bc3aac5f69 214 lcd.drawRect(29,44,0,0,1);
el13drt 0:a8bc3aac5f69 215
el13drt 0:a8bc3aac5f69 216 //option arrows - higher
el13drt 0:a8bc3aac5f69 217 lcd.drawRect(27,29,4,0,1);
el13drt 0:a8bc3aac5f69 218 lcd.drawRect(28,28,2,0,1);
el13drt 0:a8bc3aac5f69 219 lcd.drawRect(29,27,0,0,1);
el13drt 0:a8bc3aac5f69 220 }
el13drt 0:a8bc3aac5f69 221
el13drt 0:a8bc3aac5f69 222 // static background
el13drt 0:a8bc3aac5f69 223 void backGround()
el13drt 0:a8bc3aac5f69 224 {
el13drt 0:a8bc3aac5f69 225 // x, y, w, h, fill - draw ground
el13drt 0:a8bc3aac5f69 226 lcd.drawRect(0,47,84,0,1);
el13drt 0:a8bc3aac5f69 227
el13drt 0:a8bc3aac5f69 228 // x, y, w, h, fill - draw left wall
el13drt 0:a8bc3aac5f69 229 lcd.drawRect(2,0,0,47,1);
el13drt 0:a8bc3aac5f69 230 // left wall - brick line 1
el13drt 0:a8bc3aac5f69 231 for(int x=0; x<47; x+=4)
el13drt 0:a8bc3aac5f69 232 lcd.drawLine(1,1,1,48,2);
el13drt 0:a8bc3aac5f69 233 // left wall - brick line 2
el13drt 0:a8bc3aac5f69 234 for(int x=0; x<47; x+=4)
el13drt 0:a8bc3aac5f69 235 lcd.drawLine(0,0,0,48,2);
el13drt 0:a8bc3aac5f69 236
el13drt 0:a8bc3aac5f69 237 // x, y, w, h, fill - draw right wall
el13drt 0:a8bc3aac5f69 238 lcd.drawRect(81,0,0,47,1);
el13drt 0:a8bc3aac5f69 239 // right wall - brick line 1
el13drt 0:a8bc3aac5f69 240 for(int x=0; x<WIDTH; x+=4)
el13drt 0:a8bc3aac5f69 241 lcd.drawLine(82,0,82,48,2);
el13drt 0:a8bc3aac5f69 242 // right wall - brick line 2
el13drt 0:a8bc3aac5f69 243 for(int x=0; x<WIDTH; x+=4)
el13drt 0:a8bc3aac5f69 244 lcd.drawLine(83,1,83,48,2);
el13drt 0:a8bc3aac5f69 245
el13drt 0:a8bc3aac5f69 246 lcd.refresh();
el13drt 0:a8bc3aac5f69 247 }
el13drt 0:a8bc3aac5f69 248
el13drt 0:a8bc3aac5f69 249 //pixel ninja character
el13drt 0:a8bc3aac5f69 250 void pixelNinja()
el13drt 0:a8bc3aac5f69 251 {
el13drt 0:a8bc3aac5f69 252 //x, y, w, h, fill - left leg
el13drt 0:a8bc3aac5f69 253 lcd.drawRect(a1,39,0,7,1);
el13drt 0:a8bc3aac5f69 254 //right leg
el13drt 0:a8bc3aac5f69 255 lcd.drawRect(a2,39,0,7,1);
el13drt 0:a8bc3aac5f69 256 //centre stick
el13drt 0:a8bc3aac5f69 257 lcd.drawRect(a3,37,0,7,1);
el13drt 0:a8bc3aac5f69 258 //back of the head
el13drt 0:a8bc3aac5f69 259 lcd.drawRect(a1,33,0,4,1);
el13drt 0:a8bc3aac5f69 260 //top of the head
el13drt 0:a8bc3aac5f69 261 lcd.drawRect(a1,33,4,0,1);
el13drt 0:a8bc3aac5f69 262 //jaw
el13drt 0:a8bc3aac5f69 263 lcd.drawRect(a2,38,2,0,1);
el13drt 0:a8bc3aac5f69 264 //right shoulder
el13drt 0:a8bc3aac5f69 265 lcd.drawRect(a4,40,1,0,1);
el13drt 0:a8bc3aac5f69 266 //left shoulder
el13drt 0:a8bc3aac5f69 267 lcd.drawRect(a5,40,1,0,1);
el13drt 0:a8bc3aac5f69 268 //left arm
el13drt 0:a8bc3aac5f69 269 lcd.drawRect(a5,41,0,1,1);
el13drt 0:a8bc3aac5f69 270 //right arm
el13drt 0:a8bc3aac5f69 271 lcd.drawRect(a6,41,0,1,1);
el13drt 0:a8bc3aac5f69 272 //right eye
el13drt 0:a8bc3aac5f69 273 lcd.drawRect(a6,35,0,0,1);
el13drt 0:a8bc3aac5f69 274 //mouth piece
el13drt 0:a8bc3aac5f69 275 lcd.drawRect(a6,37,0,0,1);
el13drt 0:a8bc3aac5f69 276 //left eye
el13drt 0:a8bc3aac5f69 277 lcd.drawRect(a2,35,0,0,1);
el13drt 0:a8bc3aac5f69 278 //sword handle
el13drt 0:a8bc3aac5f69 279 lcd.drawRect(a7,36,0,0,1);
el13drt 0:a8bc3aac5f69 280 lcd.drawRect(a5,37,0,0,1);
el13drt 0:a8bc3aac5f69 281 lcd.drawRect(a8,38,0,0,1);
el13drt 0:a8bc3aac5f69 282 }
el13drt 7:217810c90306 283 // stops ninja going through walls
el13drt 7:217810c90306 284 void ninjaBoundaries()
el13drt 7:217810c90306 285 {
el13drt 7:217810c90306 286 if(a6 > 79 )
el13drt 7:217810c90306 287 a6 = 79;
el13drt 7:217810c90306 288 if(a4 > 78)
el13drt 7:217810c90306 289 a4 = 78;
el13drt 7:217810c90306 290 if(a2 > 77)
el13drt 7:217810c90306 291 a2 = 77;
el13drt 7:217810c90306 292 if(a3 > 76)
el13drt 7:217810c90306 293 a3 = 76;
el13drt 7:217810c90306 294 if(a1 > 75)
el13drt 7:217810c90306 295 a1 = 75;
el13drt 7:217810c90306 296 if(a8 > 74)
el13drt 7:217810c90306 297 a8 = 74;
el13drt 7:217810c90306 298 if(a5 > 73)
el13drt 7:217810c90306 299 a5 = 73;
el13drt 7:217810c90306 300 if(a7 > 72)
el13drt 7:217810c90306 301 a7 = 72;
el13drt 7:217810c90306 302
el13drt 7:217810c90306 303 if(a6 < 11 )
el13drt 7:217810c90306 304 a6 = 11;
el13drt 7:217810c90306 305 if(a4 < 10)
el13drt 7:217810c90306 306 a4 = 10;
el13drt 7:217810c90306 307 if(a2 < 9)
el13drt 7:217810c90306 308 a2 = 9;
el13drt 7:217810c90306 309 if(a3 < 8)
el13drt 7:217810c90306 310 a3 = 8;
el13drt 7:217810c90306 311 if(a1 < 7)
el13drt 7:217810c90306 312 a1 = 7;
el13drt 7:217810c90306 313 if(a8 < 6)
el13drt 7:217810c90306 314 a8 = 6;
el13drt 7:217810c90306 315 if(a5 < 5)
el13drt 7:217810c90306 316 a5 = 5;
el13drt 7:217810c90306 317 if(a7 < 4)
el13drt 7:217810c90306 318 a7 = 4;
el13drt 7:217810c90306 319 }
el13drt 0:a8bc3aac5f69 320
el13drt 4:c6305031f80d 321 // resets back to initial values
el13drt 4:c6305031f80d 322 void resetGame()
el13drt 0:a8bc3aac5f69 323 {
el13drt 4:c6305031f80d 324 score = 0;
el13drt 0:a8bc3aac5f69 325
el13drt 4:c6305031f80d 326 a1 = 22;
el13drt 4:c6305031f80d 327 a2 = 24;
el13drt 4:c6305031f80d 328 a3 = 23;
el13drt 4:c6305031f80d 329 a4 = 25;
el13drt 4:c6305031f80d 330 a5 = 20;
el13drt 4:c6305031f80d 331 a6 = 26;
el13drt 4:c6305031f80d 332 a7 = 19;
el13drt 4:c6305031f80d 333 a8 = 21;
el13drt 0:a8bc3aac5f69 334
el13drt 4:c6305031f80d 335 // in this case the X values are given a
el13drt 4:c6305031f80d 336 // new random variable each time the player
el13drt 4:c6305031f80d 337 // dies or exits and starts a new game
el13drt 4:c6305031f80d 338 randX1 = rand() % 74 + 5;
el13drt 4:c6305031f80d 339 randX2 = rand() % 74 + 5;
el13drt 4:c6305031f80d 340 randX3 = rand() % 74 + 5;
el13drt 4:c6305031f80d 341 randX4 = rand() % 74 + 5;
el13drt 4:c6305031f80d 342 randX5 = rand() % 74 + 5;
el13drt 4:c6305031f80d 343 randX6 = rand() % 74 + 5;
el13drt 3:57bab3b1c974 344
el13drt 4:c6305031f80d 345 randY1 = 0;
el13drt 4:c6305031f80d 346 randY2 = 0;
el13drt 4:c6305031f80d 347 randY3 = 0;
el13drt 4:c6305031f80d 348 randY4 = 0;
el13drt 4:c6305031f80d 349 randY5 = 0;
el13drt 4:c6305031f80d 350 randY6 = 0;
el13drt 4:c6305031f80d 351 lcd.clear();
el13drt 0:a8bc3aac5f69 352 }
el13drt 0:a8bc3aac5f69 353
el13drt 0:a8bc3aac5f69 354 // draws falling hazards
el13drt 0:a8bc3aac5f69 355 void hazards()
el13drt 0:a8bc3aac5f69 356 {
el13drt 0:a8bc3aac5f69 357 // X, Y, radius, fill
el13drt 0:a8bc3aac5f69 358 lcd.drawCircle(randX1,randY1,2,1);
el13drt 0:a8bc3aac5f69 359 lcd.drawCircle(randX2,randY2,2,1);
el13drt 0:a8bc3aac5f69 360 lcd.drawCircle(randX3,randY3,2,1);
el13drt 0:a8bc3aac5f69 361 lcd.drawCircle(randX4,randY4,2,1);
el13drt 0:a8bc3aac5f69 362 lcd.drawCircle(randX5,randY5,2,1);
el13drt 0:a8bc3aac5f69 363 lcd.drawCircle(randX6,randY6,2,1);
el13drt 0:a8bc3aac5f69 364
el13drt 0:a8bc3aac5f69 365 lcd.refresh();
el13drt 0:a8bc3aac5f69 366 }
el13drt 0:a8bc3aac5f69 367
el13drt 0:a8bc3aac5f69 368 // makes hazards fall - randomises X axis co-ordinates
el13drt 0:a8bc3aac5f69 369 void hazardFall()
el13drt 0:a8bc3aac5f69 370 {
el13drt 0:a8bc3aac5f69 371 // increments randY1 variables
el13drt 0:a8bc3aac5f69 372 // appearing to make them fall
el13drt 7:217810c90306 373 randY1 = randY1 += fall;
el13drt 7:217810c90306 374 randY2 = randY2 += fall;
el13drt 7:217810c90306 375 randY3 = randY3 += fall;
el13drt 7:217810c90306 376 randY4 = randY4 += fall;
el13drt 7:217810c90306 377 randY5 = randY5 += fall;
el13drt 7:217810c90306 378 randY6 = randY6 += fall;
el13drt 0:a8bc3aac5f69 379
el13drt 0:a8bc3aac5f69 380 // loops the objects once they 'hit the floor'
el13drt 0:a8bc3aac5f69 381 // this imitates a new set of objects falling
el13drt 0:a8bc3aac5f69 382
el13drt 0:a8bc3aac5f69 383 if (randY1>=48)
el13drt 0:a8bc3aac5f69 384 randY1=0;
el13drt 0:a8bc3aac5f69 385
el13drt 0:a8bc3aac5f69 386 if (randY2>=48)
el13drt 0:a8bc3aac5f69 387 randY2=0;
el13drt 0:a8bc3aac5f69 388
el13drt 0:a8bc3aac5f69 389 if (randY3>=48)
el13drt 0:a8bc3aac5f69 390 randY3=0;
el13drt 0:a8bc3aac5f69 391
el13drt 0:a8bc3aac5f69 392 if (randY4>=48)
el13drt 0:a8bc3aac5f69 393 randY4=0;
el13drt 0:a8bc3aac5f69 394
el13drt 0:a8bc3aac5f69 395 if (randY5>=48)
el13drt 0:a8bc3aac5f69 396 randY5=0;
el13drt 0:a8bc3aac5f69 397
el13drt 0:a8bc3aac5f69 398 // each time the objects loop, a new pseudo random value
el13drt 0:a8bc3aac5f69 399 // is assigned to the global variables (randX) to
el13drt 0:a8bc3aac5f69 400 // randomise their positions
el13drt 0:a8bc3aac5f69 401
el13drt 0:a8bc3aac5f69 402 if (randY6>=48) {
el13drt 0:a8bc3aac5f69 403 randY6=0;
el13drt 0:a8bc3aac5f69 404
el13drt 6:fa2928bcec17 405 score = score++;//increment score by 1 after each wave of hazards
el13drt 4:c6305031f80d 406
el13drt 0:a8bc3aac5f69 407 randX1 = rand() % 74 + 5;// psuedo random number
el13drt 0:a8bc3aac5f69 408 randX2 = rand() % 74 + 5;// between 5 and 74
el13drt 0:a8bc3aac5f69 409 randX3 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 410 randX4 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 411 randX5 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 412 randX6 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 413 }
el13drt 0:a8bc3aac5f69 414 }
el13drt 0:a8bc3aac5f69 415
el13drt 0:a8bc3aac5f69 416 // clears old pixels and keeps set pixels
el13drt 0:a8bc3aac5f69 417 void startrek()
el13drt 0:a8bc3aac5f69 418 {
el13drt 0:a8bc3aac5f69 419 for (int i=3; i<81; i++)// loops through rows
el13drt 0:a8bc3aac5f69 420 for (int j=0; j<47; j++)
el13drt 0:a8bc3aac5f69 421 if (cells[i][j]) {// if there's a pixel then keep it
el13drt 0:a8bc3aac5f69 422 lcd.setPixel(i,j);
el13drt 0:a8bc3aac5f69 423 } else {
el13drt 0:a8bc3aac5f69 424 lcd.clearPixel(i,j);// else remove the old ones
el13drt 0:a8bc3aac5f69 425 }
el13drt 0:a8bc3aac5f69 426 lcd.refresh();
el13drt 0:a8bc3aac5f69 427 }
el13drt 0:a8bc3aac5f69 428
el13drt 7:217810c90306 429 // clears old pixels and keeps set pixels
el13drt 9:bb550cff98b3 430 void refreshCursor1()
el13drt 9:bb550cff98b3 431 {
el13drt 9:bb550cff98b3 432 for (int i=70; i<80; i++)// loops through rows
el13drt 9:bb550cff98b3 433 for (int j=17; j<25; j++)
el13drt 9:bb550cff98b3 434 if (cells[i][j]) {// if there's a pixel then keep it
el13drt 9:bb550cff98b3 435 lcd.setPixel(i,j);
el13drt 9:bb550cff98b3 436 } else {
el13drt 9:bb550cff98b3 437 lcd.clearPixel(i,j);// else remove the old ones
el13drt 9:bb550cff98b3 438 }
el13drt 9:bb550cff98b3 439 lcd.refresh();
el13drt 9:bb550cff98b3 440 }
el13drt 9:bb550cff98b3 441
el13drt 9:bb550cff98b3 442 // clears old pixels and keeps set pixels
el13drt 7:217810c90306 443 void refreshCursor2()
el13drt 7:217810c90306 444 {
el13drt 7:217810c90306 445 for (int i=70; i<80; i++)// loops through rows
el13drt 9:bb550cff98b3 446 for (int j=25; j<32; j++)
el13drt 7:217810c90306 447 if (cells[i][j]) {// if there's a pixel then keep it
el13drt 7:217810c90306 448 lcd.setPixel(i,j);
el13drt 7:217810c90306 449 } else {
el13drt 7:217810c90306 450 lcd.clearPixel(i,j);// else remove the old ones
el13drt 7:217810c90306 451 }
el13drt 7:217810c90306 452 lcd.refresh();
el13drt 7:217810c90306 453 }
el13drt 7:217810c90306 454
el13drt 7:217810c90306 455 // clears old pixels and keeps set pixels
el13drt 7:217810c90306 456 void refreshCursor3()
el13drt 7:217810c90306 457 {
el13drt 7:217810c90306 458 for (int i=70; i<80; i++)// loops through rows
el13drt 9:bb550cff98b3 459 for (int j=32; j<40; j++)
el13drt 7:217810c90306 460 if (cells[i][j]) {// if there's a pixel then keep it
el13drt 7:217810c90306 461 lcd.setPixel(i,j);
el13drt 7:217810c90306 462 } else {
el13drt 7:217810c90306 463 lcd.clearPixel(i,j);// else remove the old ones
el13drt 7:217810c90306 464 }
el13drt 7:217810c90306 465 lcd.refresh();
el13drt 7:217810c90306 466 }
el13drt 3:57bab3b1c974 467 // sound / light when buttonA is closed
el13drt 3:57bab3b1c974 468 void actionButton()
el13drt 3:57bab3b1c974 469 {
el13drt 3:57bab3b1c974 470 buttonA.mode(PullDown);
el13drt 3:57bab3b1c974 471 if (buttonA == 1) {
el13drt 3:57bab3b1c974 472 ledY = 1;
el13drt 10:947d35365ab8 473 buzzer.beep(1000,0.2);//frequeny/duration
el13drt 10:947d35365ab8 474
el13drt 10:947d35365ab8 475 serial.printf("buttonA\n");//for debugging
el13drt 3:57bab3b1c974 476 } else {
el13drt 10:947d35365ab8 477 ledY = 0;}
el13drt 3:57bab3b1c974 478 }
el13drt 3:57bab3b1c974 479
el13drt 3:57bab3b1c974 480 // sound / light when buttonB is closed
el13drt 3:57bab3b1c974 481 void backButton()
el13drt 3:57bab3b1c974 482 {
el13drt 3:57bab3b1c974 483 buttonB.mode(PullDown);
el13drt 10:947d35365ab8 484 if (buttonB == 1) {
el13drt 3:57bab3b1c974 485 ledY = 1;
el13drt 10:947d35365ab8 486 buzzer.beep(400,0.2);//frequency/duration
el13drt 10:947d35365ab8 487
el13drt 10:947d35365ab8 488 serial.printf("buttonB\n");//for debugging
el13drt 3:57bab3b1c974 489 } else {
el13drt 10:947d35365ab8 490 ledY = 0;}
el13drt 3:57bab3b1c974 491 }
el13drt 3:57bab3b1c974 492
el13drt 0:a8bc3aac5f69 493 int main()
el13drt 0:a8bc3aac5f69 494 {
el13drt 3:57bab3b1c974 495 // Power indicator - RED LED
el13drt 3:57bab3b1c974 496 ledR = 1;
el13drt 3:57bab3b1c974 497
el13drt 7:217810c90306 498 // helps return exit menu to main menu loop
el13drt 5:a0e4a67266d6 499 int exitFlag = 0;
el13drt 5:a0e4a67266d6 500
el13drt 3:57bab3b1c974 501 // initialize time seed for psuedo randomaisation
el13drt 0:a8bc3aac5f69 502 srand (time(NULL));
el13drt 0:a8bc3aac5f69 503
el13drt 0:a8bc3aac5f69 504 // generate random x co-ordinates for falling hazards
el13drt 0:a8bc3aac5f69 505 // (initial values only)
el13drt 0:a8bc3aac5f69 506 // value between 3 and 76
el13drt 0:a8bc3aac5f69 507 randX1 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 508 randX2 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 509 randX3 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 510 randX4 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 511 randX5 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 512 randX6 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 513
el13drt 7:217810c90306 514 calibrateJoystick();//get centred values of joystick
el13drt 7:217810c90306 515 pollJoystick.attach(&updateJoystick,1.0/10.0);//read joystick 10 times per second
el13drt 6:fa2928bcec17 516
el13drt 7:217810c90306 517 // initialise menu
el13drt 0:a8bc3aac5f69 518 lcd.init();//initialise screen
el13drt 0:a8bc3aac5f69 519 welcome();//welcome screen
el13drt 0:a8bc3aac5f69 520 lcd.clear();//clear pixels
el13drt 0:a8bc3aac5f69 521
el13drt 5:a0e4a67266d6 522 // option counters
el13drt 5:a0e4a67266d6 523 int mainOption = 0;//counter for main menu
el13drt 5:a0e4a67266d6 524 int exitOption = 0;//counter for exit menu
el13drt 7:217810c90306 525 int option = 0;//counter for options menu
el13drt 8:457183719776 526 int subOption = 0;//counter for sub options menu
el13drt 3:57bab3b1c974 527
el13drt 7:217810c90306 528 // loop 1 - Main menu
el13drt 1:352c50e88ffa 529 while(1) {
el13drt 1:352c50e88ffa 530
el13drt 4:c6305031f80d 531 mainMenu();
el13drt 5:a0e4a67266d6 532 actionButton();
el13drt 4:c6305031f80d 533
el13drt 3:57bab3b1c974 534 // joystick selection
el13drt 3:57bab3b1c974 535 if (printFlag) { //if flag set, clear flag and print joystick values to serial port
el13drt 1:352c50e88ffa 536 printFlag = 0;
el13drt 9:bb550cff98b3 537
el13drt 3:57bab3b1c974 538 // option up
el13drt 2:8fac5562ed1e 539 if (joystick.direction == UP) {
el13drt 1:352c50e88ffa 540 serial.printf(" UP\n");
el13drt 5:a0e4a67266d6 541 mainOption = mainOption--;
el13drt 5:a0e4a67266d6 542 if (mainOption < 0)mainOption = 0;
el13drt 2:8fac5562ed1e 543 }
el13drt 3:57bab3b1c974 544 // option down
el13drt 2:8fac5562ed1e 545 if (joystick.direction == DOWN) {
el13drt 2:8fac5562ed1e 546 serial.printf(" DOWN\n");
el13drt 5:a0e4a67266d6 547 mainOption = mainOption++;
el13drt 5:a0e4a67266d6 548 if (mainOption > 2)mainOption = 2;
el13drt 1:352c50e88ffa 549 }
el13drt 2:8fac5562ed1e 550 // Centre / Unknown orientation
el13drt 2:8fac5562ed1e 551 if (joystick.direction == CENTRE)
el13drt 2:8fac5562ed1e 552 serial.printf(" CENTRE\n");
el13drt 2:8fac5562ed1e 553 if (joystick.direction == UNKNOWN)
el13drt 2:8fac5562ed1e 554 serial.printf(" Unsupported direction\n");
el13drt 3:57bab3b1c974 555
el13drt 3:57bab3b1c974 556 // 'Play Game' option 1
el13drt 5:a0e4a67266d6 557 if (mainOption == 0) {
el13drt 1:352c50e88ffa 558 lcd.printString("Play Game",3,4);
el13drt 1:352c50e88ffa 559 }
el13drt 4:c6305031f80d 560 // 'High Scores' option 2
el13drt 5:a0e4a67266d6 561 if (mainOption == 1) {
el13drt 4:c6305031f80d 562 lcd.printString(" Scores ",3,4);
el13drt 4:c6305031f80d 563 }
el13drt 4:c6305031f80d 564 // 'Options' option 3
el13drt 5:a0e4a67266d6 565 if (mainOption == 2) {
el13drt 1:352c50e88ffa 566 lcd.printString(" Options ",3,4);
el13drt 1:352c50e88ffa 567 }
el13drt 3:57bab3b1c974 568 }
el13drt 4:c6305031f80d 569
el13drt 3:57bab3b1c974 570 //////////// Game Loop /////////////////////////////////////////////////////////////
el13drt 3:57bab3b1c974 571
el13drt 3:57bab3b1c974 572 // 'Play Game' selected
el13drt 5:a0e4a67266d6 573 if ((mainOption == 0)&&(buttonA == 1)) {
el13drt 3:57bab3b1c974 574
el13drt 4:c6305031f80d 575 lcd.clear();
el13drt 4:c6305031f80d 576
el13drt 4:c6305031f80d 577 actionButton();
el13drt 4:c6305031f80d 578 backButton();
el13drt 3:57bab3b1c974 579 backGround();
el13drt 3:57bab3b1c974 580
el13drt 4:c6305031f80d 581 // loop 3 - Game loop
el13drt 3:57bab3b1c974 582 while(1) {
el13drt 3:57bab3b1c974 583
el13drt 6:fa2928bcec17 584 // print score - top left of display
el13drt 6:fa2928bcec17 585 char buffer[14];//create buffer for string
el13drt 6:fa2928bcec17 586 int length = sprintf(buffer,"Level:%d",score);//insert buffer
el13drt 6:fa2928bcec17 587 if (length <= 14) //ensure length is smaller than screen
el13drt 6:fa2928bcec17 588 lcd.printString(buffer,3,0);//display
el13drt 6:fa2928bcec17 589
el13drt 4:c6305031f80d 590 actionButton();
el13drt 4:c6305031f80d 591 backButton();
el13drt 4:c6305031f80d 592
el13drt 4:c6305031f80d 593 pixelNinja();//set character
el13drt 9:bb550cff98b3 594 hazards();//initiates hazards
el13drt 9:bb550cff98b3 595 hazardFall();//increments hazards towards floor
el13drt 4:c6305031f80d 596
el13drt 4:c6305031f80d 597 if (printFlag) { //if flag set, clear flag and print joystick values to serial port
el13drt 4:c6305031f80d 598 printFlag = 0;
el13drt 3:57bab3b1c974 599
el13drt 4:c6305031f80d 600 // check joystick direction
el13drt 4:c6305031f80d 601 if (joystick.direction == LEFT) {
el13drt 4:c6305031f80d 602 serial.printf(" LEFT\n");
el13drt 4:c6305031f80d 603 a1 = a1-=2;
el13drt 4:c6305031f80d 604 a2 = a2-=2;
el13drt 4:c6305031f80d 605 a3 = a3-=2;
el13drt 4:c6305031f80d 606 a4 = a4-=2;
el13drt 4:c6305031f80d 607 a5 = a5-=2;
el13drt 4:c6305031f80d 608 a6 = a6-=2;
el13drt 4:c6305031f80d 609 a7 = a7-=2;
el13drt 4:c6305031f80d 610 a8 = a8-=2;
el13drt 7:217810c90306 611 ninjaBoundaries();
el13drt 4:c6305031f80d 612 }
el13drt 4:c6305031f80d 613 if (joystick.direction == RIGHT) {
el13drt 4:c6305031f80d 614 serial.printf(" RIGHT\n");
el13drt 4:c6305031f80d 615 a1 = a1+=2;
el13drt 4:c6305031f80d 616 a2 = a2+=2;
el13drt 4:c6305031f80d 617 a3 = a3+=2;
el13drt 4:c6305031f80d 618 a4 = a4+=2;
el13drt 4:c6305031f80d 619 a5 = a5+=2;
el13drt 4:c6305031f80d 620 a6 = a6+=2;
el13drt 4:c6305031f80d 621 a7 = a7+=2;
el13drt 4:c6305031f80d 622 a8 = a8+=2;
el13drt 7:217810c90306 623 ninjaBoundaries();
el13drt 4:c6305031f80d 624 }
el13drt 4:c6305031f80d 625 if (joystick.direction == CENTRE)
el13drt 4:c6305031f80d 626 serial.printf(" CENTRE\n");
el13drt 4:c6305031f80d 627 if (joystick.direction == UNKNOWN)
el13drt 4:c6305031f80d 628 serial.printf(" Unsupported direction\n");
el13drt 3:57bab3b1c974 629
el13drt 5:a0e4a67266d6 630 // integer to represent character being
el13drt 5:a0e4a67266d6 631 // struck by falling object
el13drt 5:a0e4a67266d6 632 int contactPoint = 0;
el13drt 4:c6305031f80d 633
el13drt 4:c6305031f80d 634 // contact points
el13drt 4:c6305031f80d 635 if(lcd.getPixel((a1+4),32))
el13drt 5:a0e4a67266d6 636 contactPoint++;
el13drt 4:c6305031f80d 637 if(lcd.getPixel((a1),32))
el13drt 5:a0e4a67266d6 638 contactPoint++;
el13drt 4:c6305031f80d 639 if(lcd.getPixel((a7),32))
el13drt 5:a0e4a67266d6 640 contactPoint++;
el13drt 3:57bab3b1c974 641
el13drt 5:a0e4a67266d6 642 // if contact point is not zero
el13drt 5:a0e4a67266d6 643 // character has been hit
el13drt 5:a0e4a67266d6 644 // and the game ends
el13drt 5:a0e4a67266d6 645 if ( contactPoint !=0) {
el13drt 6:fa2928bcec17 646 lcd.printString("Game Over",17,2);
el13drt 4:c6305031f80d 647 wait(0.5);
el13drt 4:c6305031f80d 648 lcd.inverseMode();
el13drt 4:c6305031f80d 649 wait(0.5);
el13drt 4:c6305031f80d 650 lcd.normalMode();
el13drt 4:c6305031f80d 651 wait(0.5);
el13drt 4:c6305031f80d 652 lcd.inverseMode();
el13drt 4:c6305031f80d 653 wait(0.5);
el13drt 4:c6305031f80d 654 lcd.normalMode();
el13drt 4:c6305031f80d 655 wait(0.5);
el13drt 4:c6305031f80d 656 resetGame();
el13drt 4:c6305031f80d 657 break;
el13drt 4:c6305031f80d 658 }
el13drt 4:c6305031f80d 659 startrek();//clears unset pixels, keeps set pixels
el13drt 4:c6305031f80d 660
el13drt 5:a0e4a67266d6 661 ///////////////////// Exit Menu (Back button pressed)///////////////////////////////////////////
el13drt 5:a0e4a67266d6 662
el13drt 4:c6305031f80d 663 if(buttonB == 1) {
el13drt 5:a0e4a67266d6 664
el13drt 5:a0e4a67266d6 665 // set exit menu
el13drt 5:a0e4a67266d6 666 lcd.clear();
el13drt 5:a0e4a67266d6 667 lcd.drawRect(8,6,70,30,0);//title outline
el13drt 5:a0e4a67266d6 668 lcd.printString("Exit Game?",10,25);
el13drt 5:a0e4a67266d6 669 backGround();
el13drt 5:a0e4a67266d6 670
el13drt 6:fa2928bcec17 671 // option arrow - right
el13drt 6:fa2928bcec17 672 lcd.drawRect(55,25,0,4,1);
el13drt 6:fa2928bcec17 673 lcd.drawRect(56,26,0,2,1);
el13drt 6:fa2928bcec17 674 lcd.drawRect(57,27,0,0,1);
el13drt 7:217810c90306 675
el13drt 6:fa2928bcec17 676 // option arrow - left
el13drt 6:fa2928bcec17 677 lcd.drawRect(27,25,0,4,1);
el13drt 6:fa2928bcec17 678 lcd.drawRect(26,26,0,2,1);
el13drt 6:fa2928bcec17 679 lcd.drawRect(25,27,0,0,1);
el13drt 6:fa2928bcec17 680
el13drt 5:a0e4a67266d6 681 while(1) {
el13drt 5:a0e4a67266d6 682
el13drt 5:a0e4a67266d6 683 if (printFlag) { //if flag set, clear flag and print joystick values to serial port
el13drt 5:a0e4a67266d6 684 printFlag = 0;
el13drt 5:a0e4a67266d6 685
el13drt 5:a0e4a67266d6 686 // check joystick direction
el13drt 5:a0e4a67266d6 687 if (joystick.direction == LEFT) {
el13drt 5:a0e4a67266d6 688 serial.printf(" LEFT\n");
el13drt 5:a0e4a67266d6 689 exitOption--;
el13drt 5:a0e4a67266d6 690 if(exitOption < 0)exitOption = 0;
el13drt 5:a0e4a67266d6 691 }
el13drt 5:a0e4a67266d6 692 if (joystick.direction == RIGHT) {
el13drt 5:a0e4a67266d6 693 serial.printf(" RIGHT\n");
el13drt 5:a0e4a67266d6 694 exitOption++;
el13drt 5:a0e4a67266d6 695 if(exitOption > 1)exitOption = 1;
el13drt 5:a0e4a67266d6 696 }
el13drt 5:a0e4a67266d6 697 if (joystick.direction == CENTRE)
el13drt 5:a0e4a67266d6 698 serial.printf(" CENTRE\n");
el13drt 5:a0e4a67266d6 699 if (joystick.direction == UNKNOWN)
el13drt 5:a0e4a67266d6 700 serial.printf(" Unsupported direction\n");
el13drt 5:a0e4a67266d6 701 }
el13drt 5:a0e4a67266d6 702 // draws option cursor
el13drt 5:a0e4a67266d6 703 if(exitOption == 0) {
el13drt 6:fa2928bcec17 704 lcd.printString("YES",29,27);
el13drt 5:a0e4a67266d6 705 }
el13drt 5:a0e4a67266d6 706 if(exitOption == 1) {
el13drt 6:fa2928bcec17 707 lcd.printString(" NO",29,27);
el13drt 5:a0e4a67266d6 708 }
el13drt 5:a0e4a67266d6 709
el13drt 9:bb550cff98b3 710 // 'exit' option YES
el13drt 5:a0e4a67266d6 711 if((buttonA == 1)&&(exitOption == 0)) { //returns to menu
el13drt 5:a0e4a67266d6 712 actionButton();
el13drt 5:a0e4a67266d6 713 lcd.clear();//clears screen
el13drt 5:a0e4a67266d6 714 resetGame();//resets scores/objects
el13drt 5:a0e4a67266d6 715 exitFlag = 1;//sets exit flag
el13drt 5:a0e4a67266d6 716 break;
el13drt 5:a0e4a67266d6 717 }
el13drt 9:bb550cff98b3 718 // 'exit' option NO - returns to game
el13drt 5:a0e4a67266d6 719 if((buttonA == 1)&&(exitOption == 1)) {
el13drt 5:a0e4a67266d6 720 break;
el13drt 5:a0e4a67266d6 721 }
el13drt 5:a0e4a67266d6 722 }
el13drt 9:bb550cff98b3 723 // if 'exit' option YES, resets
el13drt 9:bb550cff98b3 724 // game values returns to main menu
el13drt 5:a0e4a67266d6 725 if (exitFlag!=0) { //if exit flag set
el13drt 5:a0e4a67266d6 726 exitFlag = 0;//reset flag
el13drt 5:a0e4a67266d6 727 break;//break to main menu
el13drt 5:a0e4a67266d6 728 }
el13drt 4:c6305031f80d 729 }
el13drt 4:c6305031f80d 730 serial.printf("Score: %i \n",score);
el13drt 5:a0e4a67266d6 731 }
el13drt 5:a0e4a67266d6 732 }
el13drt 5:a0e4a67266d6 733 }
el13drt 4:c6305031f80d 734
el13drt 4:c6305031f80d 735 ////////// High Scores Loop //////////////////////////////////////////////////
el13drt 4:c6305031f80d 736
el13drt 5:a0e4a67266d6 737 if((mainOption == 1)&&(buttonA == 1)) {
el13drt 3:57bab3b1c974 738
el13drt 4:c6305031f80d 739 actionButton();
el13drt 4:c6305031f80d 740 backButton();
el13drt 5:a0e4a67266d6 741
el13drt 4:c6305031f80d 742 lcd.clear();//clear screen
el13drt 4:c6305031f80d 743 backGround();//set background
el13drt 6:fa2928bcec17 744 lcd.printString("High Scores",10,0);//title
el13drt 6:fa2928bcec17 745
el13drt 6:fa2928bcec17 746 // players high scores - highest first
el13drt 6:fa2928bcec17 747 char highScore1[14];//create buffer for strings
el13drt 6:fa2928bcec17 748 char highScore2[14];
el13drt 6:fa2928bcec17 749 char highScore3[14];
el13drt 6:fa2928bcec17 750
el13drt 6:fa2928bcec17 751 int player1 = sprintf(highScore1,"1.DRT.....99",score);//insert buffer
el13drt 6:fa2928bcec17 752 int player2 = sprintf(highScore2,"2.NRG.....98",score);//insert buffer
el13drt 6:fa2928bcec17 753 int player3 = sprintf(highScore3,"3.GRT.....10",score);//insert buffer
el13drt 6:fa2928bcec17 754
el13drt 6:fa2928bcec17 755 if (player1 <= 14) //ensure length is smaller than screen
el13drt 6:fa2928bcec17 756 lcd.printString(highScore1,5,2);//display
el13drt 6:fa2928bcec17 757 if (player2 <= 14) //ensure length is smaller than screen
el13drt 6:fa2928bcec17 758 lcd.printString(highScore2,5,3);//display
el13drt 6:fa2928bcec17 759 if (player3 <= 14) //ensure length is smaller than screen
el13drt 6:fa2928bcec17 760 lcd.printString(highScore3,5,4);//display
el13drt 5:a0e4a67266d6 761
el13drt 4:c6305031f80d 762 while(1) {
el13drt 3:57bab3b1c974 763
el13drt 7:217810c90306 764 actionButton();//select
el13drt 7:217810c90306 765 backButton();//back
el13drt 4:c6305031f80d 766
el13drt 4:c6305031f80d 767 // back to menu
el13drt 4:c6305031f80d 768 if(buttonB == 1) {
el13drt 4:c6305031f80d 769 lcd.clear();
el13drt 4:c6305031f80d 770 break;
el13drt 4:c6305031f80d 771 }
el13drt 4:c6305031f80d 772 }
el13drt 4:c6305031f80d 773 }
el13drt 4:c6305031f80d 774
el13drt 4:c6305031f80d 775 ////////// OPTIONS LOOP /////////////////////////////////////////////////////
el13drt 3:57bab3b1c974 776
el13drt 5:a0e4a67266d6 777 if((mainOption == 2)&&(buttonA == 1)) {
el13drt 4:c6305031f80d 778
el13drt 4:c6305031f80d 779 actionButton();
el13drt 4:c6305031f80d 780 backButton();
el13drt 3:57bab3b1c974 781
el13drt 4:c6305031f80d 782 lcd.clear();//clear screen
el13drt 5:a0e4a67266d6 783
el13drt 7:217810c90306 784 backGround();
el13drt 4:c6305031f80d 785 lcd.drawRect(3,6,77,10,0);//title outline
el13drt 4:c6305031f80d 786 lcd.drawRect(0,47,84,0,1);//bottom border
el13drt 4:c6305031f80d 787 lcd.drawRect(0,0,84,2,1);//top border
el13drt 4:c6305031f80d 788 lcd.printString("Options",20,7);//title
el13drt 7:217810c90306 789 lcd.printString("Difficulty",3,9);
el13drt 7:217810c90306 790 lcd.printString("Sound FX",3,10);
el13drt 5:a0e4a67266d6 791
el13drt 4:c6305031f80d 792 while(1) {
el13drt 4:c6305031f80d 793
el13drt 4:c6305031f80d 794 actionButton();
el13drt 4:c6305031f80d 795 backButton();
el13drt 7:217810c90306 796 // refreshCursor();
el13drt 7:217810c90306 797
el13drt 7:217810c90306 798 // joystick selection
el13drt 7:217810c90306 799 if (printFlag) { //if flag set, clear flag and print joystick values to serial port
el13drt 7:217810c90306 800 printFlag = 0;
el13drt 7:217810c90306 801
el13drt 7:217810c90306 802 // option up
el13drt 7:217810c90306 803 if (joystick.direction == UP) {
el13drt 7:217810c90306 804 serial.printf(" UP\n");
el13drt 7:217810c90306 805 option = option--;
el13drt 7:217810c90306 806 if (option < 0)option = 0;
el13drt 7:217810c90306 807 }
el13drt 7:217810c90306 808 // option down
el13drt 7:217810c90306 809 if (joystick.direction == DOWN) {
el13drt 7:217810c90306 810 serial.printf(" DOWN\n");
el13drt 7:217810c90306 811 option = option++;
el13drt 7:217810c90306 812 if (option > 1)option = 1;
el13drt 7:217810c90306 813 }
el13drt 7:217810c90306 814 // Centre / Unknown orientation
el13drt 7:217810c90306 815 if (joystick.direction == CENTRE)
el13drt 7:217810c90306 816 serial.printf(" CENTRE\n");
el13drt 7:217810c90306 817 if (joystick.direction == UNKNOWN)
el13drt 7:217810c90306 818 serial.printf(" Unsupported direction\n");
el13drt 7:217810c90306 819
el13drt 7:217810c90306 820 // 'Difficulty' option 1
el13drt 7:217810c90306 821 if (option == 0) {
el13drt 9:bb550cff98b3 822 lcd.drawCircle(72,27,2,1);
el13drt 7:217810c90306 823 refreshCursor3();
el13drt 7:217810c90306 824 }
el13drt 7:217810c90306 825 // 'Sound FX' option 2
el13drt 7:217810c90306 826 if (option == 1) {
el13drt 9:bb550cff98b3 827 lcd.drawCircle(72,35,2,1);
el13drt 7:217810c90306 828 refreshCursor2();
el13drt 7:217810c90306 829 }
el13drt 7:217810c90306 830
el13drt 7:217810c90306 831 ////////////////////// difficulty settings ////////////////////////////////////
el13drt 9:bb550cff98b3 832 if ((option == 0)&&(buttonA == 1)) {
el13drt 7:217810c90306 833
el13drt 8:457183719776 834 actionButton();
el13drt 8:457183719776 835 backButton();
el13drt 8:457183719776 836
el13drt 7:217810c90306 837 lcd.clear();
el13drt 7:217810c90306 838 backGround();
el13drt 7:217810c90306 839 lcd.drawRect(0,47,84,0,1);//bottom border
el13drt 7:217810c90306 840 lcd.drawRect(0,0,84,2,1);//top border
el13drt 7:217810c90306 841 lcd.printString("*Difficulty*",5,7);//title
el13drt 7:217810c90306 842 lcd.printString("Easy",5,8);//title
el13drt 7:217810c90306 843 lcd.printString("Normal",5,9);//title
el13drt 7:217810c90306 844 lcd.printString("Forget It",5,10);//title
el13drt 7:217810c90306 845
el13drt 7:217810c90306 846
el13drt 7:217810c90306 847 while(1) {
el13drt 7:217810c90306 848
el13drt 7:217810c90306 849 actionButton();
el13drt 7:217810c90306 850 backButton();
el13drt 7:217810c90306 851
el13drt 8:457183719776 852 // joystick selection
el13drt 9:bb550cff98b3 853 if (printFlag) {//if flag set, clear flag,print joystick values
el13drt 8:457183719776 854 printFlag = 0;
el13drt 8:457183719776 855
el13drt 8:457183719776 856 // option up
el13drt 8:457183719776 857 if (joystick.direction == UP) {
el13drt 8:457183719776 858 serial.printf(" UP\n");
el13drt 8:457183719776 859 subOption = subOption--;
el13drt 8:457183719776 860 if (subOption < 0)subOption = 0;
el13drt 8:457183719776 861 }
el13drt 8:457183719776 862 // option down
el13drt 8:457183719776 863 if (joystick.direction == DOWN) {
el13drt 8:457183719776 864 serial.printf(" DOWN\n");
el13drt 8:457183719776 865 subOption = subOption++;
el13drt 8:457183719776 866 if (subOption > 2)subOption = 2;
el13drt 8:457183719776 867 }
el13drt 8:457183719776 868 // Centre / Unknown orientation
el13drt 8:457183719776 869 if (joystick.direction == CENTRE)
el13drt 8:457183719776 870 serial.printf(" CENTRE\n");
el13drt 8:457183719776 871 if (joystick.direction == UNKNOWN)
el13drt 8:457183719776 872 serial.printf(" Unsupported direction\n");
el13drt 8:457183719776 873
el13drt 8:457183719776 874 // 'Easy' option 1
el13drt 8:457183719776 875 if (subOption == 0) {
el13drt 8:457183719776 876 lcd.drawCircle(72,19,2,1);
el13drt 8:457183719776 877 refreshCursor2();
el13drt 8:457183719776 878 refreshCursor3();
el13drt 9:bb550cff98b3 879 if(buttonA ==1){//select easy
el13drt 9:bb550cff98b3 880 fall = 1;}
el13drt 8:457183719776 881 }
el13drt 8:457183719776 882 // 'Normal' option 2
el13drt 8:457183719776 883 if (subOption == 1) {
el13drt 8:457183719776 884 lcd.drawCircle(72,27,2,1);
el13drt 9:bb550cff98b3 885 refreshCursor1();
el13drt 9:bb550cff98b3 886 refreshCursor3();
el13drt 9:bb550cff98b3 887
el13drt 9:bb550cff98b3 888 if(buttonA == 1){//select normal
el13drt 9:bb550cff98b3 889 fall = 2;}
el13drt 8:457183719776 890 }
el13drt 8:457183719776 891 // 'Forget It' option 3
el13drt 9:bb550cff98b3 892 if (subOption == 2) {
el13drt 8:457183719776 893 lcd.drawCircle(72,35,2,1);
el13drt 9:bb550cff98b3 894 refreshCursor1();
el13drt 9:bb550cff98b3 895 refreshCursor2();
el13drt 9:bb550cff98b3 896
el13drt 9:bb550cff98b3 897 if(buttonA == 1){//select difficult
el13drt 9:bb550cff98b3 898 fall = 3;}
el13drt 9:bb550cff98b3 899
el13drt 8:457183719776 900 }
el13drt 8:457183719776 901 if(buttonB == 1) {
el13drt 8:457183719776 902 lcd.clear();
el13drt 8:457183719776 903 break;
el13drt 8:457183719776 904 }
el13drt 7:217810c90306 905 }
el13drt 7:217810c90306 906 }
el13drt 7:217810c90306 907 }
el13drt 4:c6305031f80d 908
el13drt 8:457183719776 909 // back to menu
el13drt 8:457183719776 910 if(buttonB == 1) {
el13drt 8:457183719776 911 lcd.clear();
el13drt 8:457183719776 912 break;
el13drt 8:457183719776 913 }
el13drt 3:57bab3b1c974 914 }
el13drt 3:57bab3b1c974 915 }
el13drt 1:352c50e88ffa 916 }
el13drt 0:a8bc3aac5f69 917 }
el13drt 3:57bab3b1c974 918 }
el13drt 1:352c50e88ffa 919
el13drt 0:a8bc3aac5f69 920 // read default positions of the joystick to calibrate later readings
el13drt 9:bb550cff98b3 921 void calibrateJoystick()
el13drt 9:bb550cff98b3 922 {
el13drt 9:bb550cff98b3 923 button.mode(PullDown);
el13drt 9:bb550cff98b3 924 // must not move during calibration
el13drt 9:bb550cff98b3 925 joystick.x0 = xPot; //initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
el13drt 9:bb550cff98b3 926 joystick.y0 = yPot;
el13drt 9:bb550cff98b3 927 }
el13drt 9:bb550cff98b3 928
el13drt 9:bb550cff98b3 929 void updateJoystick()
el13drt 9:bb550cff98b3 930 {
el13drt 9:bb550cff98b3 931 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
el13drt 9:bb550cff98b3 932 joystick.x = xPot - joystick.x0;
el13drt 9:bb550cff98b3 933 joystick.y = yPot - joystick.y0;
el13drt 9:bb550cff98b3 934 // read button state
el13drt 9:bb550cff98b3 935 joystick.button = button;
el13drt 9:bb550cff98b3 936
el13drt 9:bb550cff98b3 937 // calculate direction depending on x,y values
el13drt 9:bb550cff98b3 938 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
el13drt 9:bb550cff98b3 939 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13drt 9:bb550cff98b3 940 joystick.direction = CENTRE;
el13drt 9:bb550cff98b3 941 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13drt 9:bb550cff98b3 942 joystick.direction = UP;
el13drt 9:bb550cff98b3 943 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13drt 9:bb550cff98b3 944 joystick.direction = DOWN;
el13drt 9:bb550cff98b3 945 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13drt 9:bb550cff98b3 946 joystick.direction = RIGHT;
el13drt 9:bb550cff98b3 947 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13drt 9:bb550cff98b3 948 joystick.direction = LEFT;
el13drt 9:bb550cff98b3 949 } else {
el13drt 9:bb550cff98b3 950 joystick.direction = UNKNOWN;
el13drt 0:a8bc3aac5f69 951 }
el13drt 0:a8bc3aac5f69 952
el13drt 9:bb550cff98b3 953 // set flag for printing
el13drt 9:bb550cff98b3 954 printFlag = 1;
el13drt 9:bb550cff98b3 955 }
el13drt 0:a8bc3aac5f69 956
el13drt 0:a8bc3aac5f69 957