This is test version of Pokemongo game. ELEC 2645 final project.

Dependencies:   Tone

main.cpp

Committer:
shalwego
Date:
2021-04-15
Revision:
0:819c2d6a69ac

File content as of revision 0:819c2d6a69ac:


///////////// includes /////////////////////
#include "mbed.h"
#include "platform/mbed_thread.h"
#include "Joystick.h"
#include "N5110.h"
#include "ShiftReg.h"  
#include "PokeEngine.h"
#include "Utils.h"
//#include <cstdlib>
#include "Tone.h"
///////////// defines /////////////////////
#define PADDLE_WIDTH 2
#define PADDLE_HEIGHT 8
#define BALL_SIZE 2
#define BALL_SPEED 3
///////////// objects ///////////////////
N5110 lcd(p14,p8,p9,p10,p11,p13,p21);
Joystick joystick(p20,p19);
DigitalIn buttonA(p29);
BusOut leds(LED4,LED3,LED2,LED1);
ShiftReg seven_seg;
AnalogIn pot(p17); 
PokeEngine poke;
Tone dac(p18);
///////////// prototypes ///////////////////
void init();
void welcome();
void render();
void gameover();
void display_lives(int lives);

const int note_background []= {
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
};

const int duration_background[] = {
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
};
/*
const int duration_array[] = {
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
    4,4,8,8,8,8,
    
    4,8,8,4,4,
    4,8,8,4,4,
    4,4,8,8,8,8,
};

const int note_array[] = {
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_A3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
    
    NOTE_FS3, NOTE_FS3, NOTE_CS4, NOTE_B3, NOTE_A3,
    NOTE_GS3, NOTE_GS3, NOTE_GS3, NOTE_B3, NOTE_A3, NOTE_GS3,
    NOTE_FS3, NOTE_FS3, NOTE_A4, NOTE_GS4, NOTE_A4, NOTE_GS4, NOTE_A4,
};
*/
//volatile int g_gameover_flag = 0;
//void gameover_isr();

int main() {

    init();
    welcome(); 
    render();
    int fps = 10;
    int lives = 4;
    //poke.check_lives(lives);
    display_lives(lives);
     while (lives != 0) {  // keep looping while lives remain
        // read the joystick input and store in a struct
        UserInput input = {joystick.get_direction(),joystick.get_mag()};
        lives = poke.update(input);   // update the game engine based on input
        printf("lives = %d ", lives);
        display_lives(lives);         // display lives on LEDs    
        render();                     // draw frame on screen
        thread_sleep_for(1000/fps);         // and wait for one frame period - ms
        }
    //int n = sizeof(note_array)/sizeof(int);
    //dac.play_melody(n,note_array,duration_array,72.0,true);
    gameover();
/*    while (1) {

        // check if flag is set i.e. interrupt has occured
        if (g_timer_flag) {
            g_timer_flag = 0;  // if it has, clear the flag
            printf("Tick \n");
            // DO TASK HERE
        }

        // put the MCU to sleep until an interrupt wakes it up
        sleep();

    }*/
    
}

void init() {
    lcd.clear();
    seven_seg.write(0x00);  // turn of 7-seg display
    lcd.init();
    lcd.setContrast(0.4);
    joystick.init();
    dac.init();

    poke.init(70,10,5,20,10,3,2);
    poke.init_rocket(50,40,4,2);
}

void welcome() { // splash screen
    lcd.printString("  Pokemon go!    ",0,1);  
    lcd.printString("    Press A   ",0,4);
    lcd.refresh();
    //t n_background = sizeof(note_background)/sizeof(int);
    //c.play_melody(n_background,note_background,duration_background,72.0,true);
        while (buttonA.read() == 0) {
        leds = 0b1111;
        thread_sleep_for(100);
        leds = 0b0000;
        thread_sleep_for(100);   
    }
}

void render() {  // clear screen, re-draw and refresh
    lcd.clear();  
    poke.draw(lcd);
    lcd.refresh();
}
    
void display_lives(int lives) {
    if (lives == 4) {
        leds = 0b1111;
        seven_seg.write(0x66);
    } else if (lives == 3) {
        leds = 0b1110;
        seven_seg.write(0x4F);
    } else if (lives == 2) {
        leds = 0b1100;
        seven_seg.write(0x5B);
    } else if (lives == 1) {
        leds = 0b1000;
        seven_seg.write(0x06);
    } else {
        leds = 0b0000;
        seven_seg.write(0x3F);
    }
}

void gameover() { // splash screen 
    //for (int i = 1; i < 10; i++) {
    while(1){      
        lcd.clear();
        int score = poke.get_score();
        char char_score = score + '0';
       // char *char_score = new char[2];
        //for (int i = 0; i < 2; i++){
        // char_score[i] = score;}
        lcd.printString("  Game Over ",0,0);  
        lcd.printString(" Your score: ",0,2);
        lcd.printChar(char_score,42,4);
        lcd.refresh();
        leds = 0b1111;
        thread_sleep_for(250);
        lcd.clear();
        lcd.refresh();
        leds = 0b0000;
        thread_sleep_for(250);   
    }
}

/*void gameover_isr()
{
    g_gameover_flag = 1;   // set flag in ISR
}*/