
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
main.cpp@0:2bc06deb0e7d, 2016-03-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |