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 20:39:57 2015 +0000
Revision:
11:6b8416a8ddb3
Parent:
10:947d35365ab8
Child:
12:eedda6554615
pre tidy up

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