Joshua O'hara 201291390

Dependencies:   mbed

main.cpp

Committer:
josh_ohara
Date:
2020-05-26
Revision:
41:648a271fbbc0
Parent:
40:35f27f0e7833
Child:
42:816e444e660b

File content as of revision 41:648a271fbbc0:

/* 
ELEC2645 Embedded Systems Project
School of Electronic & Electrical Engineering
University of Leeds
2019/20

Name: Joshua O'hara
Username: el18jkeo
Student ID Number: 201291390
Date: 11.03.2020
*/
// includes
#include "mbed.h"
#include "Gamepad.h"
#include "N5110.h"
#include "SpaceInvaderEngine.h"

#define SHIP_WIDTH 9
#define SHIP_HEIGHT 2
#define ALIEN_SIZE 3
#define ROW_SIZE 3
#define COLUMN_SIZE 5
#define COVER_Y 38
#define COVER1_X 9
#define COVER2_X 34
#define COVER3_X 59
#define ROCK_NUMBER 10

// objects
Gamepad pad;
N5110 lcd;
SpaceInvaderEngine SpaceInvader;

// structs
struct UserInput {
    Direction d;
    float mag;
};
    
//functions
void hardware_init();
void game_init();
void draw_game();
void start_menu();
void game_over(int level);
void next_level(int level);
void select_difficulty();
//variables
int _fps;
int _counter;
int _level;
int _difficulty;
int _number_of_aliens;
bool _armada_life;
bool _ship_life;

Direction direction;

int main()
{
    _fps = 6;                                                                   //set frames per second
    _counter = 0;                                                               //game loop counter set to 0 
    _level = 1;                                                                 //level set
    _armada_life = true;                                                        //armada life flag set 
    _ship_life = true;                                                          //ship life flag set
    
    hardware_init();                                                            //initialise gamepad hardware
    start_menu();                                                               //show player the start menu
    select_difficulty();                                                        //show player the difficulty select menu
    
    _number_of_aliens = 5 + 5*_difficulty;                                      //number of aliens increases with difficulty
    
    draw_game();                                                                //draw initial game
    wait(1.0f/_fps);                                                            //wait frame rate
    
    while(1){                                                                   //MAIN LOOP
        hardware_init();                                                        //initialise hardware
        game_init();                                                            //initialise game engine
        next_level(_level);                                                     //show level on screen
        //printf("  level ==  %2d",level);
        
        while(1) {                                                              //LEVEL LOOP
            SpaceInvader.read_input(pad);                                       //read player pad input
            SpaceInvader.update(pad, lcd, _counter, _level);                    //update engine
            draw_game();                                                        //draw updated game
            wait(1.0f/_fps);                                                    //wait frame rate
            _counter++;                                                         //increment counter to show 1 loop completed
            _ship_life = SpaceInvader.get_ship_life();                          //get the ship life 
            if(_ship_life == false){                                            //display game over menu if ship life is false (ship has died)
                game_over(_level);
            }    
            _armada_life = SpaceInvader.get_armada_life();                      //get armada life
            if(_armada_life == false){                                          //break from level loop and progress to next level if armada is dead
                break;
            }
        }
        SpaceInvader.kill_all();                                                //kill all remaining objects from this level
        _level++;                                                               //increment level
        //printf("   counter =  %2d",counter);
    }
}

void start_menu() 
{
    lcd.printString("Space Invaders",0,1);                                      //display start menu
    lcd.printString("  Press Start ",0,4);
    lcd.refresh();
    
    while(pad.start_pressed() == false) {                                       //shows start menu until player presses start
        lcd.setContrast( pad.read_pot1());                                      //set contrast with pad
        pad.leds_on();                                                          //flash LEDs
        wait(0.1);
        pad.leds_off();
        wait(0.1);
    }
}

void draw_game()                                                                //draws game engine
{
    lcd.clear();                                                                //clear previous frame
    SpaceInvader.render(lcd);                                                   //load new frame
    lcd.refresh();                                                              //display new frame
}

void hardware_init()
{ 
    lcd.init();                                                                 //initialise hardware
    pad.init();
}
void game_init()                                                                //initialise game engine and subclasses
{
    SpaceInvader.init(SHIP_HEIGHT,SHIP_WIDTH,ALIEN_SIZE,_number_of_aliens,COLUMN_SIZE,ROW_SIZE,COVER_Y,COVER1_X,COVER2_X,COVER3_X,ROCK_NUMBER,_level);   
}

void game_over(int level)                                                       //game over menu function
{
    lcd.clear();
    
    while(1){
        lcd.printString("   Game Over",0,0);                                    //display game over and level until player resets game
        char buffer_[14];
        sprintf(buffer_,"   Level %2d",level);
        lcd.printString(buffer_,0,2);       
        lcd.printString("  Press reset ",0,4);
        lcd.refresh();
    }
}

void next_level(int level)                                                      //next level function
{
    lcd.clear();                                                                //displays upcoming level number
    char buffer_[14];
    sprintf(buffer_,"   Level %2d",level);
    lcd.printString(buffer_,0,2);
    lcd.refresh();
    wait(2);
    lcd.clear();
}
  
void select_difficulty()                                                        //select difficulty function
{
    _difficulty = 1;                                                            //initialise difficulty to 1
    bool select_ = false;                                                       //initialise select flag to false
    
    while(select_ == false){
        lcd.clear();
        lcd.printString("  Easy",0,0);
        lcd.printString("  Medium",0,2);
        lcd.printString("  Hard",0,4);
        
        if(_difficulty == 1){
            lcd.drawRect(0,0,3,3,FILL_BLACK);
        }
        if(_difficulty == 2){
            lcd.drawRect(0,16,3,3,FILL_BLACK);
        }
        if(_difficulty == 3){
            lcd.drawRect(0,32,3,3,FILL_BLACK);
        }
        lcd.refresh();
        wait(1);
        
        while(1){    
            direction = pad.get_direction();
            if(pad.A_pressed()==true){
                select_ = true;
                break;
                }
            if((_difficulty==1)&&
            (direction==N)){
                _difficulty = 3;
                break;  
            }
            if((_difficulty==1)&&
            (direction==S)){
                _difficulty = 2;
                break;
            }
            if((_difficulty==2)&&
            (direction==N)){
                _difficulty = 1; 
                break;  
            }
            if((_difficulty==2)&&
            (direction==S)){
                _difficulty = 3;
                break;
            }
            if((_difficulty==3)&&
            (direction==N)){
                _difficulty = 2;
                break;
            }
            if((_difficulty==3)&&
            (direction==S)){
                _difficulty = 1;
                break;
            }
        }
        //printf("   difficulty %2d",direction);
    }
}