Mini game developed for ECE 4180 lab

Dependencies:   4DGL-uLCD-SE mbed-rtos mbed

Committer:
slandry8
Date:
Mon Mar 14 17:42:07 2016 +0000
Revision:
0:a358215f57b7
Final build of game for ECE 4180

Who changed what in which revision?

UserRevisionLine numberNew contents of line
slandry8 0:a358215f57b7 1 // Cactus Jumper video game
slandry8 0:a358215f57b7 2 //
slandry8 0:a358215f57b7 3 #include "mbed.h"
slandry8 0:a358215f57b7 4 #include "rtos.h"
slandry8 0:a358215f57b7 5 #include "uLCD_4DGL.h"
slandry8 0:a358215f57b7 6 #include "entity.h"
slandry8 0:a358215f57b7 7
slandry8 0:a358215f57b7 8
slandry8 0:a358215f57b7 9 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
slandry8 0:a358215f57b7 10 Mutex posMutex;
slandry8 0:a358215f57b7 11 int state = STATE_START;
slandry8 0:a358215f57b7 12 int score;
slandry8 0:a358215f57b7 13 int k;
slandry8 0:a358215f57b7 14 char *scCompBuf;
slandry8 0:a358215f57b7 15 char *writtenScore;
slandry8 0:a358215f57b7 16 char *scoreStr;
slandry8 0:a358215f57b7 17 bool initialFlash = false;
slandry8 0:a358215f57b7 18 bool scoreDrawn = false;
slandry8 0:a358215f57b7 19 bool collided = false;
slandry8 0:a358215f57b7 20 bool newHighScore = false;
slandry8 0:a358215f57b7 21 bool titleDrawn = false;
slandry8 0:a358215f57b7 22 char readchar = ' ';
slandry8 0:a358215f57b7 23 class Nav_Switch
slandry8 0:a358215f57b7 24 {
slandry8 0:a358215f57b7 25 public:
slandry8 0:a358215f57b7 26 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
slandry8 0:a358215f57b7 27 int read();
slandry8 0:a358215f57b7 28 //boolean functions to test each switch
slandry8 0:a358215f57b7 29 bool up();
slandry8 0:a358215f57b7 30 bool down();
slandry8 0:a358215f57b7 31 bool left();
slandry8 0:a358215f57b7 32 bool right();
slandry8 0:a358215f57b7 33 bool fire();
slandry8 0:a358215f57b7 34 //automatic read on RHS
slandry8 0:a358215f57b7 35 operator int ();
slandry8 0:a358215f57b7 36 //index to any switch array style
slandry8 0:a358215f57b7 37 bool operator[](int index) {
slandry8 0:a358215f57b7 38 return _pins[index];
slandry8 0:a358215f57b7 39 };
slandry8 0:a358215f57b7 40 private:
slandry8 0:a358215f57b7 41 BusIn _pins;
slandry8 0:a358215f57b7 42
slandry8 0:a358215f57b7 43 };
slandry8 0:a358215f57b7 44 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
slandry8 0:a358215f57b7 45 _pins(up, down, left, right, fire)
slandry8 0:a358215f57b7 46 {
slandry8 0:a358215f57b7 47 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
slandry8 0:a358215f57b7 48 //Thread::wait(1); //delays just a bit for pullups to pull inputs high
slandry8 0:a358215f57b7 49 wait(0.001);
slandry8 0:a358215f57b7 50 }
slandry8 0:a358215f57b7 51 inline bool Nav_Switch::up()
slandry8 0:a358215f57b7 52 {
slandry8 0:a358215f57b7 53 return !(_pins[0]);
slandry8 0:a358215f57b7 54 }
slandry8 0:a358215f57b7 55 inline bool Nav_Switch::down()
slandry8 0:a358215f57b7 56 {
slandry8 0:a358215f57b7 57 return !(_pins[1]);
slandry8 0:a358215f57b7 58 }
slandry8 0:a358215f57b7 59 inline bool Nav_Switch::left()
slandry8 0:a358215f57b7 60 {
slandry8 0:a358215f57b7 61 return !(_pins[2]);
slandry8 0:a358215f57b7 62 }
slandry8 0:a358215f57b7 63 inline bool Nav_Switch::right()
slandry8 0:a358215f57b7 64 {
slandry8 0:a358215f57b7 65 return !(_pins[3]);
slandry8 0:a358215f57b7 66 }
slandry8 0:a358215f57b7 67 inline bool Nav_Switch::fire()
slandry8 0:a358215f57b7 68 {
slandry8 0:a358215f57b7 69 return !(_pins[4]);
slandry8 0:a358215f57b7 70 }
slandry8 0:a358215f57b7 71 inline int Nav_Switch::read()
slandry8 0:a358215f57b7 72 {
slandry8 0:a358215f57b7 73 return _pins.read();
slandry8 0:a358215f57b7 74 }
slandry8 0:a358215f57b7 75 inline Nav_Switch::operator int ()
slandry8 0:a358215f57b7 76 {
slandry8 0:a358215f57b7 77 return _pins.read();
slandry8 0:a358215f57b7 78 }
slandry8 0:a358215f57b7 79
slandry8 0:a358215f57b7 80 Nav_Switch myNav( p25, p22, p23, p21, p24);
slandry8 0:a358215f57b7 81 int i = 111; //variable used for horizontal player movement
slandry8 0:a358215f57b7 82 int j = 96; //variable used for vertical player movement
slandry8 0:a358215f57b7 83 //initialize player and cursor
slandry8 0:a358215f57b7 84 Player *player = new Player();
slandry8 0:a358215f57b7 85 Cursor *curs = new Cursor();
slandry8 0:a358215f57b7 86 //thread for player input detection
slandry8 0:a358215f57b7 87 void fire_thread(void const *args) {
slandry8 0:a358215f57b7 88 while(true) {
slandry8 0:a358215f57b7 89 //if player moves to the right during gameplay
slandry8 0:a358215f57b7 90 if(myNav.right() && state == STATE_GAME) {
slandry8 0:a358215f57b7 91 posMutex.lock();
slandry8 0:a358215f57b7 92 i = ((i > 110) ? 110 : i + DELTA_X_P);
slandry8 0:a358215f57b7 93 (*player).col = i;
slandry8 0:a358215f57b7 94 (*player).hasMoved = true;
slandry8 0:a358215f57b7 95 (*player).moveFlag = 2;
slandry8 0:a358215f57b7 96 posMutex.unlock();
slandry8 0:a358215f57b7 97 Thread::wait(35);
slandry8 0:a358215f57b7 98 }
slandry8 0:a358215f57b7 99 //if player moves to the left during gameplay
slandry8 0:a358215f57b7 100 if(myNav.left() && state == STATE_GAME) {
slandry8 0:a358215f57b7 101 posMutex.lock();
slandry8 0:a358215f57b7 102 i = ((i < 2) ? 2 : i - DELTA_X_P);
slandry8 0:a358215f57b7 103 (*player).col = i;
slandry8 0:a358215f57b7 104 (*player).hasMoved = true;
slandry8 0:a358215f57b7 105 (*player).moveFlag = 1;
slandry8 0:a358215f57b7 106 posMutex.unlock();
slandry8 0:a358215f57b7 107 Thread::wait(35);
slandry8 0:a358215f57b7 108 }
slandry8 0:a358215f57b7 109 posMutex.lock();
slandry8 0:a358215f57b7 110 //if player jumps during gameplay and is not already in the jumping or falling state
slandry8 0:a358215f57b7 111 if((myNav.up() && !((*player).isJumping || (*player).isFalling)) && state == STATE_GAME) {
slandry8 0:a358215f57b7 112 (*player).isJumping = true;
slandry8 0:a358215f57b7 113 (*player).upCounter = 48;
slandry8 0:a358215f57b7 114 (*player).fallCounter = 48;
slandry8 0:a358215f57b7 115 }
slandry8 0:a358215f57b7 116 posMutex.unlock();
slandry8 0:a358215f57b7 117 //if fire is pressed on start screen, begin game
slandry8 0:a358215f57b7 118 if(myNav.fire() && state != STATE_GAME && state != STATE_SCORE && state != STATE_LOSE) {
slandry8 0:a358215f57b7 119 state = STATE_GAME;
slandry8 0:a358215f57b7 120 Thread::wait(35);
slandry8 0:a358215f57b7 121 }
slandry8 0:a358215f57b7 122 //Go to either start screen or new height screen when fire is pressed on game over screen
slandry8 0:a358215f57b7 123 if(myNav.fire() && state == STATE_LOSE) {
slandry8 0:a358215f57b7 124 if(!newHighScore) {
slandry8 0:a358215f57b7 125 titleDrawn = false;
slandry8 0:a358215f57b7 126 state = STATE_START;
slandry8 0:a358215f57b7 127 } else {
slandry8 0:a358215f57b7 128 state = STATE_SCORE;
slandry8 0:a358215f57b7 129 }
slandry8 0:a358215f57b7 130 Thread::wait(500);
slandry8 0:a358215f57b7 131 }
slandry8 0:a358215f57b7 132 //Navigation controls for high score screen
slandry8 0:a358215f57b7 133 //if fire is pressed on the new high score screen
slandry8 0:a358215f57b7 134 if(myNav.fire() && state == STATE_SCORE) {
slandry8 0:a358215f57b7 135 //check whether to enter an initial or begin writing initials to file
slandry8 0:a358215f57b7 136 if((*curs).curChar >= 'A' && (*curs).curChar <= 'Z') {
slandry8 0:a358215f57b7 137 (*curs).initBuf[(*curs).c] = (*curs).curChar;
slandry8 0:a358215f57b7 138 }
slandry8 0:a358215f57b7 139 (*curs).letterPressed = true;
slandry8 0:a358215f57b7 140 Thread::wait(200);
slandry8 0:a358215f57b7 141 }
slandry8 0:a358215f57b7 142 //If up is pressed on the new high score screen
slandry8 0:a358215f57b7 143 if(myNav.up() && state == STATE_SCORE) {
slandry8 0:a358215f57b7 144 //make sure cursor would not go out of bounds if moved
slandry8 0:a358215f57b7 145 if(!((*curs).curChar - 8 < 'A')) {
slandry8 0:a358215f57b7 146 (*curs).row -= (*curs).delta_y;
slandry8 0:a358215f57b7 147 (*curs).hasMoved = true;
slandry8 0:a358215f57b7 148 (*curs).moveFlag = 4;
slandry8 0:a358215f57b7 149 (*curs).curChar-=8;
slandry8 0:a358215f57b7 150 }
slandry8 0:a358215f57b7 151 Thread::wait(100);
slandry8 0:a358215f57b7 152 }
slandry8 0:a358215f57b7 153 //If down is pressed on the new high score screen
slandry8 0:a358215f57b7 154 if(myNav.down() && state == STATE_SCORE) {
slandry8 0:a358215f57b7 155 //make sure cursor would not go out of boudns if moved
slandry8 0:a358215f57b7 156 if(!((*curs).curChar + 8 > '[')) {
slandry8 0:a358215f57b7 157 (*curs).row += (*curs).delta_y;
slandry8 0:a358215f57b7 158 (*curs).hasMoved = true;
slandry8 0:a358215f57b7 159 (*curs).moveFlag = 8;
slandry8 0:a358215f57b7 160 (*curs).curChar+=8;
slandry8 0:a358215f57b7 161 }
slandry8 0:a358215f57b7 162 Thread::wait(100);
slandry8 0:a358215f57b7 163 }
slandry8 0:a358215f57b7 164 //If left is pressed on the new high score screen
slandry8 0:a358215f57b7 165 if(myNav.left() && state == STATE_SCORE) {
slandry8 0:a358215f57b7 166 //make sure cursor would not go out of boudns if moved
slandry8 0:a358215f57b7 167 if(!((*curs).curChar == 'A') && !((*curs).curChar == 'I') && !((*curs).curChar == 'Q') && !((*curs).curChar == 'Y')) {
slandry8 0:a358215f57b7 168 (*curs).col -= (*curs).delta_x;
slandry8 0:a358215f57b7 169 (*curs).hasMoved = true;
slandry8 0:a358215f57b7 170 (*curs).moveFlag = 1;
slandry8 0:a358215f57b7 171 (*curs).curChar--;
slandry8 0:a358215f57b7 172 }
slandry8 0:a358215f57b7 173 Thread::wait(100);
slandry8 0:a358215f57b7 174 }
slandry8 0:a358215f57b7 175 //If right is pressed on the new high score screen
slandry8 0:a358215f57b7 176 if(myNav.right() && state == STATE_SCORE) {
slandry8 0:a358215f57b7 177 //make sure cursor would not go out of boudns if moved
slandry8 0:a358215f57b7 178 if(!((*curs).curChar == 'H') && !((*curs).curChar == 'P') && !((*curs).curChar == 'X') && !((*curs).curChar == '[')) {
slandry8 0:a358215f57b7 179 (*curs).col += (*curs).delta_x;
slandry8 0:a358215f57b7 180 (*curs).hasMoved = true;
slandry8 0:a358215f57b7 181 (*curs).moveFlag = 2;
slandry8 0:a358215f57b7 182 (*curs).curChar++;
slandry8 0:a358215f57b7 183 }
slandry8 0:a358215f57b7 184 Thread::wait(100);
slandry8 0:a358215f57b7 185 }
slandry8 0:a358215f57b7 186 }
slandry8 0:a358215f57b7 187 }
slandry8 0:a358215f57b7 188 int main()
slandry8 0:a358215f57b7 189 {
slandry8 0:a358215f57b7 190 //create thread for handling user input
slandry8 0:a358215f57b7 191 Thread thread(fire_thread);
slandry8 0:a358215f57b7 192 //initialize screen pointer array; allocate screen objects in memory
slandry8 0:a358215f57b7 193 Screen *screenP[2];
slandry8 0:a358215f57b7 194 screenP[0] = new Screen(0x780D,true,-127);
slandry8 0:a358215f57b7 195 screenP[1] = new Screen(0x780D,true,0);
slandry8 0:a358215f57b7 196 //set baud rate & initialize media on uLCD
slandry8 0:a358215f57b7 197 uLCD.baudrate(3000000);
slandry8 0:a358215f57b7 198 uLCD.media_init();
slandry8 0:a358215f57b7 199 while(true) {
slandry8 0:a358215f57b7 200 if(!(state | STATE_START)) {
slandry8 0:a358215f57b7 201 //start screen
slandry8 0:a358215f57b7 202 if(!titleDrawn) { //we want to only draw this information once
slandry8 0:a358215f57b7 203 newHighScore = false;
slandry8 0:a358215f57b7 204 //initialize game information
slandry8 0:a358215f57b7 205 initialize(screenP, player, &score, &initialFlash, &scoreDrawn, &collided, &i, &j, curs);
slandry8 0:a358215f57b7 206 //draw title screen and text
slandry8 0:a358215f57b7 207 uLCD.set_sector_address(0x001D, 0x78D9);
slandry8 0:a358215f57b7 208 uLCD.display_image(0,0);
slandry8 0:a358215f57b7 209 uLCD.textbackground_color(0x8f7738);
slandry8 0:a358215f57b7 210 uLCD.locate(3,12);
slandry8 0:a358215f57b7 211 uLCD.color(RED);
slandry8 0:a358215f57b7 212 uLCD.printf("Press fire");
slandry8 0:a358215f57b7 213 uLCD.locate(4,13);
slandry8 0:a358215f57b7 214 uLCD.printf("to start");
slandry8 0:a358215f57b7 215 uLCD.background_color(COVER_COLOR);
slandry8 0:a358215f57b7 216 //read in high score to display
slandry8 0:a358215f57b7 217 uLCD.set_sector_address(0x001D, 0x8700);
slandry8 0:a358215f57b7 218 uLCD.locate(3,15);
slandry8 0:a358215f57b7 219 readchar = ' ';
slandry8 0:a358215f57b7 220 while(readchar != '\xFF') {
slandry8 0:a358215f57b7 221 readchar = uLCD.read_byte();
slandry8 0:a358215f57b7 222 uLCD.putc(readchar);
slandry8 0:a358215f57b7 223 }
slandry8 0:a358215f57b7 224 }
slandry8 0:a358215f57b7 225 titleDrawn = true;
slandry8 0:a358215f57b7 226 score = 0;
slandry8 0:a358215f57b7 227 //The remainder of this if() causes the "blinking" of the "Press fire to start" on the title screen
slandry8 0:a358215f57b7 228 Thread::wait(250);
slandry8 0:a358215f57b7 229 uLCD.locate(3,12);
slandry8 0:a358215f57b7 230 uLCD.color(0x8f7738);
slandry8 0:a358215f57b7 231 uLCD.printf("Press fire");
slandry8 0:a358215f57b7 232 uLCD.locate(4,13);
slandry8 0:a358215f57b7 233 uLCD.printf("to start");
slandry8 0:a358215f57b7 234 Thread::wait(250);
slandry8 0:a358215f57b7 235 uLCD.locate(3,12);
slandry8 0:a358215f57b7 236 uLCD.color(RED);
slandry8 0:a358215f57b7 237 uLCD.printf("Press fire");
slandry8 0:a358215f57b7 238 uLCD.locate(4,13);
slandry8 0:a358215f57b7 239 uLCD.printf("to start");
slandry8 0:a358215f57b7 240 } else if(state & STATE_GAME) {
slandry8 0:a358215f57b7 241
slandry8 0:a358215f57b7 242 if(!initialFlash) {
slandry8 0:a358215f57b7 243 //we want to clear the screen and draw the background scenery only once when the game starts
slandry8 0:a358215f57b7 244 uLCD.filled_rectangle(0,0,127,127,COVER_COLOR);
slandry8 0:a358215f57b7 245 drawScenery(&uLCD);
slandry8 0:a358215f57b7 246 initialFlash = true;
slandry8 0:a358215f57b7 247 }
slandry8 0:a358215f57b7 248 //draw the obstacles
slandry8 0:a358215f57b7 249 drawScreens(&uLCD, screenP);
slandry8 0:a358215f57b7 250 posMutex.lock();
slandry8 0:a358215f57b7 251 if((*player).isJumping || (*player).isFalling) {
slandry8 0:a358215f57b7 252 //check if end conditions for each state is currently met
slandry8 0:a358215f57b7 253 if(((*player).upCounter < 0) && ((*player).isJumping)) {
slandry8 0:a358215f57b7 254 //if the player has reached the top of their jump
slandry8 0:a358215f57b7 255 (*player).isJumping = false;
slandry8 0:a358215f57b7 256 }
slandry8 0:a358215f57b7 257 if(((*player).fallCounter < 0) && ((*player).isFalling)) {
slandry8 0:a358215f57b7 258 //if the player has stopped falling
slandry8 0:a358215f57b7 259 (*player).isFalling = false;
slandry8 0:a358215f57b7 260 }
slandry8 0:a358215f57b7 261 //check if the player can enter into a new state
slandry8 0:a358215f57b7 262 if(!(*player).isJumping && ((*player).fallCounter > 0) && (!(*player).isFalling)) {
slandry8 0:a358215f57b7 263 //set the falling condition for the player
slandry8 0:a358215f57b7 264 (*player).isFalling = true;
slandry8 0:a358215f57b7 265 }
slandry8 0:a358215f57b7 266 //decrement jumping or falling counters, if applicable
slandry8 0:a358215f57b7 267 if((*player).isFalling) {
slandry8 0:a358215f57b7 268 (*player).row+=DELTA_Y;
slandry8 0:a358215f57b7 269 (*player).fallCounter-=DELTA_Y;
slandry8 0:a358215f57b7 270 }
slandry8 0:a358215f57b7 271 if((*player).isJumping) {
slandry8 0:a358215f57b7 272 (*player).row-=DELTA_Y;
slandry8 0:a358215f57b7 273 (*player).upCounter-=DELTA_Y;
slandry8 0:a358215f57b7 274 }
slandry8 0:a358215f57b7 275 drawPlayerAirborneCoverUp(&uLCD, player);
slandry8 0:a358215f57b7 276 if((*player).hasMoved) {
slandry8 0:a358215f57b7 277 drawPlayerDiagCoverUp(&uLCD, player);
slandry8 0:a358215f57b7 278 }
slandry8 0:a358215f57b7 279 }
slandry8 0:a358215f57b7 280 if((*player).hasMoved) {
slandry8 0:a358215f57b7 281 //cover up residual pixels from previous location of the player if they have moved
slandry8 0:a358215f57b7 282 //drawPlayerCoverUp(&uLCD, player);
slandry8 0:a358215f57b7 283 drawPlayerCoverUp(&uLCD, player, (*player).moveFlag);
slandry8 0:a358215f57b7 284 }
slandry8 0:a358215f57b7 285 (*player).hasMoved = false;
slandry8 0:a358215f57b7 286 (*player).moveFlag = 0;
slandry8 0:a358215f57b7 287 //detect collision
slandry8 0:a358215f57b7 288 CollisionDetect(screenP,player,&collided);
slandry8 0:a358215f57b7 289 if(collided) {
slandry8 0:a358215f57b7 290 //player has lost if collision detected
slandry8 0:a358215f57b7 291 state = STATE_LOSE;
slandry8 0:a358215f57b7 292 }
slandry8 0:a358215f57b7 293 drawPlayer(&uLCD, player);
slandry8 0:a358215f57b7 294 drawScore(&uLCD, score);
slandry8 0:a358215f57b7 295 posMutex.unlock();
slandry8 0:a358215f57b7 296 //Evaluate screens, delete old off-screen screens if necessary, and update the score
slandry8 0:a358215f57b7 297 evalScreens(screenP);
slandry8 0:a358215f57b7 298 score++;
slandry8 0:a358215f57b7 299 } else if((state & STATE_LOSE) >> 1) {
slandry8 0:a358215f57b7 300 //draw game over screen, plus NEW HIGH SCORE text if applicable
slandry8 0:a358215f57b7 301 uLCD.textbackground_color(0xf09860);
slandry8 0:a358215f57b7 302 uLCD.locate(6,0);
slandry8 0:a358215f57b7 303 uLCD.printf("GAME OVER ");
slandry8 0:a358215f57b7 304 uLCD.set_sector_address(0x001D, 0x9300);
slandry8 0:a358215f57b7 305 uLCD.locate(1,1);
slandry8 0:a358215f57b7 306 k = 0;
slandry8 0:a358215f57b7 307 if(scCompBuf != NULL) {
slandry8 0:a358215f57b7 308 //delete the previous score that was checked if the game has run once before
slandry8 0:a358215f57b7 309 delete scCompBuf;
slandry8 0:a358215f57b7 310 }
slandry8 0:a358215f57b7 311 scCompBuf = new char[15];
slandry8 0:a358215f57b7 312 readchar = ' ';
slandry8 0:a358215f57b7 313 //read in the score from the memory location on the SD card
slandry8 0:a358215f57b7 314 while(readchar != '\xFF') {
slandry8 0:a358215f57b7 315 readchar = uLCD.read_byte();
slandry8 0:a358215f57b7 316 if(readchar >= '0' && readchar <= '9') {
slandry8 0:a358215f57b7 317 scCompBuf[k] = readchar;
slandry8 0:a358215f57b7 318 }
slandry8 0:a358215f57b7 319 k++;
slandry8 0:a358215f57b7 320 }
slandry8 0:a358215f57b7 321 //determine if player should go to high score or title screen on fire
slandry8 0:a358215f57b7 322 if(score > atoi(scCompBuf)) {
slandry8 0:a358215f57b7 323 //new high score
slandry8 0:a358215f57b7 324 newHighScore = true;
slandry8 0:a358215f57b7 325 uLCD.locate(3,3);
slandry8 0:a358215f57b7 326 uLCD.textbackground_color(COVER_COLOR);
slandry8 0:a358215f57b7 327 uLCD.printf("NEW HIGH SCORE");
slandry8 0:a358215f57b7 328 }
slandry8 0:a358215f57b7 329 } else if((state & STATE_SCORE) >> 2) {
slandry8 0:a358215f57b7 330 //name entry for new high score
slandry8 0:a358215f57b7 331 if(!scoreDrawn) {
slandry8 0:a358215f57b7 332 //Only draw background pieces once
slandry8 0:a358215f57b7 333 uLCD.filled_rectangle(0,0,127,127,COVER_COLOR);
slandry8 0:a358215f57b7 334 uLCD.locate(0,0);
slandry8 0:a358215f57b7 335 uLCD.textbackground_color(COVER_COLOR);
slandry8 0:a358215f57b7 336 uLCD.printf("HIGH SCORE: %d\n\n", score);
slandry8 0:a358215f57b7 337 uLCD.printf("Initials:\n\n");
slandry8 0:a358215f57b7 338 uLCD.locate(0,4);
slandry8 0:a358215f57b7 339 //Letter select for initials
slandry8 0:a358215f57b7 340 uLCD.printf(" A B C D E F G H \n\n");
slandry8 0:a358215f57b7 341 uLCD.printf(" I J K L M N O P \n\n");
slandry8 0:a358215f57b7 342 uLCD.printf(" Q R S T U V W X \n\n");
slandry8 0:a358215f57b7 343 uLCD.printf(" Y Z ");
slandry8 0:a358215f57b7 344 uLCD.filled_rectangle(36,81,40,85,0x000000);
slandry8 0:a358215f57b7 345 (*curs).draw(&uLCD);
slandry8 0:a358215f57b7 346 scoreDrawn = true;
slandry8 0:a358215f57b7 347 }
slandry8 0:a358215f57b7 348 if((*curs).letterPressed) {
slandry8 0:a358215f57b7 349 //draw initials
slandry8 0:a358215f57b7 350 if((*curs).curChar >= 'A' && (*curs).curChar <= 'Z') { //If selected character is not the END character
slandry8 0:a358215f57b7 351 //pick correct location on screen to draw initial
slandry8 0:a358215f57b7 352 uLCD.locate(10+(*curs).c,2);
slandry8 0:a358215f57b7 353 uLCD.printf("%c",(*curs).initBuf[(*curs).c]);
slandry8 0:a358215f57b7 354 (*curs).c = (((*curs).c < 2) ? (*curs).c + 1 : 2);
slandry8 0:a358215f57b7 355 (*curs).letterPressed = false;
slandry8 0:a358215f57b7 356 } else {
slandry8 0:a358215f57b7 357 //write score to file
slandry8 0:a358215f57b7 358 if(writtenScore == NULL) {
slandry8 0:a358215f57b7 359 //allocate array
slandry8 0:a358215f57b7 360 writtenScore = new char[4 + 15];
slandry8 0:a358215f57b7 361 } else {
slandry8 0:a358215f57b7 362 delete writtenScore;
slandry8 0:a358215f57b7 363 writtenScore = new char[4 + 15];
slandry8 0:a358215f57b7 364 }
slandry8 0:a358215f57b7 365 if(scoreStr != NULL) {
slandry8 0:a358215f57b7 366 //delete any previous string representation of score
slandry8 0:a358215f57b7 367 delete scoreStr;
slandry8 0:a358215f57b7 368 }
slandry8 0:a358215f57b7 369 scoreStr = new char[15];
slandry8 0:a358215f57b7 370 //write score to display into a character array
slandry8 0:a358215f57b7 371 sprintf(writtenScore,"%s %d",(*curs).initBuf,score);
slandry8 0:a358215f57b7 372 //overwrite 0 that would appear after initials on score screen with blank space
slandry8 0:a358215f57b7 373 writtenScore[3] = ' ';
slandry8 0:a358215f57b7 374 //set location of title screen display score
slandry8 0:a358215f57b7 375 uLCD.set_sector_address(0x001D, 0x8700);
slandry8 0:a358215f57b7 376 uLCD.locate(0,12);
slandry8 0:a358215f57b7 377 uLCD.printf("\n\nStoring score...");
slandry8 0:a358215f57b7 378 for (int i=0; i<strlen(writtenScore); i++) {
slandry8 0:a358215f57b7 379 uLCD.write_byte(writtenScore[i]); //write a byte to SD card
slandry8 0:a358215f57b7 380 }
slandry8 0:a358215f57b7 381 uLCD.flush_media();
slandry8 0:a358215f57b7 382 //set location for only the score
slandry8 0:a358215f57b7 383 uLCD.set_sector_address(0x001D, 0x9300);
slandry8 0:a358215f57b7 384 //read in score to character array
slandry8 0:a358215f57b7 385 sprintf(scoreStr,"%d",score);
slandry8 0:a358215f57b7 386 for (int i=0; i<strlen(scoreStr); i++) {
slandry8 0:a358215f57b7 387 uLCD.write_byte(scoreStr[i]); //write a byte to SD card
slandry8 0:a358215f57b7 388 }
slandry8 0:a358215f57b7 389 //Reset game once score has been saved
slandry8 0:a358215f57b7 390 titleDrawn = false;
slandry8 0:a358215f57b7 391 state = STATE_START;
slandry8 0:a358215f57b7 392 }
slandry8 0:a358215f57b7 393 }
slandry8 0:a358215f57b7 394 if((*curs).hasMoved) {
slandry8 0:a358215f57b7 395 //cover up old cursor
slandry8 0:a358215f57b7 396 (*curs).coverUp(&uLCD);
slandry8 0:a358215f57b7 397 //draw new cursor
slandry8 0:a358215f57b7 398 (*curs).draw(&uLCD);
slandry8 0:a358215f57b7 399 (*curs).hasMoved = false;
slandry8 0:a358215f57b7 400 (*curs).moveFlag = 0;
slandry8 0:a358215f57b7 401 }
slandry8 0:a358215f57b7 402 }
slandry8 0:a358215f57b7 403 }
slandry8 0:a358215f57b7 404 }
slandry8 0:a358215f57b7 405
slandry8 0:a358215f57b7 406 void initialize(Screen **s, Player *p, int *score, bool* initFlash, bool *scDrawn, bool *collide, int *c, int *r, Cursor *curs) {
slandry8 0:a358215f57b7 407 //initialize screen (only delete if the screen pointer is not a null pointer
slandry8 0:a358215f57b7 408 if(s[0] != NULL) {
slandry8 0:a358215f57b7 409 delete s[0];
slandry8 0:a358215f57b7 410 }
slandry8 0:a358215f57b7 411 if(s[1] != NULL) {
slandry8 0:a358215f57b7 412 delete s[1];
slandry8 0:a358215f57b7 413 }
slandry8 0:a358215f57b7 414 s[0] = new Screen(0x780D,true,-127);
slandry8 0:a358215f57b7 415 s[1] = new Screen(0x780D,true,0);
slandry8 0:a358215f57b7 416 //Initialize or re-initialize player
slandry8 0:a358215f57b7 417 if(p != NULL) {
slandry8 0:a358215f57b7 418 delete p;
slandry8 0:a358215f57b7 419 }
slandry8 0:a358215f57b7 420 p = new Player();
slandry8 0:a358215f57b7 421 *score = 0;
slandry8 0:a358215f57b7 422 //Initialize or re-initialize flags used during gameplay
slandry8 0:a358215f57b7 423 *initFlash = false;
slandry8 0:a358215f57b7 424 *scDrawn = false;
slandry8 0:a358215f57b7 425 *collide = false;
slandry8 0:a358215f57b7 426 *c = 111;
slandry8 0:a358215f57b7 427 *r = 96;
slandry8 0:a358215f57b7 428 //Initialize or re-initialize the cursor
slandry8 0:a358215f57b7 429 if(curs != NULL) {
slandry8 0:a358215f57b7 430 delete curs;
slandry8 0:a358215f57b7 431 }
slandry8 0:a358215f57b7 432 curs = new Cursor();
slandry8 0:a358215f57b7 433 }
slandry8 0:a358215f57b7 434
slandry8 0:a358215f57b7 435
slandry8 0:a358215f57b7 436