A skydiving game created using an mbed. This code used threads and mutexes to create a skydiving simulation on an uLCD. The sounds being played are read off of a microSD card and played through the speakers. The user controls the skydiver's movements with a navigation switch.

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

Committer:
mhennessy3
Date:
Wed Mar 16 20:13:23 2016 +0000
Revision:
0:2bc06deb0e7d
Child:
1:d0bc93562029
publish skydiving game 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mhennessy3 0:2bc06deb0e7d 1 #include "mbed.h"
mhennessy3 0:2bc06deb0e7d 2 #include "rtos.h"
mhennessy3 0:2bc06deb0e7d 3 #include "uLCD_4DGL.h"
mhennessy3 0:2bc06deb0e7d 4 #include "SDFileSystem.h"
mhennessy3 0:2bc06deb0e7d 5 #include "wave_player.h"
mhennessy3 0:2bc06deb0e7d 6
mhennessy3 0:2bc06deb0e7d 7 uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin;
mhennessy3 0:2bc06deb0e7d 8 Mutex lcd_mutex;// Create the mutex lock object
mhennessy3 0:2bc06deb0e7d 9 PwmOut speaker(p21); //create a PwmOut object for the speaker
mhennessy3 0:2bc06deb0e7d 10 SDFileSystem sd(p5, p6, p7, p21, "sd"); //SD card
mhennessy3 0:2bc06deb0e7d 11 AnalogOut DACout(p18);
mhennessy3 0:2bc06deb0e7d 12 wave_player waver(&DACout);
mhennessy3 0:2bc06deb0e7d 13
mhennessy3 0:2bc06deb0e7d 14 /////////////////////////////////////////////////////////////////////////////////////////////
mhennessy3 0:2bc06deb0e7d 15 //Navigation Switch class
mhennessy3 0:2bc06deb0e7d 16 class Nav_Switch
mhennessy3 0:2bc06deb0e7d 17 {
mhennessy3 0:2bc06deb0e7d 18 public:
mhennessy3 0:2bc06deb0e7d 19 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
mhennessy3 0:2bc06deb0e7d 20 int read();
mhennessy3 0:2bc06deb0e7d 21 //boolean functions to test each switch
mhennessy3 0:2bc06deb0e7d 22 bool up();
mhennessy3 0:2bc06deb0e7d 23 bool down();
mhennessy3 0:2bc06deb0e7d 24 bool left();
mhennessy3 0:2bc06deb0e7d 25 bool right();
mhennessy3 0:2bc06deb0e7d 26 bool fire();
mhennessy3 0:2bc06deb0e7d 27 //automatic read on RHS
mhennessy3 0:2bc06deb0e7d 28 operator int ();
mhennessy3 0:2bc06deb0e7d 29 //index to any switch array style
mhennessy3 0:2bc06deb0e7d 30 bool operator[](int index) {
mhennessy3 0:2bc06deb0e7d 31 return _pins[index];
mhennessy3 0:2bc06deb0e7d 32 };
mhennessy3 0:2bc06deb0e7d 33 private:
mhennessy3 0:2bc06deb0e7d 34 BusIn _pins;
mhennessy3 0:2bc06deb0e7d 35
mhennessy3 0:2bc06deb0e7d 36 };
mhennessy3 0:2bc06deb0e7d 37 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
mhennessy3 0:2bc06deb0e7d 38 _pins(up, down, left, right, fire)
mhennessy3 0:2bc06deb0e7d 39 {
mhennessy3 0:2bc06deb0e7d 40 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
mhennessy3 0:2bc06deb0e7d 41 wait(0.001); //delays just a bit for pullups to pull inputs high
mhennessy3 0:2bc06deb0e7d 42 }
mhennessy3 0:2bc06deb0e7d 43 inline bool Nav_Switch::up()
mhennessy3 0:2bc06deb0e7d 44 {
mhennessy3 0:2bc06deb0e7d 45 return !(_pins[0]);
mhennessy3 0:2bc06deb0e7d 46 }
mhennessy3 0:2bc06deb0e7d 47 inline bool Nav_Switch::down()
mhennessy3 0:2bc06deb0e7d 48 {
mhennessy3 0:2bc06deb0e7d 49 return !(_pins[1]);
mhennessy3 0:2bc06deb0e7d 50 }
mhennessy3 0:2bc06deb0e7d 51 inline bool Nav_Switch::left()
mhennessy3 0:2bc06deb0e7d 52 {
mhennessy3 0:2bc06deb0e7d 53 return !(_pins[2]);
mhennessy3 0:2bc06deb0e7d 54 }
mhennessy3 0:2bc06deb0e7d 55 inline bool Nav_Switch::right()
mhennessy3 0:2bc06deb0e7d 56 {
mhennessy3 0:2bc06deb0e7d 57 return !(_pins[3]);
mhennessy3 0:2bc06deb0e7d 58 }
mhennessy3 0:2bc06deb0e7d 59 inline bool Nav_Switch::fire()
mhennessy3 0:2bc06deb0e7d 60 {
mhennessy3 0:2bc06deb0e7d 61 return !(_pins[4]);
mhennessy3 0:2bc06deb0e7d 62 }
mhennessy3 0:2bc06deb0e7d 63 inline int Nav_Switch::read()
mhennessy3 0:2bc06deb0e7d 64 {
mhennessy3 0:2bc06deb0e7d 65 return _pins.read();
mhennessy3 0:2bc06deb0e7d 66 }
mhennessy3 0:2bc06deb0e7d 67 inline Nav_Switch::operator int ()
mhennessy3 0:2bc06deb0e7d 68 {
mhennessy3 0:2bc06deb0e7d 69 return _pins.read();
mhennessy3 0:2bc06deb0e7d 70 }
mhennessy3 0:2bc06deb0e7d 71
mhennessy3 0:2bc06deb0e7d 72 Nav_Switch myNav( p12, p9, p10, p8, p11); //pin order on Sparkfun breakout
mhennessy3 0:2bc06deb0e7d 73
mhennessy3 0:2bc06deb0e7d 74
mhennessy3 0:2bc06deb0e7d 75 //////////////////////////////////////////////////////////////////////////////////////////////
mhennessy3 0:2bc06deb0e7d 76
mhennessy3 0:2bc06deb0e7d 77 // initialize variables
mhennessy3 0:2bc06deb0e7d 78
mhennessy3 0:2bc06deb0e7d 79 int rx1, ry1, rrx1, rry1, rrrx1, rrry1, length;
mhennessy3 0:2bc06deb0e7d 80 int rx2, rrx2, rrrx2;
mhennessy3 0:2bc06deb0e7d 81 int dis_top, midC, breakT;
mhennessy3 0:2bc06deb0e7d 82 int tx1, ty1, lx1, ly1;
mhennessy3 0:2bc06deb0e7d 83 int stopLength, circY, parachute;
mhennessy3 0:2bc06deb0e7d 84 int shapeColor1, count;
mhennessy3 0:2bc06deb0e7d 85 // thread to write to LCD screen
mhennessy3 0:2bc06deb0e7d 86 void thread1(void const *args){
mhennessy3 0:2bc06deb0e7d 87 //generates obstacles
mhennessy3 0:2bc06deb0e7d 88
mhennessy3 0:2bc06deb0e7d 89 while(true){
mhennessy3 0:2bc06deb0e7d 90
mhennessy3 0:2bc06deb0e7d 91 lcd_mutex.lock();//acquire lock
mhennessy3 0:2bc06deb0e7d 92
mhennessy3 0:2bc06deb0e7d 93 //Erase previous position of obstacles
mhennessy3 0:2bc06deb0e7d 94 uLCD.filled_rectangle(rx1, ry1, rx1+10, ry1+10, BLUE);
mhennessy3 0:2bc06deb0e7d 95 uLCD.filled_rectangle(rrx1, rry1, rrx1+10, rry1+10, BLUE);
mhennessy3 0:2bc06deb0e7d 96 uLCD.filled_rectangle(rrrx1, rrry1, rrrx1+10, rrry1+10, BLUE);
mhennessy3 0:2bc06deb0e7d 97
mhennessy3 0:2bc06deb0e7d 98 if(length<stopLength) {
mhennessy3 0:2bc06deb0e7d 99 //continues the loop from offscreen to back on the screen when within a looped time
mhennessy3 0:2bc06deb0e7d 100 if(ry1<0){
mhennessy3 0:2bc06deb0e7d 101 ry1=137;
mhennessy3 0:2bc06deb0e7d 102 rx1=(rx1+30)%127;
mhennessy3 0:2bc06deb0e7d 103 shapeColor1 = (shapeColor1 + 0x110000) & 0xFFFFFF;
mhennessy3 0:2bc06deb0e7d 104 }
mhennessy3 0:2bc06deb0e7d 105 if(rry1<0){
mhennessy3 0:2bc06deb0e7d 106 rry1=137;
mhennessy3 0:2bc06deb0e7d 107 rrx1=(rrx1+65)%127;
mhennessy3 0:2bc06deb0e7d 108 }
mhennessy3 0:2bc06deb0e7d 109 if(rrry1<0){
mhennessy3 0:2bc06deb0e7d 110 rrry1=137;
mhennessy3 0:2bc06deb0e7d 111 rrrx1=(rrrx1+93)%127;
mhennessy3 0:2bc06deb0e7d 112 }
mhennessy3 0:2bc06deb0e7d 113 if(ly1<0){
mhennessy3 0:2bc06deb0e7d 114 ly1=137;
mhennessy3 0:2bc06deb0e7d 115 lx1 = (lx1+50)%127;
mhennessy3 0:2bc06deb0e7d 116 }
mhennessy3 0:2bc06deb0e7d 117 }
mhennessy3 0:2bc06deb0e7d 118 // update positions of obstacles
mhennessy3 0:2bc06deb0e7d 119 ry1 = ry1-10;
mhennessy3 0:2bc06deb0e7d 120 rry1 = rry1-10;
mhennessy3 0:2bc06deb0e7d 121 rrry1 = rrry1-10;
mhennessy3 0:2bc06deb0e7d 122
mhennessy3 0:2bc06deb0e7d 123 ty1 = ty1-10;
mhennessy3 0:2bc06deb0e7d 124 ly1 = ly1-10;
mhennessy3 0:2bc06deb0e7d 125
mhennessy3 0:2bc06deb0e7d 126 wait(.01);
mhennessy3 0:2bc06deb0e7d 127 // draw updated obstacles
mhennessy3 0:2bc06deb0e7d 128 uLCD.filled_rectangle(rx1, ry1, rx1+10, ry1+10,shapeColor1);//change position
mhennessy3 0:2bc06deb0e7d 129 uLCD.filled_rectangle(rrx1, rry1, rrx1+10, rry1+10,0xFF3300);//change position
mhennessy3 0:2bc06deb0e7d 130 uLCD.filled_rectangle(rrrx1, rrry1, rrrx1+10, rrry1+10,0x99ffcc);//change position
mhennessy3 0:2bc06deb0e7d 131 lcd_mutex.unlock();//release lock
mhennessy3 0:2bc06deb0e7d 132
mhennessy3 0:2bc06deb0e7d 133
mhennessy3 0:2bc06deb0e7d 134 //Checking for collisions with obstacles
mhennessy3 0:2bc06deb0e7d 135 rx2 = rx1+10;
mhennessy3 0:2bc06deb0e7d 136 rrx2 = rrx1+10;
mhennessy3 0:2bc06deb0e7d 137 rrrx2 = rrrx1 +10;
mhennessy3 0:2bc06deb0e7d 138 dis_top= 8+7; //y pos of circle +radius 7
mhennessy3 0:2bc06deb0e7d 139 // detect a collision between skydiver and obstacle
mhennessy3 0:2bc06deb0e7d 140
mhennessy3 0:2bc06deb0e7d 141 //circle 1
mhennessy3 0:2bc06deb0e7d 142 if( (((midC-7)<=rx2 && rx2<=(midC+7)) || ((midC-7)<=rx1 && rx1<=(midC+7))) && ((ry1<dis_top) && (ry1>0))) {
mhennessy3 0:2bc06deb0e7d 143 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 144 uLCD.cls();
mhennessy3 0:2bc06deb0e7d 145 uLCD.text_width(2); //2X size text
mhennessy3 0:2bc06deb0e7d 146 uLCD.text_height(2);
mhennessy3 0:2bc06deb0e7d 147 uLCD.color(RED);
mhennessy3 0:2bc06deb0e7d 148 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 149 uLCD.printf("\n GAME \n OVER!\n");
mhennessy3 0:2bc06deb0e7d 150 wait(.05);
mhennessy3 0:2bc06deb0e7d 151 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 152 break;
mhennessy3 0:2bc06deb0e7d 153 }
mhennessy3 0:2bc06deb0e7d 154
mhennessy3 0:2bc06deb0e7d 155 //circle 2
mhennessy3 0:2bc06deb0e7d 156 if( (((midC-7)<=rrx2 && rrx2<=(midC+7)) || ((midC-7)<=rrx1 && rrx1<=(midC+7))) && ((rry1<dis_top) && (rry1>0))) {
mhennessy3 0:2bc06deb0e7d 157 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 158 uLCD.cls();
mhennessy3 0:2bc06deb0e7d 159 uLCD.text_width(2); //2X size text
mhennessy3 0:2bc06deb0e7d 160 uLCD.text_height(2);
mhennessy3 0:2bc06deb0e7d 161 uLCD.color(RED);
mhennessy3 0:2bc06deb0e7d 162 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 163 uLCD.printf("\n GAME \n OVER!\n");
mhennessy3 0:2bc06deb0e7d 164 wait(.05);
mhennessy3 0:2bc06deb0e7d 165
mhennessy3 0:2bc06deb0e7d 166 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 167 break;
mhennessy3 0:2bc06deb0e7d 168 }
mhennessy3 0:2bc06deb0e7d 169
mhennessy3 0:2bc06deb0e7d 170 //circle 3
mhennessy3 0:2bc06deb0e7d 171 if( (((midC-7)<=rrrx2 && rrrx2<=(midC+7)) || ((midC-7)<=rrrx1 && rrrx1<=(midC+7))) && ((rrry1<dis_top) && (rrry1>0))) {
mhennessy3 0:2bc06deb0e7d 172 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 173 uLCD.cls();
mhennessy3 0:2bc06deb0e7d 174 uLCD.text_width(2); //2X size text
mhennessy3 0:2bc06deb0e7d 175 uLCD.text_height(2);
mhennessy3 0:2bc06deb0e7d 176 uLCD.color(RED);
mhennessy3 0:2bc06deb0e7d 177 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 178 uLCD.printf("\n GAME \n OVER!\n");
mhennessy3 0:2bc06deb0e7d 179 FILE *wave_file;
mhennessy3 0:2bc06deb0e7d 180 wave_file=fopen("/sd/mydir/loser.wav","r");
mhennessy3 0:2bc06deb0e7d 181 waver.play(wave_file);
mhennessy3 0:2bc06deb0e7d 182 fclose(wave_file);
mhennessy3 0:2bc06deb0e7d 183 wait(2);
mhennessy3 0:2bc06deb0e7d 184
mhennessy3 0:2bc06deb0e7d 185 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 186 break;
mhennessy3 0:2bc06deb0e7d 187 }
mhennessy3 0:2bc06deb0e7d 188
mhennessy3 0:2bc06deb0e7d 189 length = length +1; //increment lenght or duration of the number of scrolls it goes through
mhennessy3 0:2bc06deb0e7d 190 Thread::wait(500);
mhennessy3 0:2bc06deb0e7d 191
mhennessy3 0:2bc06deb0e7d 192 // Begin the final fall to the ground
mhennessy3 0:2bc06deb0e7d 193 if(length>=stopLength+15 && circY<109){
mhennessy3 0:2bc06deb0e7d 194
mhennessy3 0:2bc06deb0e7d 195
mhennessy3 0:2bc06deb0e7d 196 //displays text to hit fire while falling until you hit fire and deploy the parachute
mhennessy3 0:2bc06deb0e7d 197 if(count==0){
mhennessy3 0:2bc06deb0e7d 198 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 199 uLCD.text_width(1); //2X size text
mhennessy3 0:2bc06deb0e7d 200 uLCD.text_height(1);
mhennessy3 0:2bc06deb0e7d 201 uLCD.color(GREEN);
mhennessy3 0:2bc06deb0e7d 202 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 203 uLCD.printf("\n Hit fire for \n a parachute! \n");
mhennessy3 0:2bc06deb0e7d 204 //wait(2);
mhennessy3 0:2bc06deb0e7d 205 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 206 }
mhennessy3 0:2bc06deb0e7d 207
mhennessy3 0:2bc06deb0e7d 208 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 209 uLCD.filled_rectangle(0, 128, 128, 118,GREEN);
mhennessy3 0:2bc06deb0e7d 210 uLCD.filled_rectangle(90, 123, 105, 118,RED);
mhennessy3 0:2bc06deb0e7d 211
mhennessy3 0:2bc06deb0e7d 212 if(parachute==1){
mhennessy3 0:2bc06deb0e7d 213 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLUE);
mhennessy3 0:2bc06deb0e7d 214 }
mhennessy3 0:2bc06deb0e7d 215 uLCD.filled_circle(midC, circY, 7, BLUE);
mhennessy3 0:2bc06deb0e7d 216 midC = midC-1;
mhennessy3 0:2bc06deb0e7d 217 circY = circY + 2;
mhennessy3 0:2bc06deb0e7d 218 if(parachute==1){
mhennessy3 0:2bc06deb0e7d 219 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLACK);
mhennessy3 0:2bc06deb0e7d 220 }
mhennessy3 0:2bc06deb0e7d 221 uLCD.filled_circle(midC, circY, 7, BLACK);
mhennessy3 0:2bc06deb0e7d 222
mhennessy3 0:2bc06deb0e7d 223 lcd_mutex.unlock();//release lock
mhennessy3 0:2bc06deb0e7d 224
mhennessy3 0:2bc06deb0e7d 225 //if fire is pressed then parachute is deployed
mhennessy3 0:2bc06deb0e7d 226 if(myNav.fire() == 1){
mhennessy3 0:2bc06deb0e7d 227 parachute = 1;
mhennessy3 0:2bc06deb0e7d 228 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 229 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLACK);
mhennessy3 0:2bc06deb0e7d 230 uLCD.text_width(1); //2X size text
mhennessy3 0:2bc06deb0e7d 231 uLCD.text_height(1);
mhennessy3 0:2bc06deb0e7d 232 uLCD.color(BLUE);
mhennessy3 0:2bc06deb0e7d 233 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 234 uLCD.printf("\n Hit fire for \n a parachute! \n");
mhennessy3 0:2bc06deb0e7d 235 count = 1;
mhennessy3 0:2bc06deb0e7d 236 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 237 }
mhennessy3 0:2bc06deb0e7d 238
mhennessy3 0:2bc06deb0e7d 239 //checking to see if the botton of the circle touched the red space...if so you win
mhennessy3 0:2bc06deb0e7d 240 if(circY+7==117 && (midC<=105 && midC>=90)) {
mhennessy3 0:2bc06deb0e7d 241 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 242 uLCD.text_width(2); //2X size text
mhennessy3 0:2bc06deb0e7d 243 uLCD.text_height(2);
mhennessy3 0:2bc06deb0e7d 244 uLCD.color(GREEN);
mhennessy3 0:2bc06deb0e7d 245 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 246 if(parachute == 1) {
mhennessy3 0:2bc06deb0e7d 247 uLCD.printf("\n You \n WON!\n");
mhennessy3 0:2bc06deb0e7d 248 ///////////////////////////////////////////////////////SDcard reading from sound for winning!!!!
mhennessy3 0:2bc06deb0e7d 249 FILE *wave_file;
mhennessy3 0:2bc06deb0e7d 250 wave_file=fopen("/sd/mydir/yababy.wav","r");
mhennessy3 0:2bc06deb0e7d 251 waver.play(wave_file);
mhennessy3 0:2bc06deb0e7d 252 fclose(wave_file);
mhennessy3 0:2bc06deb0e7d 253 }
mhennessy3 0:2bc06deb0e7d 254
mhennessy3 0:2bc06deb0e7d 255 //if you don't deploy your parachute but still land ont he red, you still lose
mhennessy3 0:2bc06deb0e7d 256 if(parachute == 0) {
mhennessy3 0:2bc06deb0e7d 257 uLCD.printf("\n You \n lost.\n");
mhennessy3 0:2bc06deb0e7d 258 // SDcard reading for losing
mhennessy3 0:2bc06deb0e7d 259 FILE *wave_file;
mhennessy3 0:2bc06deb0e7d 260 wave_file=fopen("/sd/mydir/loser.wav","r");
mhennessy3 0:2bc06deb0e7d 261 waver.play(wave_file);
mhennessy3 0:2bc06deb0e7d 262 fclose(wave_file);
mhennessy3 0:2bc06deb0e7d 263 }
mhennessy3 0:2bc06deb0e7d 264 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 265 }
mhennessy3 0:2bc06deb0e7d 266
mhennessy3 0:2bc06deb0e7d 267 //checks to see if you touch green part of the ground
mhennessy3 0:2bc06deb0e7d 268 if(circY+7>=117 && (midC>105 || midC<90)) {
mhennessy3 0:2bc06deb0e7d 269 lcd_mutex.lock();
mhennessy3 0:2bc06deb0e7d 270 uLCD.text_width(2); //2X size text
mhennessy3 0:2bc06deb0e7d 271 uLCD.text_height(2);
mhennessy3 0:2bc06deb0e7d 272 uLCD.color(GREEN);
mhennessy3 0:2bc06deb0e7d 273 uLCD.locate(2,2);
mhennessy3 0:2bc06deb0e7d 274 uLCD.printf("\n You \n lost.\n");
mhennessy3 0:2bc06deb0e7d 275 // SDcard reading for losing
mhennessy3 0:2bc06deb0e7d 276 FILE *wave_file;
mhennessy3 0:2bc06deb0e7d 277 wave_file=fopen("/sd/mydir/loser.wav","r");
mhennessy3 0:2bc06deb0e7d 278 waver.play(wave_file);
mhennessy3 0:2bc06deb0e7d 279 fclose(wave_file);
mhennessy3 0:2bc06deb0e7d 280 //wait(2);
mhennessy3 0:2bc06deb0e7d 281 lcd_mutex.unlock();
mhennessy3 0:2bc06deb0e7d 282 }
mhennessy3 0:2bc06deb0e7d 283 }
mhennessy3 0:2bc06deb0e7d 284 }
mhennessy3 0:2bc06deb0e7d 285 }
mhennessy3 0:2bc06deb0e7d 286
mhennessy3 0:2bc06deb0e7d 287 /*// Sound Thread for Wind
mhennessy3 0:2bc06deb0e7d 288 void thread2(void const *args) {
mhennessy3 0:2bc06deb0e7d 289 if(parachute == 1) {
mhennessy3 0:2bc06deb0e7d 290 FILE *wave_file;
mhennessy3 0:2bc06deb0e7d 291 wave_file=fopen("/sd/mydir/Wind.wav","r");
mhennessy3 0:2bc06deb0e7d 292 waver.play(wave_file);
mhennessy3 0:2bc06deb0e7d 293 fclose(wave_file);
mhennessy3 0:2bc06deb0e7d 294 }
mhennessy3 0:2bc06deb0e7d 295 }*/
mhennessy3 0:2bc06deb0e7d 296
mhennessy3 0:2bc06deb0e7d 297 int main() {
mhennessy3 0:2bc06deb0e7d 298
mhennessy3 0:2bc06deb0e7d 299 //uLCD.text_mode(OPAQUE);
mhennessy3 0:2bc06deb0e7d 300 // Initial start screen and countdown to beginning of game
mhennessy3 0:2bc06deb0e7d 301 uLCD.printf("\nSkydiving!\n"); //Default Green on black text
mhennessy3 0:2bc06deb0e7d 302 uLCD.printf("\n Starting Game \nShortly...");
mhennessy3 0:2bc06deb0e7d 303 uLCD.text_width(4); //4X size text
mhennessy3 0:2bc06deb0e7d 304 uLCD.text_height(4);
mhennessy3 0:2bc06deb0e7d 305 uLCD.color(RED);
mhennessy3 0:2bc06deb0e7d 306 wait(2);
mhennessy3 0:2bc06deb0e7d 307 for (int i=3; i>=0; --i) {
mhennessy3 0:2bc06deb0e7d 308 uLCD.locate(1,2);
mhennessy3 0:2bc06deb0e7d 309 uLCD.printf("%2D",i);
mhennessy3 0:2bc06deb0e7d 310 wait(1);
mhennessy3 0:2bc06deb0e7d 311 }
mhennessy3 0:2bc06deb0e7d 312 uLCD.cls();
mhennessy3 0:2bc06deb0e7d 313 //uLCD.printf("Change baudrate......");
mhennessy3 0:2bc06deb0e7d 314 uLCD.baudrate(3000000); //jack up baud rate to max for fast display
mhennessy3 0:2bc06deb0e7d 315 //if demo hangs here - try lower baud rates
mhennessy3 0:2bc06deb0e7d 316 //
mhennessy3 0:2bc06deb0e7d 317 // printf text only full screen mode demo
mhennessy3 0:2bc06deb0e7d 318 uLCD.background_color(BLUE);
mhennessy3 0:2bc06deb0e7d 319 uLCD.cls();
mhennessy3 0:2bc06deb0e7d 320 uLCD.locate(0,0);
mhennessy3 0:2bc06deb0e7d 321 uLCD.color(WHITE);
mhennessy3 0:2bc06deb0e7d 322
mhennessy3 0:2bc06deb0e7d 323 uLCD.textbackground_color(BLUE);
mhennessy3 0:2bc06deb0e7d 324 uLCD.set_font(FONT_7X8);
mhennessy3 0:2bc06deb0e7d 325 uLCD.text_mode(OPAQUE);
mhennessy3 0:2bc06deb0e7d 326
mhennessy3 0:2bc06deb0e7d 327
mhennessy3 0:2bc06deb0e7d 328
mhennessy3 0:2bc06deb0e7d 329 //initialization of variables
mhennessy3 0:2bc06deb0e7d 330 circY = 8;
mhennessy3 0:2bc06deb0e7d 331 rx1 = 10;
mhennessy3 0:2bc06deb0e7d 332 ry1 = 160;
mhennessy3 0:2bc06deb0e7d 333 rrx1 = 50;
mhennessy3 0:2bc06deb0e7d 334 rry1 = 128;
mhennessy3 0:2bc06deb0e7d 335 rrrx1 = 100;
mhennessy3 0:2bc06deb0e7d 336 rrry1 = 200;
mhennessy3 0:2bc06deb0e7d 337
mhennessy3 0:2bc06deb0e7d 338 tx1=10;
mhennessy3 0:2bc06deb0e7d 339 ty1=30;
mhennessy3 0:2bc06deb0e7d 340
mhennessy3 0:2bc06deb0e7d 341 lx1 = 25;
mhennessy3 0:2bc06deb0e7d 342 ly1 = 130;
mhennessy3 0:2bc06deb0e7d 343
mhennessy3 0:2bc06deb0e7d 344
mhennessy3 0:2bc06deb0e7d 345 length =0;
mhennessy3 0:2bc06deb0e7d 346 midC = 64;
mhennessy3 0:2bc06deb0e7d 347 breakT = 0;
mhennessy3 0:2bc06deb0e7d 348 stopLength = 50;
mhennessy3 0:2bc06deb0e7d 349 shapeColor1 = 0x66FF33;
mhennessy3 0:2bc06deb0e7d 350
mhennessy3 0:2bc06deb0e7d 351 uLCD.filled_circle(midC, 8, 7, BLACK); // draw initial skydiver
mhennessy3 0:2bc06deb0e7d 352
mhennessy3 0:2bc06deb0e7d 353
mhennessy3 0:2bc06deb0e7d 354 // draw initial obstacles
mhennessy3 0:2bc06deb0e7d 355 uLCD.filled_rectangle(rx1, ry1, rx1+10, ry1+10, WHITE);
mhennessy3 0:2bc06deb0e7d 356 uLCD.filled_rectangle(rrx1, rry1, rrx1+10, rry1+10, WHITE);
mhennessy3 0:2bc06deb0e7d 357 uLCD.filled_rectangle(rrrx1, rrry1, rrrx1+10, rrry1+10, WHITE);
mhennessy3 0:2bc06deb0e7d 358
mhennessy3 0:2bc06deb0e7d 359 uLCD.filled_circle(midC, circY, 7, BLACK);
mhennessy3 0:2bc06deb0e7d 360
mhennessy3 0:2bc06deb0e7d 361 ///// Sound of Scream jumping out of Airplane
mhennessy3 0:2bc06deb0e7d 362 FILE *wave_file;
mhennessy3 0:2bc06deb0e7d 363 wave_file=fopen("/sd/mydir/scream_male.wav","r");
mhennessy3 0:2bc06deb0e7d 364 waver.play(wave_file);
mhennessy3 0:2bc06deb0e7d 365 fclose(wave_file);
mhennessy3 0:2bc06deb0e7d 366 //// End Scream
mhennessy3 0:2bc06deb0e7d 367 Thread t1(thread1);
mhennessy3 0:2bc06deb0e7d 368 //Thread t2(thread2);
mhennessy3 0:2bc06deb0e7d 369
mhennessy3 0:2bc06deb0e7d 370 while(true) {
mhennessy3 0:2bc06deb0e7d 371 if(breakT ==1){
mhennessy3 0:2bc06deb0e7d 372 uLCD.cls();
mhennessy3 0:2bc06deb0e7d 373 uLCD.filled_circle(midC, circY, 7, BLACK);
mhennessy3 0:2bc06deb0e7d 374 }
mhennessy3 0:2bc06deb0e7d 375
mhennessy3 0:2bc06deb0e7d 376
mhennessy3 0:2bc06deb0e7d 377 //control if nav switch is switch left
mhennessy3 0:2bc06deb0e7d 378 if(myNav.left() == 0x01){
mhennessy3 0:2bc06deb0e7d 379 lcd_mutex.lock();//acquire lock
mhennessy3 0:2bc06deb0e7d 380 if(parachute==1){
mhennessy3 0:2bc06deb0e7d 381 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLUE);
mhennessy3 0:2bc06deb0e7d 382 }
mhennessy3 0:2bc06deb0e7d 383 uLCD.filled_circle(midC, circY, 7, BLUE);
mhennessy3 0:2bc06deb0e7d 384 if((midC-1)<=7){
mhennessy3 0:2bc06deb0e7d 385 midC = 7;
mhennessy3 0:2bc06deb0e7d 386 }
mhennessy3 0:2bc06deb0e7d 387 else{
mhennessy3 0:2bc06deb0e7d 388 midC = midC-1;
mhennessy3 0:2bc06deb0e7d 389 }
mhennessy3 0:2bc06deb0e7d 390 if(parachute==1){
mhennessy3 0:2bc06deb0e7d 391 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLACK);
mhennessy3 0:2bc06deb0e7d 392 }
mhennessy3 0:2bc06deb0e7d 393 uLCD.filled_circle(midC, circY, 7, BLACK);
mhennessy3 0:2bc06deb0e7d 394 lcd_mutex.unlock();//release lock
mhennessy3 0:2bc06deb0e7d 395 }
mhennessy3 0:2bc06deb0e7d 396
mhennessy3 0:2bc06deb0e7d 397 //control if nav switch is switched right
mhennessy3 0:2bc06deb0e7d 398 if(myNav.right() == 0x01){
mhennessy3 0:2bc06deb0e7d 399 lcd_mutex.lock();//acquire lock
mhennessy3 0:2bc06deb0e7d 400 if(parachute==1){
mhennessy3 0:2bc06deb0e7d 401 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLUE);
mhennessy3 0:2bc06deb0e7d 402 }
mhennessy3 0:2bc06deb0e7d 403 uLCD.filled_circle(midC, circY, 7, BLUE);
mhennessy3 0:2bc06deb0e7d 404 if((midC+1)>=120){
mhennessy3 0:2bc06deb0e7d 405 midC = 120;
mhennessy3 0:2bc06deb0e7d 406 }
mhennessy3 0:2bc06deb0e7d 407 else{
mhennessy3 0:2bc06deb0e7d 408 midC = midC+1;
mhennessy3 0:2bc06deb0e7d 409 }
mhennessy3 0:2bc06deb0e7d 410 if(parachute==1){
mhennessy3 0:2bc06deb0e7d 411 uLCD.triangle(midC-10,circY -25, midC+10, circY -25, midC, circY -7, BLACK);
mhennessy3 0:2bc06deb0e7d 412 }
mhennessy3 0:2bc06deb0e7d 413 uLCD.filled_circle(midC, circY, 7, BLACK);
mhennessy3 0:2bc06deb0e7d 414 lcd_mutex.unlock();//release lock
mhennessy3 0:2bc06deb0e7d 415 }
mhennessy3 0:2bc06deb0e7d 416 }
mhennessy3 0:2bc06deb0e7d 417 }