Joshua O'hara 201291390

Dependencies:   mbed

main.cpp

Committer:
josh_ohara
Date:
2020-05-25
Revision:
40:35f27f0e7833
Parent:
37:90a0671d2ba7
Child:
41:648a271fbbc0

File content as of revision 40:35f27f0e7833:

/* 
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;
    _counter = 0;
    _level = 1;
    _armada_life = true;
    _ship_life = true;
    
    hardware_init();
    start_menu();
    select_difficulty();
    
    _number_of_aliens = 5 + 5*_difficulty;
    
    draw_game();
    wait(1.0f/_fps);
    
    while(1){
        hardware_init();
        game_init();
        next_level(_level);
        //printf("  level ==  %2d",level);
        
        while(1) {
            SpaceInvader.read_input(pad);
            SpaceInvader.update(pad, lcd, _counter, _level);
            draw_game();
            wait(1.0f/_fps);
            _counter++;
            _ship_life = SpaceInvader.get_ship_life();
            if(_ship_life == false){
                game_over(_level);
            }    
            _armada_life = SpaceInvader.get_armada_life(); 
            if(_armada_life == false){
                break;
            }
        }
        SpaceInvader.kill_all();
        _level++;
        //printf("   counter =  %2d",counter);
    }
}

void start_menu() 
{
    lcd.printString("Space Invaders",0,1);  
    lcd.printString("  Press Start ",0,4);
    lcd.refresh();
    
    while(pad.start_pressed() == false) {
        lcd.setContrast( pad.read_pot1());
        pad.leds_on();
        wait(0.1);
        pad.leds_off();
        wait(0.1);
    }
}

void draw_game()
{
    lcd.clear();
    SpaceInvader.render(lcd);
    lcd.refresh();
}

void hardware_init()
{ 
    lcd.init();
    pad.init();
}
void game_init()
{
    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)
{
    lcd.clear();
    
    while(1){
        lcd.printString("   Game Over",0,0);  
        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)
{
    lcd.clear();
    char buffer_[14];
    sprintf(buffer_,"   Level %2d",level);
    lcd.printString(buffer_,0,2);
    lcd.refresh();
    wait(2);
    lcd.clear();
}
  
void select_difficulty()
{
    _difficulty = 1;
    bool select_ = 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);
    }
}