![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
ECE 4180 Lab 4 Racing Game
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player_appbd
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 }
Generated on Fri Jul 15 2022 07:05:35 by
![doxygen](doxygen.png)