Stick_Runner

Dependencies:   FXOS8700CQ Gamepad N5110 SDFileSystem mbed

Fork of Stick_Runner by Samrudh Sharma

main.cpp

Committer:
el15ss
Date:
2017-05-02
Revision:
2:98a41609c827
Parent:
1:db9ff66f67c8
Child:
3:0c690f1c04d8

File content as of revision 2:98a41609c827:

/*****************************************************
        Libraries and modules used                   *
******************************************************/
#include "mbed.h"
#include "Gamepad.h"
#include "N5110.h"
#include "Character.h"
#include "Obstacles.h"
#include "Gems.h"
#include "SDFileSystem.h"


#define No_OBS 8
#define No_GEMS 4

int i,j,counter,highScore;
 char score[50];

//Structs
struct UserInput {
    Direction d;
    float mag;
};
/*            Class Objects                         */
N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Gamepad pad;
Character c;
Obstacles obstacle[No_OBS];
Gems gems[No_GEMS],g;

SDFileSystem sd(PTE3,PTE1,PTE2,PTE4,"sd");
FILE *file;


/*            Function Prototypes                    */
void init();
void update_game(UserInput input);
void render();
void welcome();
void menu();
void over();
void Instructions();


/*            Functions                              */

int main()
{
    int fps = 8;  
 
/*            Intialization                           */
    init();
    
/*      Drawing the intial frame                      */    
    welcome();
    wait(1.0f/fps);

    
  
    render();  
    wait(1.0f/fps);  

/*   Main game loop to read input, render the display and update the game state            */
    // game loop - read input, update the game state and render the display
    while (1) {
         
        counter++;
        
        c.updateCharacter(pad.get_direction(),pad.get_mag());
        if(pad.check_event(Gamepad::BACK_PRESSED))
        {
            lcd.clear(); 
            lcd.refresh(); 
            menu();
        }
        
        for(i=0;i<No_OBS;i++)
        {
            obstacle[i].obstacleStatus(obstacle[i].getObstaclePos());
            
            if(obstacle[i].getObstacleStatus() == false)
            {
                obstacle[i].init();
            }
                c.characterStatus(obstacle[i].getObstaclePos());
              //  obstacle[i].obstacleStatus(c.getCharacterPos());
                
        }
        
         
        for(j=0;j<No_GEMS;j++)
        {
            gems[j].gemStatus(c.getCharacterPos());
            
            if(gems[j].getGemStatus() == false)
            {
                gems[j].init();
                
            }
            
          
        }
        
        //To make the obstacles and gems move along the screen 
        i =0;
        
        for(i=0;i<No_OBS;i++)
        {
              obstacle[i].updateObstacle();
        }
         
        
        j =0;
        
        for(j=0;j<No_GEMS;j++)
        {
               gems[j].updateGems();
              
        }
            
        render();
       
        wait(1.0f/fps);
    }
}

void init()
{
   
    lcd.init();
    pad.init();
    c.init();
    
    for(i=0;i<No_OBS;i++)
    {
       obstacle[i].init();
    }

    for(j=0;j<No_GEMS;j++)
    {
       gems[j].init();
    }
     
   

}

void render()
{
    
    lcd.clear();  
    
     if(c.getCharacterStatus())
     {  
        c.draw(lcd);
     }
     
      if(c.getCharacterStatus() == false)
   {
      over();
   }
   
   
    //obstacle[i].draw(lcd);
    
    for(i=0;i<No_OBS;i++)
    {
       if(obstacle[i].getObstacleStatus())
       {
          obstacle[i].draw(lcd);
       }
    }
            
        
   for(j=0;j<No_GEMS;j++)
    {
      if(gems[j].getGemStatus())
      { 
         gems[j].draw(lcd);
        
      }
      
      /*else{
         counter++;
      }*/
               
    }
      
            
  
   
   
    lcd.refresh();

}


void welcome() {
    
   
    
    lcd.printString("Stick Runner!    ",0,1);  
    lcd.printString(" Press Start ",0,4);
    lcd.refresh();
    // pad.tone(1500.0,0.5);
    //pad.tone(1500.0,0.5);
      
     
   
    while ( pad.check_event(Gamepad::START_PRESSED) == false) 
    {
        pad.leds_on();
        wait(0.1);
        pad.leds_off();
        wait(0.1);
       
    }
 menu();
}

void over() {
    
    pad.init();
   // lcd.clear();
    sd.mount();
   
    
    sprintf (score, " Score : %d",counter);

    lcd.printString(score,0,2);
    lcd.printString("GAME  OVER!!  ",0,0);  
    //lcd.printString("     ",0,1);
    
    file = fopen("/sd/scoreFile.txt", "r");
    if(file ==NULL)
    {
        file = fopen("/sd/scoreFile.txt", "w");
        fprintf(file,"%d",counter);
        fclose(file);
         lcd.printString("HIGH SCORE",0,3);
        
    }
    else{
            fscanf(file,"%d", &highScore);
            fclose(file);
            
            if(counter>highScore)
            {
                
                file = fopen("/sd/scoreFile.txt", "w");
        fprintf(file,"%d",counter);
        fclose(file);
         lcd.printString("HIGH SCORE",0,3);
            }
        
        }
        
   
    lcd.printString(" PRESS START  ",0,4);  
    
    lcd.refresh();
    sd.unmount();
     
    
    while ( pad.check_event(Gamepad::START_PRESSED) == false) {
        pad.leds_on();
        //pad.tone(1000.0,0.5);
        wait(0.1);
        pad.leds_off();
       // pad.tone(1000.0,0.5);
        wait(0.1);
        if( pad.check_event(Gamepad::START_PRESSED)) {
            main();
            wait(1);
            }
    }
 
}

void displayHighScore()
{
    sd.mount();
    lcd.clear();
      
   
     file = fopen("/sd/scoreFile.txt", "r");
     if(file ==NULL)
    {
        highScore = 0;
        
    }
    else{
            fscanf(file,"%d", &highScore);
            fclose(file);
        
        } 
        
    sprintf (score, "High Score : %d",highScore);

    lcd.printString(score,0,2);
    lcd.printString(" START - reset  ",0,4); 
    lcd.printString(" BACK - menu   ",0,5);  
      lcd.refresh();
      sd.unmount();
      
      while(1)
      {
          if( pad.check_event(Gamepad::START_PRESSED)) {
             sd.mount();
             file = fopen("/sd/scoreFile.txt", "r");
            if(!file ==NULL)
                {
                    fclose(file);
                     remove("/sd/scoreFile.txt");
                      
                }
                 sd.unmount();
                    displayHighScore();
            
            }
            
             if( pad.check_event(Gamepad::BACK_PRESSED)) {
                        menu();
            }
            
            sleep();
          
      }
    
       
}

void menu() {
    int fps =8;
     bool i = true;
    while(i == true)
    {
        lcd.clear();
    lcd.printString("     Menu       ",0,0);  
    lcd.printString("A)New Game     ",0,2);
    lcd.printString("B)Continue     ",0,3);
    lcd.printString("X)Instructions ",0,4);
    lcd.printString("Y)High Score   ",0,5);
    
    lcd.refresh();
     
    // wait flashing LEDs until start button is pressed 
     if( pad.check_event(Gamepad::A_PRESSED) ) {
       //pad.tone(1000.0,0.5);
       i = false;
        lcd.clear();
       lcd.refresh();
       init();
       
        //break;
    }
    
   else if( pad.check_event(Gamepad::B_PRESSED) ) {
       //lcd.clear();
       // pad.tone(1000.0,0.5);
       i = false;
       lcd.refresh();
       
       
    }
    
    else if( pad.check_event(Gamepad::X_PRESSED) ) {
      // pad.tone(1000.0,0.5);
      Instructions();
         wait(1.0f/fps);
       i = false;
    }
    
    else if( pad.check_event(Gamepad::Y_PRESSED) ) {
      // pad.tone(1000.0,0.5);
      displayHighScore();
         wait(10.0f/fps);
       i = false;
    }
    
    
 }
}

void Instructions()
{
     bool i = true;
     lcd.clear();
       lcd.printString("INSTURCTIONS:     ",0,0);  
       lcd.printString("Collect the       ",0,2);
       lcd.printString("gems and dodge    ",0,3);
       lcd.printString("the obstacles     ",0,4);
       lcd.printString("to get points     ",0,5);
       lcd.refresh();
       
       while(i == true){
        
        if( pad.check_event(Gamepad::BACK_PRESSED) ) {
             //pad.tone(1000.0,0.5);
            i = false;
      menu();
    }
      }
    
    }