ECE 4180 Lab 4 Racing Game

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "SDFileSystem.h"
00004 #include "wave_player.h"
00005 #include "uLCD_4DGL.h"
00006 
00007 #define PI 3.14159
00008 
00009 //Serial Debug
00010 Serial pc(USBTX, USBRX);
00011 
00012 //Joystick
00013 AnalogIn jsy(p16);
00014 AnalogIn jsx(p15);
00015 
00016 //SD Card
00017 SDFileSystem sd(p5, p6, p7, p8, "sd");
00018 
00019 //LCD Display
00020 uLCD_4DGL uLCD(p13, p14, p30); // serial tx, serial rx, reset pin
00021 
00022 //Analog Out Jack
00023 AnalogOut DACout(p18);
00024 //On Board Speaker
00025 PwmOut PWMout(p26);
00026 
00027 //Audio Player
00028 wave_player player(&DACout, &PWMout);
00029 
00030 //Threads
00031 Thread audioThread, thread2, thread3, gameDisplayThread;
00032  
00033 //Game Data
00034 float inputLR, inputSpeed;
00035 int carScrPosX = 63, carScrPosY = 120;
00036 int carVel = 0, odo = 0;
00037 bool redraw = true;
00038 int wallY1 = 6, wallY2 = 36, wallY3 = 68, wallThickness = 8;
00039 int wallsStart[3], wallsEnd[3], wallsY[3] = {wallY1, wallY2, wallY3};
00040 
00041 void generateWall(int wall) {
00042     float wallSeed1 = (float) rand() / RAND_MAX * 63;
00043     float wallSeed2 = (float) rand() / RAND_MAX * 63;
00044     int wallStart = (int) (wallSeed1 + 0.5);
00045     int wallEnd = (int) (wallSeed2 + 0.5);    
00046     wallsStart[wall] = wallStart;
00047     wallsEnd[wall] = wallEnd + wallStart;
00048     if ((wallsEnd[wall] - wallsStart[wall]) > 110) {
00049         generateWall(wall);    
00050     } 
00051 }
00052 
00053 bool updatePosition() {
00054     if (jsy > 0.7 && carVel < 8) {
00055         carVel += 1;
00056     } else if (jsy < 0.3 && carVel > 0) {
00057         carVel -= 1;
00058     }
00059     if (jsx > 0.55 && (carScrPosX - 4) >= 0) {
00060         int delta = (int) (jsx / 0.95 * 8 +  0.5);
00061         if (((carScrPosX - 4) - delta) >= 0) {
00062             carScrPosX -= delta;
00063         }
00064     } else if (jsx < 0.45 && (carScrPosX + 4) <= 127) {
00065         int delta = (int) ((1 - jsx) / 0.95 * 8 +  0.5);
00066         if (((carScrPosX + 4) + delta) <= 127) {
00067             carScrPosX += delta;
00068         }
00069     }
00070     odo += carVel;
00071     wallsY[0] += carVel;
00072     wallsY[1] += carVel;
00073     wallsY[2] += carVel;
00074     //Check collision
00075     for (int i = 0; i < 3; i++) {
00076         if (wallsY[i] > 127) {
00077             wallsY[i] = 0;
00078             generateWall(i);
00079             uLCD.cls();
00080             redraw = true;
00081         }
00082         if ((carScrPosX - 4) > wallsEnd[i] || (carScrPosX + 4) < wallsStart[i] 
00083             || (carScrPosY - 5) > (wallsY[i] + wallThickness) 
00084             || (carScrPosY + 5) < wallsY[i]) {
00085             //pc.printf("No Collision\n");    
00086             Thread::wait(33);
00087         } else {
00088             //pc.printf("Crash\n");    
00089             return false;
00090         }
00091     }
00092     return true;      
00093 } 
00094  
00095 void playSound() {
00096     //setup PWM hardware for a Class D style audio output
00097     PWMout.period(1.0/400000.0);
00098     while (true) {
00099         FILE *fp = fopen("/sd/Skrillex_Diplo.wav", "r");
00100         if(fp == NULL) {
00101             error("Could not open file for read\n");
00102         }
00103         player.play(fp);
00104         fclose(fp);
00105         Thread::wait(500);
00106     }
00107     
00108 }
00109 
00110 int main() {
00111     audioThread.start(playSound);
00112     uLCD.baudrate(3000000); //jack up baud rate to max for fast display    
00113     uLCD.media_init();
00114     uLCD.set_sector_address(0x003B, 0x5600);
00115     uLCD.display_image(0,0);
00116     uLCD.printf("Welcome to Random\nHorizons 3\nThrottle Up!\n(Push Forward)");
00117     generateWall(0);
00118     generateWall(1);
00119     generateWall(2);
00120     int oldCarPosX = carScrPosX;
00121     int oldWallsY[3] = {wallY1, wallY2, wallY3};
00122     while (jsy < 0.95) Thread::wait(33);
00123     uLCD.cls();
00124     uLCD.printf("Controls:\nUp (Accel.)\nDown (Brake)\nLeft (Left)\n");
00125     uLCD.printf("Right (Right)\nDodge the Walls!!\n");
00126     Thread::wait(5000);
00127     uLCD.cls();
00128     do {
00129         if (oldCarPosX != carScrPosX || redraw) {
00130             uLCD.filled_rectangle(oldCarPosX - 4, carScrPosY - 5, 
00131                 oldCarPosX + 4, carScrPosY + 5, BLACK);
00132             uLCD.filled_rectangle(carScrPosX - 4, carScrPosY - 5, 
00133                 carScrPosX + 4, carScrPosY + 5, BLUE);
00134             uLCD.filled_rectangle(carScrPosX - 1, carScrPosY - 3, 
00135                 carScrPosX + 2, carScrPosY + 3, WHITE);
00136             redraw = false;
00137         }
00138         for (int i = 0; i < 3; i++) {
00139             if (oldWallsY[i] != wallsY[i]) {
00140                 uLCD.filled_rectangle(wallsStart[i], oldWallsY[i], 
00141                     wallsEnd[i], oldWallsY[i] + wallThickness, BLACK);
00142                 uLCD.filled_rectangle(wallsStart[i], wallsY[i], 
00143                     wallsEnd[i], wallsY[i] + wallThickness, RED);
00144                 oldWallsY[i] = wallsY[i];
00145             }
00146         }
00147         oldCarPosX = carScrPosX;
00148     } while (updatePosition() && odo <= 1280);
00149     
00150     if (odo >= 1280) {
00151         uLCD.text_string("YOU WON!", 0, 0, FONT_7X8, WHITE);
00152     } else {
00153         uLCD.set_sector_address(0x003B, 0x5641);
00154         uLCD.display_image(0,0);
00155         uLCD.text_string("Crashed:\nGAME OVER", 0, 0, FONT_7X8, WHITE);
00156     }
00157 }