Yudong Xiao / Mbed OS pokemon

Dependencies:   Tone

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 ///////////// includes /////////////////////
00003 #include "mbed.h"
00004 #include "platform/mbed_thread.h"
00005 #include "Joystick.h"
00006 #include "N5110.h"
00007 #include "ShiftReg.h"  
00008 #include "PokeEngine.h"
00009 #include "Utils.h"
00010 //#include <cstdlib>
00011 #include "Tone.h"
00012 ///////////// defines /////////////////////
00013 #define PADDLE_WIDTH 2
00014 #define PADDLE_HEIGHT 8
00015 #define BALL_SIZE 2
00016 #define BALL_SPEED 3
00017 ///////////// objects ///////////////////
00018 N5110 lcd(p14,p8,p9,p10,p11,p13,p21);
00019 Joystick joystick(p20,p19);
00020 DigitalIn buttonA(p29);
00021 BusOut leds(LED4,LED3,LED2,LED1);
00022 ShiftReg seven_seg;
00023 AnalogIn pot(p17); 
00024 PokeEngine poke;
00025 Tone dac(p18);
00026 ///////////// prototypes ///////////////////
00027 void init();
00028 void welcome();
00029 void render();
00030 void gameover();
00031 void display_lives(int lives);
00032 
00033 const int note_background []= {
00034     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00035     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00036     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00037     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00038     
00039     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00040     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00041     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00042     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00043     
00044     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00045     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00046     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00047     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00048     
00049     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00050     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00051     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00052     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00053     
00054     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00055     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00056     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00057 };
00058 
00059 const int duration_background[] = {
00060     4,8,8,4,4,
00061     4,8,8,4,4,
00062     4,4,8,8,8,8,
00063     4,4,8,8,8,8,
00064     
00065     4,8,8,4,4,
00066     4,8,8,4,4,
00067     4,4,8,8,8,8,
00068     4,4,8,8,8,8,
00069     
00070     4,8,8,4,4,
00071     4,8,8,4,4,
00072     4,4,8,8,8,8,
00073     4,4,8,8,8,8,
00074     
00075     4,8,8,4,4,
00076     4,8,8,4,4,
00077     4,4,8,8,8,8,
00078     4,4,8,8,8,8,
00079     
00080     4,8,8,4,4,
00081     4,8,8,4,4,
00082     4,4,8,8,8,8,
00083 };
00084 /*
00085 const int duration_array[] = {
00086     4,8,8,4,4,
00087     4,8,8,4,4,
00088     4,4,8,8,8,8,
00089     4,4,8,8,8,8,
00090     
00091     4,8,8,4,4,
00092     4,8,8,4,4,
00093     4,4,8,8,8,8,
00094     4,4,8,8,8,8,
00095     
00096     4,8,8,4,4,
00097     4,8,8,4,4,
00098     4,4,8,8,8,8,
00099     4,4,8,8,8,8,
00100     
00101     4,8,8,4,4,
00102     4,8,8,4,4,
00103     4,4,8,8,8,8,
00104     4,4,8,8,8,8,
00105     
00106     4,8,8,4,4,
00107     4,8,8,4,4,
00108     4,4,8,8,8,8,
00109 };
00110 
00111 const int note_array[] = {
00112     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00113     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00114     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00115     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00116     
00117     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00118     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00119     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00120     NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00121     
00122     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00123     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00124     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00125     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00126     
00127     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00128     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00129     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00130     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00131     
00132     NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
00133     NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
00134     NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
00135 };
00136 */
00137 //volatile int g_gameover_flag = 0;
00138 //void gameover_isr();
00139 
00140 int main() {
00141 
00142     init();
00143     welcome(); 
00144     render();
00145     int fps = 10;
00146     int lives = 4;
00147     //poke.check_lives(lives);
00148     display_lives(lives);
00149      while (lives != 0) {  // keep looping while lives remain
00150         // read the joystick input and store in a struct
00151         UserInput input = {joystick.get_direction(),joystick.get_mag()};
00152         lives = poke.update(input);   // update the game engine based on input
00153         printf("lives = %d ", lives);
00154         display_lives(lives);         // display lives on LEDs    
00155         render();                     // draw frame on screen
00156         thread_sleep_for(1000/fps);         // and wait for one frame period - ms
00157         }
00158     //int n = sizeof(note_array)/sizeof(int);
00159     //dac.play_melody(n,note_array,duration_array,72.0,true);
00160     gameover();
00161 /*    while (1) {
00162 
00163         // check if flag is set i.e. interrupt has occured
00164         if (g_timer_flag) {
00165             g_timer_flag = 0;  // if it has, clear the flag
00166             printf("Tick \n");
00167             // DO TASK HERE
00168         }
00169 
00170         // put the MCU to sleep until an interrupt wakes it up
00171         sleep();
00172 
00173     }*/
00174     
00175 }
00176 
00177 void init() {
00178     lcd.clear();
00179     seven_seg.write(0x00);  // turn of 7-seg display
00180     lcd.init();
00181     lcd.setContrast(0.4);
00182     joystick.init();
00183     dac.init();
00184 
00185     poke.init(70,10,5,20,10,3,2);
00186     poke.init_rocket(50,40,4,2);
00187 }
00188 
00189 void welcome() { // splash screen
00190     lcd.printString("  Pokemon go!    ",0,1);  
00191     lcd.printString("    Press A   ",0,4);
00192     lcd.refresh();
00193     //t n_background = sizeof(note_background)/sizeof(int);
00194     //c.play_melody(n_background,note_background,duration_background,72.0,true);
00195         while (buttonA.read() == 0) {
00196         leds = 0b1111;
00197         thread_sleep_for(100);
00198         leds = 0b0000;
00199         thread_sleep_for(100);   
00200     }
00201 }
00202 
00203 void render() {  // clear screen, re-draw and refresh
00204     lcd.clear();  
00205     poke.draw(lcd);
00206     lcd.refresh();
00207 }
00208     
00209 void display_lives(int lives) {
00210     if (lives == 4) {
00211         leds = 0b1111;
00212         seven_seg.write(0x66);
00213     } else if (lives == 3) {
00214         leds = 0b1110;
00215         seven_seg.write(0x4F);
00216     } else if (lives == 2) {
00217         leds = 0b1100;
00218         seven_seg.write(0x5B);
00219     } else if (lives == 1) {
00220         leds = 0b1000;
00221         seven_seg.write(0x06);
00222     } else {
00223         leds = 0b0000;
00224         seven_seg.write(0x3F);
00225     }
00226 }
00227 
00228 void gameover() { // splash screen 
00229     //for (int i = 1; i < 10; i++) {
00230     while(1){      
00231         lcd.clear();
00232         int score = poke.get_score();
00233         char char_score = score + '0';
00234        // char *char_score = new char[2];
00235         //for (int i = 0; i < 2; i++){
00236         // char_score[i] = score;}
00237         lcd.printString("  Game Over ",0,0);  
00238         lcd.printString(" Your score: ",0,2);
00239         lcd.printChar(char_score,42,4);
00240         lcd.refresh();
00241         leds = 0b1111;
00242         thread_sleep_for(250);
00243         lcd.clear();
00244         lcd.refresh();
00245         leds = 0b0000;
00246         thread_sleep_for(250);   
00247     }
00248 }
00249 
00250 /*void gameover_isr()
00251 {
00252     g_gameover_flag = 1;   // set flag in ISR
00253 }*/