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

main.cpp

Committer:
kferri6
Date:
2016-10-31
Revision:
0:b1c6f91ae4e2

File content as of revision 0:b1c6f91ae4e2:

#include <mbed.h>
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include <rtos.h>
#include <graphics.h>




//define joystick
DigitalIn up(p12);
DigitalIn fire(p13);
DigitalIn left(p14);
DigitalIn down(p15);
DigitalIn right(p16);

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);


//define uLCD
uLCD_4DGL ulcd(p9,p10,p11);




//define sd card reader
 SDFileSystem sd(p5, p6, p7, p8, "sd");




//define speaker
AnalogOut DACout(p18);
wave_player waver(&DACout);




//Mutex for uLCD
Mutex uLCD_mutex;


FILE *wave_file;


Samus samus;
Gunshot gunshot;
Metroid metroid;




bool GameOver=0;


bool dFormula(int ux, int uy, int mx, int my)
{
    double ans,dx,dy;
    dx = mx-ux;
    dy = my-uy;
    ans = sqrt((dx*dx)+(dy*dy));
    if(ans<=8) return 1;
    else return 0;
}





void sound(void const *args){
        while(true){
            wave_file=fopen("/sd/brinstar.wav", "r");
            led1 =1;
            waver.play(wave_file);
            led2 = 1;
            fclose(wave_file);
            Thread::wait(500);
        }
}


int main(){
    Thread soundthread(sound);
    Thread::wait(1000);
    int score = 0;
    up.mode(PullUp);
    fire.mode(PullUp);
    left.mode(PullUp);
    right.mode(PullUp);
    down.mode(PullUp);
    Thread::wait(25);
    ulcd.filled_rectangle(samus.xpos,samus.ypos,samus.xpos-4,samus.ypos-samus.currentheight,0xFFA500);
    ulcd.filled_circle(118, 8, 3, RED);
    ulcd.filled_circle(108, 8, 3, RED);
    ulcd.filled_circle(98, 8, 3, RED);
//     while(1);
    while(!GameOver){
        ulcd.locate(0,0);
        ulcd.printf("Score: %i", score);
        if(samus.isJumping){
            samus.prevypos = samus.ypos;
            samus.prevxpos = samus.xpos;
            if(samus.jump<5){
                samus.ypos -= 3;
                samus.jump += 1;
                ulcd.filled_rectangle(samus.prevxpos+1,samus.prevypos,samus.prevxpos-5,samus.prevypos-samus.height, BLACK);
                
            }
            else if(samus.jump<10){
                samus.ypos += 3;
                samus.jump += 1;
                ulcd.filled_rectangle(samus.prevxpos+1,samus.prevypos,samus.prevxpos-5,samus.prevypos-samus.height, BLACK);
            }
            else{
                samus.jump = 0;
                samus.isJumping = 0;
            }
        }
        ulcd.filled_rectangle(samus.xpos,samus.ypos,samus.xpos-4,samus.ypos-samus.currentheight,0xFFA500);
        
        if((up==0) && (!samus.crouch))
            samus.isJumping = 1;
        if(down==0 && (!samus.isJumping)){
            samus.crouch = !samus.crouch;
            if (samus.crouch==1){
            samus.currentheight=samus.crouchheight;
            ulcd.filled_rectangle(samus.xpos,samus.ypos,samus.xpos-4,samus.ypos-samus.height, BLACK);
            ulcd.filled_rectangle(samus.xpos,samus.ypos,samus.xpos-4,samus.ypos-samus.currentheight,0xFFA500);
            }
            else{
                samus.currentheight=samus.height;
           }
        }
        if(right==0){
            samus.prevxpos=samus.xpos;
            samus.xpos=samus.xpos+1;
            ulcd.filled_rectangle(samus.prevxpos, samus.prevypos, samus.prevxpos-4, samus.prevypos-samus.currentheight, BLACK);
            ulcd.filled_rectangle(samus.xpos,samus.ypos,samus.xpos-4,samus.ypos-samus.currentheight,0xFFA500);
            }


        if(left==0){
            samus.prevxpos=samus.xpos;
            samus.xpos=samus.xpos-1;
            ulcd.filled_rectangle(samus.prevxpos, samus.prevypos, samus.prevxpos-4, samus.prevypos-samus.currentheight, BLACK);
            ulcd.filled_rectangle(samus.xpos,samus.ypos,samus.xpos-4,samus.ypos-samus.currentheight,0xFFA500);
            }




        if((fire==0)&&(!gunshot.isOnScreen)){
            gunshot.isOnScreen = 1;
            gunshot.xpos=samus.xpos;
            gunshot.ypos=samus.ypos-(samus.currentheight*.5);
            gunshot.prevxpos=gunshot.xpos;
            gunshot.prevypos=gunshot.ypos;
}




        for(int j=0; j<3;j++){
            if((rand()%30 == 1)&&(!metroid.isAlive[j])){
                metroid.isAlive[j] = 1;
                metroid.xpos[j]=0;
                metroid.ypos[j]=(123-(rand()%15));
                ulcd.filled_circle(metroid.xpos[j], metroid.ypos[j], metroid.radius, WHITE);
            }
        }




        if (gunshot.xpos<=0){
            gunshot.isOnScreen=0;
            ulcd.filled_circle(gunshot.xpos, gunshot.ypos, gunshot.radius, BLACK);
        }
        if (gunshot.isOnScreen){
            ulcd.filled_circle(gunshot.xpos, gunshot.ypos, gunshot.radius, BLACK);
            gunshot.Move();
            ulcd.filled_circle(gunshot.xpos, gunshot.ypos, gunshot.radius, BLUE);
            }



        for(int j =0; j<3; j++){
            if ((dFormula(gunshot.xpos,gunshot.ypos,metroid.xpos[j],metroid.ypos[j])) && (metroid.isAlive[j]) && (gunshot.isOnScreen)){
                metroid.isAlive[j]=0;
                gunshot.isOnScreen=0;
                score++;
                ulcd.filled_circle(gunshot.xpos, gunshot.ypos, gunshot.radius, BLACK);
                ulcd.filled_circle(metroid.xpos[j], metroid.ypos[j], metroid.radius, BLACK);
                }
        }




        for(int j =0; j<3; j++){
            if (metroid.isAlive[j]){
                ulcd.filled_circle(metroid.xpos[j],metroid.ypos[j],metroid.radius,BLACK);
                metroid.Move(j);
                ulcd.filled_circle(metroid.xpos[j],metroid.ypos[j],metroid.radius,WHITE);
            }
        }

        for(int j =0; j<3; j++){
            if ((metroid.isAlive[j]) && (metroid.xpos[j]>=128)){
                metroid.isAlive[j] = 0;
                ulcd.filled_circle(metroid.xpos[j],metroid.ypos[j],metroid.radius,BLACK);
            }
        }



        for(int j =0; j<3; j++){
        if ((dFormula(samus.xpos-2,samus.ypos-.5*samus.currentheight,metroid.xpos[j],metroid.ypos[j])) && metroid.isAlive[j]){
            metroid.isAlive[j] = 0;
            ulcd.filled_circle(metroid.xpos[j],metroid.ypos[j],metroid.radius,BLACK);
            samus.health=samus.health-1;}
        }
        if (samus.health==2)
            ulcd.filled_circle(118, 8, 3, BLACK);
        else if (samus.health==1)
            ulcd.filled_circle(108, 8, 3, BLACK);
        if(samus.health==0){
            GameOver=1;
            soundthread.terminate();
        }
}
DACout = 0.0;
Thread::wait(50);
ulcd.cls();
//ulcd.media_init();
//ulcd.set_sector_address(0x0000, 0x0000);
//ulcd.display_image(0,0);
ulcd.printf("Game Over");
Thread::wait(3000);
ulcd.cls();

FILE *fp = fopen("/sd/highscore.txt", "rw");  // open the file in 'read' mode
char c[1];
//string sc;
fgets(c,1,fp);                         // get a character/byte from the file

if(score > atoi(c)){
    ulcd.printf("You Beat the High Score\nYour Score: %i",score);
    sprintf(c,"%d",score);
    fprintf(fp,c);}
else
    ulcd.printf("You Did Not Beat the High Score\nHigh Score: %c",c);
fclose(fp); 
}