This is the first version of a Fishing Mini-game. It uses a navigational switch as a button and a joystick, playing wav files from a SD card, and a uLCD screen to show the fishing game

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

Revision:
0:5d811b6879d5
Child:
1:8dd8fafa7fc8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Mar 17 18:33:52 2016 +0000
@@ -0,0 +1,200 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "uLCD_4DGL.h"
+#include "Nav_Switch.h"
+#include "Fish.h"
+#include "Fishing.h"
+#include "SDFileSystem.h"
+#include "wave_player.h"
+
+uLCD_4DGL uLCD(p28,p27,p29);                 //LCD screen
+Nav_Switch myNav( p9, p6, p7, p5, p8);      //Navigation Switch
+
+SDFileSystem sd(p11, p12, p13, p10, "sd");      //SD Card Reader
+AnalogOut DACout(p18);                      //Wave Player Output
+wave_player waver(&DACout);
+
+Mutex stdio_mutex;                          //Mutex for Threads
+
+BusOut mbedleds(LED1,LED2,LED3,LED4);       //BusOut for all LEDs at once
+
+Fishing fisher;
+
+int dist;
+int rem1;
+int rem2;
+int old1;
+int old2;
+
+bool fishing = false;
+bool lure = false;
+bool success = false;
+
+void lakeside_thread(void const *args) {
+    while(1) {
+        stdio_mutex.lock();
+        rem1 = dist%20;
+        rem2 = (dist+10)%20;
+        if (old1 != rem1 && rem1 != 0) {
+            uLCD.filled_rectangle(40-3*old1, 10+(old1*6), 40-3*old1+ 4*((old1/5)+1), 10+(old1*6) + 5*((old1/5)+2), BLUE);
+            uLCD.filled_rectangle(20, 0, 48, 23, BLACK);
+            uLCD.line(20, 108, 40, 40, RED);
+            if (old1 < 23) {
+                for(int i =0; i < 17; i++) {
+                    uLCD.line(20, 23+i, 50, 23+i, i*0x000F);
+                }
+            }
+            old1 = rem1;
+            fisher.grass(40-3*rem1, 10+(rem1*6), (rem1/5)+1, GREEN);
+        }
+        if (old2 != rem2 && rem2 != 0) {
+            uLCD.filled_rectangle(88+2*old2, 10+(old2*6), 88+2*old2 + 4*((old2/5)+1), 10+(old2*6) + 5*((old2/5)+2), BLUE);
+            uLCD.filled_rectangle(88, 0 , 108, 23, BLACK);
+            uLCD.line(88, 40, 108, 108, RED);
+            if (old2 < 23) {
+                for(int i =0; i < 17; i++) {
+                    uLCD.line(78, 23+i, 108, 23+i, i*0x000F);
+                }
+            }   
+            old2 = rem2;
+            fisher.grass(88+2*rem2, 10+(rem2*6), (rem2/5)+1, GREEN);
+        }
+        stdio_mutex.unlock();
+    }
+}
+
+void bgm_thread(void const *args) {
+    FILE *wave_file;
+    while(true) {
+        while(lure) {
+            wave_file=fopen("/sd/wavfiles/Water Drop.wav","r");
+            waver.play(wave_file);
+            fclose(wave_file);
+            Thread::wait(5000);
+        }
+        while(fishing) {
+            wave_file=fopen("/sd/wavfiles/Stream Noise.wav","r");
+            waver.play(wave_file);
+            fclose(wave_file);
+            Thread::wait(50);
+        }
+        while(success) {
+            wave_file=fopen("/sd/wavfiles/Fish Splashing.wav","r");
+            waver.play(wave_file);
+            fclose(wave_file);
+            Thread::wait(1000);
+        }
+    }
+}
+
+int main() {
+    dist = 0;
+    uLCD.baudrate(3000000);
+    fishing = false;
+    lure = false;
+    success = false;
+    
+    uLCD.background_color(BLACK);
+    
+    fisher.start();
+    wait(3);
+    
+    fisher.lake_init();
+    
+    Thread thread1(lakeside_thread);
+    Thread thread2(bgm_thread);
+    Fish fish1;
+    int rand1 = rand() % 100;
+    int cnt = 0;
+    lure = true;
+    
+    while(1) {
+        fisher.draw_fish(64, dist);
+        lure = false;
+        fisher.draw_rod(0, 64);
+        stdio_mutex.lock();
+        uLCD.locate(0,0);
+        uLCD.printf("Press Center when Flashing");
+        stdio_mutex.unlock();
+        if(rand1 > 80) {
+            for(cnt = 0; cnt < 30; cnt++) {
+                mbedleds = 0x0F*(cnt%2);
+                uLCD.circle(64, 80 , 4+(cnt%8), BLACK );
+                uLCD.circle(64, 80 , 5+(cnt%8), BLACK );
+                uLCD.circle(64, 80 , 4+(cnt%8), BLUE);
+                uLCD.circle(64, 80 , 5+(cnt%8), BLUE);
+                if(myNav.fire()) {
+                    while(dist < 300) {
+                        dist = dist + 5;
+                    }
+                    fishing = true;
+                    fish1.reset();
+                    cnt = 30;
+                    mbedleds = 0x00;
+                    stdio_mutex.lock();
+                    uLCD.filled_rectangle(0,0,127,20,BLACK);
+                    stdio_mutex.unlock();
+                }
+                wait(0.1);
+            }
+            cnt = 0;
+        }
+        while(fishing) {
+            fisher.draw_fish(fish1.x(), dist);
+            fish1.movement();
+            dist = dist - 2;
+            if (myNav.left()) {
+                cnt--;
+                if (cnt > 0) {
+                    cnt-=2;
+                }
+            } else if (myNav.right()) {
+                cnt++;
+                if (cnt < 0) {
+                    cnt+=2;
+                }
+            } else {
+                if (cnt > 0) {
+                    cnt--;
+                } else if (cnt < 0) {
+                    cnt++;
+                }
+            }
+            if (cnt > 6) {
+                cnt = 6;
+            } else if (cnt < -6) {
+                cnt = -6;
+            }
+            fish1.move(((64+cnt*6 - fish1.x())/30) + 1);
+            fisher.draw_rod(cnt, fish1.x());
+            
+            if(dist == 0) {
+                success = true;
+                fishing = false;
+                stdio_mutex.lock();
+                fisher.lake_init();
+                uLCD.locate(1,1);
+                uLCD.printf("You Caught It!");
+                wait(3.0);
+                uLCD.filled_rectangle(0,0,127,20,BLACK);
+                stdio_mutex.unlock();
+                success = false;
+            }
+            if (!(fish1.failed())) {
+                fishing = false;
+                stdio_mutex.lock();
+                fisher.lake_init();
+                uLCD.locate(1,1);
+                uLCD.printf("It Got Away...");
+                wait(3.0);
+                uLCD.filled_rectangle(0,0,127,20,BLACK);
+                stdio_mutex.unlock();
+            }
+            wait(0.25);
+        }
+        rand1 = rand() % 100;
+        dist = 300;
+        cnt = 0;
+        wait(0.1);
+    }
+}
\ No newline at end of file