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:
Mon Apr 13 14:08:55 2015 +0000
Revision:
2:8fac5562ed1e
Parent:
1:352c50e88ffa
Child:
3:57bab3b1c974
preGame

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 0:a8bc3aac5f69 8
el13drt 0:a8bc3aac5f69 9 #include <ctime>
el13drt 0:a8bc3aac5f69 10 #include <cstdlib>
el13drt 0:a8bc3aac5f69 11
el13drt 0:a8bc3aac5f69 12 // change this to alter tolerance of joystick direction
el13drt 0:a8bc3aac5f69 13 #define DIRECTION_TOLERANCE 0.05
el13drt 0:a8bc3aac5f69 14
el13drt 0:a8bc3aac5f69 15 // VCC,SCE,RST,D/C,MOSI,SCLK,LED - set pins for LCD
el13drt 0:a8bc3aac5f69 16 N5110 lcd(p7,p8,p9,p10,p11,p13,p22);
el13drt 0:a8bc3aac5f69 17
el13drt 0:a8bc3aac5f69 18 // navigation/action buttons
el13drt 0:a8bc3aac5f69 19 DigitalIn buttonA(p19);
el13drt 0:a8bc3aac5f69 20 DigitalIn buttonB(p20);
el13drt 0:a8bc3aac5f69 21
el13drt 0:a8bc3aac5f69 22 // connections for joystick
el13drt 0:a8bc3aac5f69 23 DigitalIn button(p18);
el13drt 0:a8bc3aac5f69 24 AnalogIn xPot(p15);
el13drt 0:a8bc3aac5f69 25 AnalogIn yPot(p16);
el13drt 0:a8bc3aac5f69 26
el13drt 0:a8bc3aac5f69 27 // boundary conditions
el13drt 0:a8bc3aac5f69 28 int cells [84][48];
el13drt 0:a8bc3aac5f69 29
el13drt 0:a8bc3aac5f69 30 // Globabl Variables /////////////////////////
el13drt 0:a8bc3aac5f69 31
el13drt 0:a8bc3aac5f69 32 // global variables for movement
el13drt 0:a8bc3aac5f69 33 int a1 = 22;
el13drt 0:a8bc3aac5f69 34 int a2 = 24;
el13drt 0:a8bc3aac5f69 35 int a3 = 23;
el13drt 0:a8bc3aac5f69 36 int a4 = 25;
el13drt 0:a8bc3aac5f69 37 int a5 = 20;
el13drt 0:a8bc3aac5f69 38 int a6 = 26;
el13drt 0:a8bc3aac5f69 39 int a7 = 19;
el13drt 0:a8bc3aac5f69 40 int a8 = 21;
el13drt 0:a8bc3aac5f69 41
el13drt 0:a8bc3aac5f69 42
el13drt 0:a8bc3aac5f69 43 //global variable for random X co-ordinates
el13drt 0:a8bc3aac5f69 44 int randX1;
el13drt 0:a8bc3aac5f69 45 int randX2;
el13drt 0:a8bc3aac5f69 46 int randX3;
el13drt 0:a8bc3aac5f69 47 int randX4;
el13drt 0:a8bc3aac5f69 48 int randX5;
el13drt 0:a8bc3aac5f69 49 int randX6;
el13drt 0:a8bc3aac5f69 50
el13drt 0:a8bc3aac5f69 51 // global variable for random Y co-ordinates
el13drt 0:a8bc3aac5f69 52 int randY1 = 0;
el13drt 0:a8bc3aac5f69 53 int randY2 = 0;
el13drt 0:a8bc3aac5f69 54 int randY3 = 0;
el13drt 0:a8bc3aac5f69 55 int randY4 = 0;
el13drt 0:a8bc3aac5f69 56 int randY5 = 0;
el13drt 0:a8bc3aac5f69 57 int randY6 = 0;
el13drt 0:a8bc3aac5f69 58
el13drt 0:a8bc3aac5f69 59 // timer to regularly read the joystick
el13drt 0:a8bc3aac5f69 60 Ticker pollJoystick;
el13drt 1:352c50e88ffa 61
el13drt 0:a8bc3aac5f69 62 // Serial for debug
el13drt 0:a8bc3aac5f69 63 Serial serial(USBTX,USBRX);
el13drt 0:a8bc3aac5f69 64
el13drt 0:a8bc3aac5f69 65 // create enumerated type (0,1,2,3 etc. for direction)
el13drt 0:a8bc3aac5f69 66 // could be extended for diagonals etc.
el13drt 0:a8bc3aac5f69 67 enum DirectionName {
el13drt 0:a8bc3aac5f69 68 UP,
el13drt 0:a8bc3aac5f69 69 DOWN,
el13drt 0:a8bc3aac5f69 70 LEFT,
el13drt 0:a8bc3aac5f69 71 RIGHT,
el13drt 0:a8bc3aac5f69 72 CENTRE,
el13drt 0:a8bc3aac5f69 73 UNKNOWN
el13drt 0:a8bc3aac5f69 74 };
el13drt 0:a8bc3aac5f69 75
el13drt 0:a8bc3aac5f69 76 // struct for Joystick
el13drt 0:a8bc3aac5f69 77 typedef struct JoyStick Joystick;
el13drt 0:a8bc3aac5f69 78 struct JoyStick {
el13drt 0:a8bc3aac5f69 79 float x; // current x value
el13drt 0:a8bc3aac5f69 80 float x0; // 'centred' x value
el13drt 0:a8bc3aac5f69 81 float y; // current y value
el13drt 0:a8bc3aac5f69 82 float y0; // 'centred' y value
el13drt 0:a8bc3aac5f69 83 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
el13drt 0:a8bc3aac5f69 84 DirectionName direction; // current direction
el13drt 0:a8bc3aac5f69 85 };
el13drt 0:a8bc3aac5f69 86
el13drt 0:a8bc3aac5f69 87 // create struct variable
el13drt 0:a8bc3aac5f69 88 Joystick joystick;
el13drt 0:a8bc3aac5f69 89
el13drt 0:a8bc3aac5f69 90 int printFlag = 0;
el13drt 0:a8bc3aac5f69 91
el13drt 0:a8bc3aac5f69 92 // function prototypes
el13drt 0:a8bc3aac5f69 93 void calibrateJoystick();
el13drt 0:a8bc3aac5f69 94 void updateJoystick();
el13drt 0:a8bc3aac5f69 95
el13drt 0:a8bc3aac5f69 96 //intro screen
el13drt 0:a8bc3aac5f69 97 void welcome()
el13drt 0:a8bc3aac5f69 98 {
el13drt 0:a8bc3aac5f69 99 //bottom border
el13drt 0:a8bc3aac5f69 100 lcd.drawRect(0,44,84,2,1);
el13drt 0:a8bc3aac5f69 101
el13drt 0:a8bc3aac5f69 102 //top border
el13drt 0:a8bc3aac5f69 103 lcd.drawRect(0,1,84,2,1);
el13drt 0:a8bc3aac5f69 104
el13drt 0:a8bc3aac5f69 105 //print initials 'DRT'
el13drt 0:a8bc3aac5f69 106 lcd.printChar('D',30,14);
el13drt 0:a8bc3aac5f69 107 wait(0.6);
el13drt 0:a8bc3aac5f69 108 lcd.printChar('R',37,14);
el13drt 0:a8bc3aac5f69 109 wait(0.6);
el13drt 0:a8bc3aac5f69 110 lcd.printChar('T',44,14);
el13drt 0:a8bc3aac5f69 111 wait(0.6);
el13drt 0:a8bc3aac5f69 112
el13drt 0:a8bc3aac5f69 113 //print 'presents...'
el13drt 0:a8bc3aac5f69 114 lcd.printString("presents...",8,21);
el13drt 0:a8bc3aac5f69 115 wait(1.0);
el13drt 0:a8bc3aac5f69 116
el13drt 0:a8bc3aac5f69 117 //dramatic flashing
el13drt 0:a8bc3aac5f69 118 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 119 wait(0.2);
el13drt 0:a8bc3aac5f69 120 lcd.normalMode();
el13drt 0:a8bc3aac5f69 121 wait(0.2);
el13drt 0:a8bc3aac5f69 122 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 123 wait(0.2);
el13drt 0:a8bc3aac5f69 124 lcd.normalMode();
el13drt 0:a8bc3aac5f69 125 wait(1.0);
el13drt 0:a8bc3aac5f69 126
el13drt 0:a8bc3aac5f69 127 //more dramatic flashing
el13drt 0:a8bc3aac5f69 128 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 129 wait(0.2);
el13drt 0:a8bc3aac5f69 130 lcd.normalMode();
el13drt 0:a8bc3aac5f69 131 wait(0.2);
el13drt 0:a8bc3aac5f69 132 lcd.inverseMode();
el13drt 0:a8bc3aac5f69 133 wait(0.2);
el13drt 0:a8bc3aac5f69 134 lcd.normalMode();
el13drt 0:a8bc3aac5f69 135 wait(0.6);
el13drt 0:a8bc3aac5f69 136 }
el13drt 0:a8bc3aac5f69 137
el13drt 0:a8bc3aac5f69 138 //selection menu///////////////////////////////////////////
el13drt 0:a8bc3aac5f69 139 void mainMenu()
el13drt 0:a8bc3aac5f69 140 {
el13drt 0:a8bc3aac5f69 141 //bottom border
el13drt 0:a8bc3aac5f69 142 lcd.drawRect(0,47,84,0,1);
el13drt 0:a8bc3aac5f69 143 //top border
el13drt 0:a8bc3aac5f69 144 lcd.drawRect(0,0,84,2,1);
el13drt 0:a8bc3aac5f69 145
el13drt 0:a8bc3aac5f69 146 //print 'Xtreme Tower'
el13drt 0:a8bc3aac5f69 147 lcd.printString("Xtreme",4,25);
el13drt 0:a8bc3aac5f69 148 lcd.printString("Tower",44,25);
el13drt 0:a8bc3aac5f69 149
el13drt 0:a8bc3aac5f69 150 //title outline
el13drt 0:a8bc3aac5f69 151 lcd.drawRect(3,6,77,10,0);
el13drt 0:a8bc3aac5f69 152
el13drt 0:a8bc3aac5f69 153 ////castle //x, y, w, h, fill//////////////////////
el13drt 0:a8bc3aac5f69 154
el13drt 0:a8bc3aac5f69 155 //castle main bulk
el13drt 0:a8bc3aac5f69 156 lcd.drawRect(59,32,21,8,1);
el13drt 0:a8bc3aac5f69 157
el13drt 0:a8bc3aac5f69 158 //left window bulk
el13drt 0:a8bc3aac5f69 159 lcd.drawRect(59,22,2,10,1);
el13drt 0:a8bc3aac5f69 160 //centre left window bulk
el13drt 0:a8bc3aac5f69 161 lcd.drawRect(65,22,2,10,1);
el13drt 0:a8bc3aac5f69 162 //centre right window bulk
el13drt 0:a8bc3aac5f69 163 lcd.drawRect(72,22,2,10,1);
el13drt 0:a8bc3aac5f69 164 //right window bulk
el13drt 0:a8bc3aac5f69 165 lcd.drawRect(78,22,2,10,1);
el13drt 0:a8bc3aac5f69 166 //central window bulk
el13drt 0:a8bc3aac5f69 167 lcd.drawRect(68,25,3,7,1);
el13drt 0:a8bc3aac5f69 168
el13drt 0:a8bc3aac5f69 169 //central window bulk
el13drt 0:a8bc3aac5f69 170 lcd.drawRect(75,28,0,0,1);
el13drt 0:a8bc3aac5f69 171 lcd.drawRect(77,28,0,0,1);
el13drt 0:a8bc3aac5f69 172 lcd.drawRect(64,28,0,0,1);
el13drt 0:a8bc3aac5f69 173 lcd.drawRect(62,28,0,0,1);
el13drt 0:a8bc3aac5f69 174
el13drt 0:a8bc3aac5f69 175 //above left window bulk
el13drt 0:a8bc3aac5f69 176 lcd.drawRect(62,25,3,2,1);
el13drt 0:a8bc3aac5f69 177 //above right window bulk
el13drt 0:a8bc3aac5f69 178 lcd.drawRect(75,25,2,2,1);
el13drt 0:a8bc3aac5f69 179
el13drt 0:a8bc3aac5f69 180 //lower right line
el13drt 0:a8bc3aac5f69 181 lcd.drawRect(71,42,9,0,1);
el13drt 0:a8bc3aac5f69 182 //upper right line
el13drt 0:a8bc3aac5f69 183 lcd.drawRect(70,41,10,0,1);
el13drt 0:a8bc3aac5f69 184
el13drt 0:a8bc3aac5f69 185 //upper left line
el13drt 0:a8bc3aac5f69 186 lcd.drawRect(59,41,10,0,1);
el13drt 0:a8bc3aac5f69 187 //lower left line
el13drt 0:a8bc3aac5f69 188 lcd.drawRect(59,42,9,0,1);
el13drt 0:a8bc3aac5f69 189
el13drt 0:a8bc3aac5f69 190 //bottom left bulk
el13drt 0:a8bc3aac5f69 191 lcd.drawRect(59,43,8,3,1);
el13drt 0:a8bc3aac5f69 192 //bottom right bulk
el13drt 0:a8bc3aac5f69 193 lcd.drawRect(72,43,8,3,1);
el13drt 0:a8bc3aac5f69 194
el13drt 0:a8bc3aac5f69 195 //option arrows - lower
el13drt 0:a8bc3aac5f69 196 lcd.drawRect(27,42,4,0,1);
el13drt 0:a8bc3aac5f69 197 lcd.drawRect(28,43,2,0,1);
el13drt 0:a8bc3aac5f69 198 lcd.drawRect(29,44,0,0,1);
el13drt 0:a8bc3aac5f69 199
el13drt 0:a8bc3aac5f69 200 //option arrows - higher
el13drt 0:a8bc3aac5f69 201 lcd.drawRect(27,29,4,0,1);
el13drt 0:a8bc3aac5f69 202 lcd.drawRect(28,28,2,0,1);
el13drt 0:a8bc3aac5f69 203 lcd.drawRect(29,27,0,0,1);
el13drt 0:a8bc3aac5f69 204
el13drt 0:a8bc3aac5f69 205 //present options
el13drt 0:a8bc3aac5f69 206 lcd.printString("Play Game",3,4);
el13drt 0:a8bc3aac5f69 207
el13drt 0:a8bc3aac5f69 208 }
el13drt 0:a8bc3aac5f69 209
el13drt 0:a8bc3aac5f69 210 // static background
el13drt 0:a8bc3aac5f69 211 void backGround()
el13drt 0:a8bc3aac5f69 212 {
el13drt 0:a8bc3aac5f69 213 // x, y, w, h, fill - draw ground
el13drt 0:a8bc3aac5f69 214 lcd.drawRect(0,47,84,0,1);
el13drt 0:a8bc3aac5f69 215
el13drt 0:a8bc3aac5f69 216 // x, y, w, h, fill - draw left wall
el13drt 0:a8bc3aac5f69 217 lcd.drawRect(2,0,0,47,1);
el13drt 0:a8bc3aac5f69 218 // left wall - brick line 1
el13drt 0:a8bc3aac5f69 219 for(int x=0; x<47; x+=4)
el13drt 0:a8bc3aac5f69 220 lcd.drawLine(1,1,1,48,2);
el13drt 0:a8bc3aac5f69 221 // left wall - brick line 2
el13drt 0:a8bc3aac5f69 222 for(int x=0; x<47; x+=4)
el13drt 0:a8bc3aac5f69 223 lcd.drawLine(0,0,0,48,2);
el13drt 0:a8bc3aac5f69 224
el13drt 0:a8bc3aac5f69 225 // x, y, w, h, fill - draw right wall
el13drt 0:a8bc3aac5f69 226 lcd.drawRect(81,0,0,47,1);
el13drt 0:a8bc3aac5f69 227 // right wall - brick line 1
el13drt 0:a8bc3aac5f69 228 for(int x=0; x<WIDTH; x+=4)
el13drt 0:a8bc3aac5f69 229 lcd.drawLine(82,0,82,48,2);
el13drt 0:a8bc3aac5f69 230 // right wall - brick line 2
el13drt 0:a8bc3aac5f69 231 for(int x=0; x<WIDTH; x+=4)
el13drt 0:a8bc3aac5f69 232 lcd.drawLine(83,1,83,48,2);
el13drt 0:a8bc3aac5f69 233
el13drt 0:a8bc3aac5f69 234 lcd.refresh();
el13drt 0:a8bc3aac5f69 235 }
el13drt 0:a8bc3aac5f69 236
el13drt 0:a8bc3aac5f69 237 //pixel ninja character
el13drt 0:a8bc3aac5f69 238 void pixelNinja()
el13drt 0:a8bc3aac5f69 239 {
el13drt 0:a8bc3aac5f69 240 //x, y, w, h, fill - left leg
el13drt 0:a8bc3aac5f69 241 lcd.drawRect(a1,39,0,7,1);
el13drt 0:a8bc3aac5f69 242 //right leg
el13drt 0:a8bc3aac5f69 243 lcd.drawRect(a2,39,0,7,1);
el13drt 0:a8bc3aac5f69 244 //centre stick
el13drt 0:a8bc3aac5f69 245 lcd.drawRect(a3,37,0,7,1);
el13drt 0:a8bc3aac5f69 246 //back of the head
el13drt 0:a8bc3aac5f69 247 lcd.drawRect(a1,33,0,4,1);
el13drt 0:a8bc3aac5f69 248 //top of the head
el13drt 0:a8bc3aac5f69 249 lcd.drawRect(a1,33,4,0,1);
el13drt 0:a8bc3aac5f69 250 //jaw
el13drt 0:a8bc3aac5f69 251 lcd.drawRect(a2,38,2,0,1);
el13drt 0:a8bc3aac5f69 252 //right shoulder
el13drt 0:a8bc3aac5f69 253 lcd.drawRect(a4,40,1,0,1);
el13drt 0:a8bc3aac5f69 254 //left shoulder
el13drt 0:a8bc3aac5f69 255 lcd.drawRect(a5,40,1,0,1);
el13drt 0:a8bc3aac5f69 256 //left arm
el13drt 0:a8bc3aac5f69 257 lcd.drawRect(a5,41,0,1,1);
el13drt 0:a8bc3aac5f69 258 //right arm
el13drt 0:a8bc3aac5f69 259 lcd.drawRect(a6,41,0,1,1);
el13drt 0:a8bc3aac5f69 260 //right eye
el13drt 0:a8bc3aac5f69 261 lcd.drawRect(a6,35,0,0,1);
el13drt 0:a8bc3aac5f69 262 //mouth piece
el13drt 0:a8bc3aac5f69 263 lcd.drawRect(a6,37,0,0,1);
el13drt 0:a8bc3aac5f69 264 //left eye
el13drt 0:a8bc3aac5f69 265 lcd.drawRect(a2,35,0,0,1);
el13drt 0:a8bc3aac5f69 266 //sword handle
el13drt 0:a8bc3aac5f69 267 lcd.drawRect(a7,36,0,0,1);
el13drt 0:a8bc3aac5f69 268 lcd.drawRect(a5,37,0,0,1);
el13drt 0:a8bc3aac5f69 269 lcd.drawRect(a8,38,0,0,1);
el13drt 0:a8bc3aac5f69 270
el13drt 0:a8bc3aac5f69 271 }
el13drt 0:a8bc3aac5f69 272
el13drt 0:a8bc3aac5f69 273 void endGame()
el13drt 0:a8bc3aac5f69 274 {
el13drt 0:a8bc3aac5f69 275 int n = 0;
el13drt 0:a8bc3aac5f69 276
el13drt 0:a8bc3aac5f69 277 if(lcd.getPixel((a1+3),32))
el13drt 0:a8bc3aac5f69 278 n++;
el13drt 0:a8bc3aac5f69 279
el13drt 0:a8bc3aac5f69 280 if ( n !=0) {
el13drt 0:a8bc3aac5f69 281 lcd.printString("Game Over",10,25);
el13drt 0:a8bc3aac5f69 282 wait(2.0);
el13drt 0:a8bc3aac5f69 283 }
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 0:a8bc3aac5f69 305 randY1 = randY1+=2;
el13drt 0:a8bc3aac5f69 306 randY2 = randY2+=2;
el13drt 0:a8bc3aac5f69 307 randY3 = randY3+=2;
el13drt 0:a8bc3aac5f69 308 randY4 = randY4+=2;
el13drt 0:a8bc3aac5f69 309 randY5 = randY5+=2;
el13drt 0:a8bc3aac5f69 310 randY6 = randY6+=2;
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 0:a8bc3aac5f69 337 randX1 = rand() % 74 + 5;// psuedo random number
el13drt 0:a8bc3aac5f69 338 randX2 = rand() % 74 + 5;// between 5 and 74
el13drt 0:a8bc3aac5f69 339 randX3 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 340 randX4 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 341 randX5 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 342 randX6 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 343 }
el13drt 0:a8bc3aac5f69 344
el13drt 0:a8bc3aac5f69 345 }
el13drt 0:a8bc3aac5f69 346
el13drt 0:a8bc3aac5f69 347 // clears old pixels and keeps set pixels
el13drt 0:a8bc3aac5f69 348 void startrek()
el13drt 0:a8bc3aac5f69 349 {
el13drt 0:a8bc3aac5f69 350 for (int i=3; i<81; i++)// loops through rows
el13drt 0:a8bc3aac5f69 351 for (int j=0; j<47; j++)
el13drt 0:a8bc3aac5f69 352 if (cells[i][j]) {// if there's a pixel then keep it
el13drt 0:a8bc3aac5f69 353 lcd.setPixel(i,j);
el13drt 0:a8bc3aac5f69 354 } else {
el13drt 0:a8bc3aac5f69 355 lcd.clearPixel(i,j);// else remove the old ones
el13drt 0:a8bc3aac5f69 356 }
el13drt 0:a8bc3aac5f69 357 lcd.refresh();
el13drt 0:a8bc3aac5f69 358 }
el13drt 0:a8bc3aac5f69 359
el13drt 0:a8bc3aac5f69 360 int main()
el13drt 0:a8bc3aac5f69 361 {
el13drt 0:a8bc3aac5f69 362 //////// set initial values - configurate joystick /////////////////////////////////
el13drt 1:352c50e88ffa 363
el13drt 0:a8bc3aac5f69 364 // initialize random seed:
el13drt 0:a8bc3aac5f69 365 srand (time(NULL));
el13drt 0:a8bc3aac5f69 366
el13drt 0:a8bc3aac5f69 367 // generate random x co-ordinates for falling hazards
el13drt 0:a8bc3aac5f69 368 // (initial values only)
el13drt 0:a8bc3aac5f69 369 // value between 3 and 76
el13drt 0:a8bc3aac5f69 370 randX1 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 371 randX2 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 372 randX3 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 373 randX4 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 374 randX5 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 375 randX6 = rand() % 74 + 5;
el13drt 0:a8bc3aac5f69 376
el13drt 0:a8bc3aac5f69 377 calibrateJoystick(); // get centred values of joystick
el13drt 0:a8bc3aac5f69 378 pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 10 times per second
el13drt 0:a8bc3aac5f69 379
el13drt 1:352c50e88ffa 380 /////// initiate main menu //////////////////////////////////////////////////////////////
el13drt 1:352c50e88ffa 381
el13drt 0:a8bc3aac5f69 382 lcd.init();//initialise screen
el13drt 0:a8bc3aac5f69 383 welcome();//welcome screen
el13drt 0:a8bc3aac5f69 384 lcd.clear();//clear pixels
el13drt 0:a8bc3aac5f69 385 mainMenu();//menu screen
el13drt 0:a8bc3aac5f69 386
el13drt 1:352c50e88ffa 387 // backGround();//display background
el13drt 1:352c50e88ffa 388
el13drt 1:352c50e88ffa 389 /////// Menu Selection Loop ////////////////////////////////////////////////////////////
el13drt 1:352c50e88ffa 390
el13drt 1:352c50e88ffa 391 int option = 0;
el13drt 2:8fac5562ed1e 392
el13drt 2:8fac5562ed1e 393 // Internal Pull Up resistors set for
el13drt 2:8fac5562ed1e 394 // buttons A and B.
el13drt 2:8fac5562ed1e 395 // buttonA.mode(PullUP);
el13drt 2:8fac5562ed1e 396 // buttonB.mode(PullUp);
el13drt 2:8fac5562ed1e 397
el13drt 1:352c50e88ffa 398 while(1) {
el13drt 2:8fac5562ed1e 399
el13drt 2:8fac5562ed1e 400 // Joystick selection
el13drt 1:352c50e88ffa 401
el13drt 1:352c50e88ffa 402 if (printFlag) { // if flag set, clear flag and print joystick values to serial port
el13drt 1:352c50e88ffa 403 printFlag = 0;
el13drt 1:352c50e88ffa 404 serial.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button);
el13drt 0:a8bc3aac5f69 405
el13drt 1:352c50e88ffa 406 // Option up
el13drt 2:8fac5562ed1e 407 if (joystick.direction == UP) {
el13drt 1:352c50e88ffa 408 serial.printf(" UP\n");
el13drt 2:8fac5562ed1e 409 option = option--;
el13drt 2:8fac5562ed1e 410 if (option < 0)option = 0;
el13drt 2:8fac5562ed1e 411 }
el13drt 2:8fac5562ed1e 412 // Option down
el13drt 2:8fac5562ed1e 413 if (joystick.direction == DOWN) {
el13drt 2:8fac5562ed1e 414 serial.printf(" DOWN\n");
el13drt 1:352c50e88ffa 415 option = option++;
el13drt 1:352c50e88ffa 416 if (option > 1)option = 1;
el13drt 1:352c50e88ffa 417 }
el13drt 2:8fac5562ed1e 418 // Centre / Unknown orientation
el13drt 2:8fac5562ed1e 419 if (joystick.direction == CENTRE)
el13drt 2:8fac5562ed1e 420 serial.printf(" CENTRE\n");
el13drt 2:8fac5562ed1e 421 if (joystick.direction == UNKNOWN)
el13drt 2:8fac5562ed1e 422 serial.printf(" Unsupported direction\n");
el13drt 1:352c50e88ffa 423
el13drt 1:352c50e88ffa 424 // 'Play Game' option
el13drt 1:352c50e88ffa 425 if (option == 0) {
el13drt 1:352c50e88ffa 426 lcd.printString("Play Game",3,4);
el13drt 1:352c50e88ffa 427 }
el13drt 1:352c50e88ffa 428 // 'Options' option
el13drt 1:352c50e88ffa 429 if (option == 1) {
el13drt 1:352c50e88ffa 430 lcd.printString(" Options ",3,4);
el13drt 1:352c50e88ffa 431 }
el13drt 2:8fac5562ed1e 432 if ((option == 0)&&(buttonA == 1){
el13drt 2:8fac5562ed1e 433
el13drt 2:8fac5562ed1e 434 backGround
el13drt 1:352c50e88ffa 435
el13drt 2:8fac5562ed1e 436
el13drt 1:352c50e88ffa 437 }
el13drt 0:a8bc3aac5f69 438 }
el13drt 1:352c50e88ffa 439
el13drt 0:a8bc3aac5f69 440 // while(1) {
el13drt 0:a8bc3aac5f69 441 //
el13drt 0:a8bc3aac5f69 442 // pixelNinja();
el13drt 0:a8bc3aac5f69 443 // hazards();// initiates hazards
el13drt 0:a8bc3aac5f69 444 // hazardFall();// increments hazards towards floor
el13drt 0:a8bc3aac5f69 445 //
el13drt 0:a8bc3aac5f69 446 // if (printFlag) { // if flag set, clear flag and print joystick values to serial port
el13drt 0:a8bc3aac5f69 447 // printFlag = 0;
el13drt 0:a8bc3aac5f69 448 // serial.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button);
el13drt 0:a8bc3aac5f69 449 //
el13drt 0:a8bc3aac5f69 450 // // check joystick direction
el13drt 0:a8bc3aac5f69 451 // if (joystick.direction == UP) {
el13drt 0:a8bc3aac5f69 452 // serial.printf(" UP\n");
el13drt 0:a8bc3aac5f69 453 // }
el13drt 0:a8bc3aac5f69 454 // if (joystick.direction == DOWN) {
el13drt 0:a8bc3aac5f69 455 // serial.printf(" DOWN\n");
el13drt 0:a8bc3aac5f69 456 // }
el13drt 0:a8bc3aac5f69 457 // if (joystick.direction == LEFT) {
el13drt 0:a8bc3aac5f69 458 // serial.printf(" LEFT\n");
el13drt 0:a8bc3aac5f69 459 // a1 = a1-=2;
el13drt 0:a8bc3aac5f69 460 // a2 = a2-=2;
el13drt 0:a8bc3aac5f69 461 // a3 = a3-=2;
el13drt 0:a8bc3aac5f69 462 // a4 = a4-=2;
el13drt 0:a8bc3aac5f69 463 // a5 = a5-=2;
el13drt 0:a8bc3aac5f69 464 // a6 = a6-=2;
el13drt 0:a8bc3aac5f69 465 // a7 = a7-=2;
el13drt 0:a8bc3aac5f69 466 // a8 = a8-=2;
el13drt 0:a8bc3aac5f69 467 // }
el13drt 0:a8bc3aac5f69 468 // if (joystick.direction == RIGHT) {
el13drt 0:a8bc3aac5f69 469 // serial.printf(" RIGHT\n");
el13drt 0:a8bc3aac5f69 470 // a1 = a1+=2;
el13drt 0:a8bc3aac5f69 471 // a2 = a2+=2;
el13drt 0:a8bc3aac5f69 472 // a3 = a3+=2;
el13drt 0:a8bc3aac5f69 473 // a4 = a4+=2;
el13drt 0:a8bc3aac5f69 474 // a5 = a5+=2;
el13drt 0:a8bc3aac5f69 475 // a6 = a6+=2;
el13drt 0:a8bc3aac5f69 476 // a7 = a7+=2;
el13drt 0:a8bc3aac5f69 477 // a8 = a8+=2;
el13drt 0:a8bc3aac5f69 478 // }
el13drt 0:a8bc3aac5f69 479 // if (joystick.direction == CENTRE)
el13drt 0:a8bc3aac5f69 480 // serial.printf(" CENTRE\n");
el13drt 0:a8bc3aac5f69 481 // if (joystick.direction == UNKNOWN)
el13drt 0:a8bc3aac5f69 482 // serial.printf(" Unsupported direction\n");
el13drt 0:a8bc3aac5f69 483 //
el13drt 0:a8bc3aac5f69 484 // endGame();
el13drt 0:a8bc3aac5f69 485 // startrek();// clears unset pixels, keeps set pixels
el13drt 0:a8bc3aac5f69 486 //
el13drt 0:a8bc3aac5f69 487 // }
el13drt 0:a8bc3aac5f69 488 // }
el13drt 0:a8bc3aac5f69 489
el13drt 0:a8bc3aac5f69 490 }
el13drt 0:a8bc3aac5f69 491
el13drt 0:a8bc3aac5f69 492 // read default positions of the joystick to calibrate later readings
el13drt 0:a8bc3aac5f69 493 void calibrateJoystick()
el13drt 0:a8bc3aac5f69 494 {
el13drt 0:a8bc3aac5f69 495 button.mode(PullDown);
el13drt 2:8fac5562ed1e 496 buttonA.mode(PullDown);
el13drt 2:8fac5562ed1e 497 buttonB.mode(PullDown);
el13drt 0:a8bc3aac5f69 498 // must not move during calibration
el13drt 0:a8bc3aac5f69 499 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
el13drt 0:a8bc3aac5f69 500 joystick.y0 = yPot;
el13drt 0:a8bc3aac5f69 501 }
el13drt 0:a8bc3aac5f69 502
el13drt 0:a8bc3aac5f69 503 void updateJoystick()
el13drt 0:a8bc3aac5f69 504 {
el13drt 0:a8bc3aac5f69 505 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
el13drt 0:a8bc3aac5f69 506 joystick.x = xPot - joystick.x0;
el13drt 0:a8bc3aac5f69 507 joystick.y = yPot - joystick.y0;
el13drt 0:a8bc3aac5f69 508 // read button state
el13drt 0:a8bc3aac5f69 509 joystick.button = button;
el13drt 0:a8bc3aac5f69 510
el13drt 0:a8bc3aac5f69 511 // calculate direction depending on x,y values
el13drt 0:a8bc3aac5f69 512 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
el13drt 0:a8bc3aac5f69 513 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13drt 0:a8bc3aac5f69 514 joystick.direction = CENTRE;
el13drt 0:a8bc3aac5f69 515 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13drt 0:a8bc3aac5f69 516 joystick.direction = UP;
el13drt 0:a8bc3aac5f69 517 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13drt 0:a8bc3aac5f69 518 joystick.direction = DOWN;
el13drt 0:a8bc3aac5f69 519 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13drt 0:a8bc3aac5f69 520 joystick.direction = RIGHT;
el13drt 0:a8bc3aac5f69 521 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13drt 0:a8bc3aac5f69 522 joystick.direction = LEFT;
el13drt 0:a8bc3aac5f69 523 } else {
el13drt 0:a8bc3aac5f69 524 joystick.direction = UNKNOWN;
el13drt 0:a8bc3aac5f69 525 }
el13drt 0:a8bc3aac5f69 526
el13drt 0:a8bc3aac5f69 527 // set flag for printing
el13drt 0:a8bc3aac5f69 528 printFlag = 1;
el13drt 0:a8bc3aac5f69 529 }
el13drt 0:a8bc3aac5f69 530
el13drt 0:a8bc3aac5f69 531