contains my game for the embedded systems project 2645

Dependencies:   mbed FXOS8700CQQQ

GameEngine/RocketRacer.cpp

Committer:
OmarAlebiary
Date:
2019-05-07
Revision:
40:13b8467526d0
Parent:
33:24ef796ff2c8

File content as of revision 40:13b8467526d0:

#include "RocketRacer.h"

// create object and specifiy pins
FXOS8700CQ device(I2C_SDA,I2C_SCL);

//default constructor of the class and initializing the private variables
RocketRacer::RocketRacer()
:first_enemy_position(0),second_enemy_position(0),enemy_phase(0),
game_speed (0),score(0),pitchAngle(0.0),Init_position(2),enemy_dead(true),control(true)
{}

//destructor of the class
RocketRacer::~RocketRacer(){
}

/////////setters/////////////////

//sets the enemy position
void RocketRacer::set_first_position(int first_enemy_position) {
 first_enemy_position = first_enemy_position;
}

//sets the second enemy position
void RocketRacer::set_second_position(int second_enemy_position) {
 second_enemy_position = second_enemy_position;
}


void RocketRacer::set_enemy_phase(int enemy_phase) {
 enemy_phase = enemy_phase;
}

//sets the game speed
void RocketRacer::set_game_speed(int game_speed) {
 game_speed = game_speed;
}

//sets the game score
void RocketRacer::set_game_score(int score) {
 score = score;
}

//sets the flag enemy_dead
void RocketRacer::set_enemy_dead(bool enemy_dead) {
 enemy_dead = enemy_dead;
}

//sets the flag control
void RocketRacer::set_control(bool control) {
 control = control;
}

//sets the initial position
void RocketRacer::set_init_position(int Init_position) {
 Init_position = Init_position;
}

/////////Game Methods/////////////////

void RocketRacer::Main_Game_Display(N5110 &lcd){
    
    lcd.clear(); //clears the lcd 
    lcd.drawRect(0,0,46,47,FILL_BLACK);//draws a transparent rectangle on the lcd
    char score_buffer[14];//buffer to store the score 
    char score_buffer1[14];
    char level_buffer[14];//buffer to store the current level 
    char level_buffer1[14];  
    //display score
    sprintf(score_buffer,"score");
    lcd.printString(score_buffer,55,0);
    sprintf(score_buffer1,"%d",score);
    lcd.printString(score_buffer1,58,1);
    lcd.drawLine(15, 2, 15,48,0);
    lcd.drawLine(30, 2, 30,48,0);
    //display level
    sprintf(level_buffer,"Level");
    lcd.printString(level_buffer,55,3);
    sprintf(level_buffer1,"%d",game_speed);
    lcd.printString(level_buffer1,58,4);
    lcd.refresh();//refreshes the lcd to render   
}


void RocketRacer::accelerometer_position(Gamepad &pad){
    
    pitchAngle = device.get_pitch_angle();//gets the pitch angle
    //statement to check if the gamepad rolled to the right
    if( (pitchAngle > 100)&& Init_position!=3 && control==true){
        Init_position++;//increments the position of the player sprite 
        control = false; //sets the flag to false
        wait(0.1);// small delay to prevent previous press being detected again
//        printf("its Right\n");
    }
    //statement to check if the gamepad rolled to the left
    else if( (pitchAngle < 90 )&& Init_position!=1 && control==true){
        Init_position--;//decrements the position of the player sprite
        control = false;//sets the flag to false
        wait(0.01);// small delay to prevent previous press being detected again
//        printf("its left\n");
    }
    else {//statement to check if the joystick position is center
        control = true;//sets the flag to true
        wait(0.01);
//        printf("its center\n");
        }    
}


void RocketRacer::Joystick_position(Gamepad &pad){
    //assigning d to the method to get the joystick direction  
    Direction d=pad.get_direction();

    if( (d==E||pad.check_event(Gamepad::R_PRESSED) == true )
     && Init_position!=3 && control==true){//statement to check if the joystick moved right
        Init_position++;//increments the position of the player sprite 
        control = false; //sets the flag to false
        wait(0.09);// small delay to prevent previous press being detected again
//        printf("its Right\n");
    }
    else if( (d==W ||pad.check_event(Gamepad::L_PRESSED) == true )
    && Init_position!=1 && control==true){//statement to check if the joystick moved left
        Init_position--;//decrements the position of the player sprite
        control = false;//sets the flag to false
        wait(0.01);// small delay to prevent previous press being detected again
//        printf("its left\n");
    }
    else if(d==CENTRE){//statement to check if the joystick position is center
        control = true;//sets the flag to true
        wait(0.01);
//        printf("its center\n");
        }
}





void RocketRacer::Generate_New_Enemy(){
  
  srand(time(NULL));//seeding the random function
  
  if (enemy_dead){//statement to check if the enemy crossed the player sprite 
    first_enemy_position = Init_position;//places the first enemy above the player's sprite  
    second_enemy_position = (rand() % 3)+1;//generates a random number from 1 to 3 
    //printf("%d",second_enemy_position);
    enemy_phase = 0; 
    enemy_dead = false;
    }
}

   
void RocketRacer::Check_Enemy_Dead(N5110 &lcd,Gamepad &pad){
     //statement to check if the enemies collided with the rocket         
     if (enemy_phase>23 && ((first_enemy_position== Init_position)
      || (second_enemy_position == Init_position)) ){ 
         End_Game(pad,lcd);//calls the end game method that displays game over screen
           
     }
     if (enemy_phase>39){//statement to check if the enemies crossed without colliding with the rocket 
         enemy_dead = true;
         score++;//increments the score
     }
}
 
    
void RocketRacer::Game_Loop_accelerometer(N5110 &lcd,Gamepad &pad){
    
    lcd.clear(); //clears the lcd
    //calls the method to get the joystick direction according to the user
    accelerometer_position(pad);
    //calls the method to draw the sprites according to accelerometer postion
    player_position(lcd,Init_position);  
    Generate_One_Enemy();//generate 1 new enemy
    //places the first enemy according to the position
    enemy_position(lcd,first_enemy_position, enemy_phase);
    enemy_phase++;//increments the current phase of the enemy
    //places the second enemy according to the position
    enemy_position(lcd,second_enemy_position, enemy_phase);
    enemy_phase++;//increments the current phase of the enemy
    
    Check_Enemy_Dead(lcd,pad);//checks if enemies crossed the rocket
    
    Game_difficulty(pad); //adds difficulty to the game 
    
    lcd.refresh();//refreshes the screen
}


void RocketRacer::Generate_One_Enemy(){
  
  srand(time(NULL));//seeding the random function
  
  if (enemy_dead){//statement to check if the enemy crossed the player sprite  
    second_enemy_position = (rand() % 3)+1;//generates a random number from 1 to 3 
    //printf("%d",second_enemy_position);
    enemy_phase = 0; 
    enemy_dead = false;
    }
}

    
void RocketRacer::Game_Loop(N5110 &lcd,Gamepad &pad){
    lcd.clear(); //clears the lcd
    
    Joystick_position(pad);//calls the method to get the joystick direction according to the user
    player_position(lcd,Init_position);//calls the method to draw the sprites according to joystick postion
    
    Generate_New_Enemy();//generate 2 new enemies
    
    enemy_position(lcd,first_enemy_position, enemy_phase);//places the first enemy according to the position
    enemy_phase++;//increments the current phase of the enemy
    enemy_position(lcd,second_enemy_position, enemy_phase);//places the second enemy according to the position
    enemy_phase++;//increments the current phase of the enemy
    
    Check_Enemy_Dead(lcd,pad);//checks if enemies crossed the rocket
    
    Game_difficulty(pad); //adds difficulty to the game 
    
    lcd.refresh();//refreshes the screen
}


//adds difficulty to the game after proceeding with each level
void RocketRacer::Game_difficulty(Gamepad &pad){
     if (score>=0 && score<=5){
        pad.led(1,1.0); game_speed = 1;//first led on to indicate level 1 
         wait(0.09);//reduces the wait on each level
    }if (score>5 && score<=10){
      pad.led(2,1.0); game_speed = 2;//first&second leds on to indicate level 2
         wait(0.07);
    }if (score>10 && score<=20){
        pad.led(3,1.0); game_speed = 3;//1,2,3 leds on to indicate level 3 
        wait(0.06); 
    }if (score>20 && score<=25){//1,2,3,4 leds on to indicate level 4 
        pad.led(4,1.0); game_speed = 4; 
        wait(0.05); 
    }if (score>25 && score<=30){//1,2,3,4,5 leds on to indicate level 5 
        pad.led(5,1.0); game_speed = 5; 
        wait(0.04); 
    }if (score>30){//all 6 leds on to indicate level 6 
       pad.led(6,1.0); game_speed = 6;
        wait(0.03);
    }
}


void RocketRacer::enemy_position(N5110 &lcd,int place, int phase){
  
  if (place==1){//draws the enemy sprite at position 1
      lcd.drawSprite(3,phase,11,9,(int *)enemy);
      }
  
  if (place==2){//draws the enemy sprite at position 2
      lcd.drawSprite(19,phase,11,9,(int *)enemy);
      }
  
  if (place==3){//draws the enemy sprite at position 3
      lcd.drawSprite(35,phase,11,9,(int *)enemy);
      }
      lcd.refresh();
  
}


void RocketRacer::player_position(N5110 &lcd,char RocketPosition){
  
  Main_Game_Display(lcd);//displays the game screen
  
  if (RocketPosition==1){//places the rocket at positon 1   
      lcd.drawSprite(3,34,11,9,(int *)rocket);
      }
  if (RocketPosition==2){//places the rocket at positon 2
      lcd.drawSprite(19,34,11,9,(int *)rocket);
      }
  if (RocketPosition==3){//places the rocket at positon 3
      lcd.drawSprite(35,34,11,9,(int *)rocket);
      }
      lcd.refresh();
}


void RocketRacer::End_Game(Gamepad &pad,N5110 &lcd){
    
    lcd.clear();
    char buffer1[14];
    //prints the gameover to the lcd with the score achieved
    lcd.printString("Game over!!!",5,0);
    lcd.printString("Better Luck ",2,1);
    lcd.printString("next time",2,2);
    lcd.printString("High score:",2,3);
    sprintf(buffer1,"%d",score);
    lcd.printString(buffer1,20,4); 
    
    pad.leds_on();//turns all leds on    
    lcd.refresh();
    tones.End_Game_Melody(pad); //calling tones object to play melody
    
    
    wait(50);
    
}