Zeyu Feng 201377605

Dependencies:   mbed

On Minerva

Interface/Interface.cpp

Committer:
el19zf
Date:
2020-05-22
Revision:
22:cded0cd8e1c9
Parent:
20:a36ab1560e73

File content as of revision 22:cded0cd8e1c9:

#include  "Interface.h"

State fsm_5[5] = {
    {0,{4,1}},
    {1,{0,2}},
    {2,{1,3}},
    {3,{2,4}},
    {4,{3,0}}
};
// point to option
const int pointer[3][2] = {
    {1,0},
    {1,1},
    {1,0}
};

Interface::Interface()
{
    
}

Interface::~Interface()
{
    
}

void Interface::init()
{
    _menu_flag = 0;
    _defined_rate_flag = 0;
    _defined_max_flag = 0;
    _gameover_flag = 0;
    _count_down = 18;
    _victory_flag = 0;
    _sim_flag = 0;//simple game flag
}


void Interface::Welcome(N5110 &lcd,Gamepad &pad)
{
    // initialise record
    _record.x = 0;
    _record.y = 0;
    // start game after pressing the start botton
    while (!pad.start_pressed()) 
    {
        lcd.clear();
        lcd.printString("   Welcome!   ",0,1);
        lcd.printString("   Game by    ",0,2);
        lcd.printString("   Z. FENG    ",0,3);
        lcd.setContrast( pad.read_pot1());// control the contrast of screen
        lcd.drawRect(0,44,int(pad.read_pot1()*WIDTH),2,FILL_BLACK);// shows the contrast of gamepad by a black rectangle
        //printf("WIDTH of contrast = %d, contrast = %f\n",(int)pad.read_pot1()*WIDTH,pad.read_pot1());
        lcd.refresh();
        pad.leds_on();
        wait(0.1);
        pad.leds_off();
        wait(0.1);
    }
    _sound.menu_sound(pad);
}

void Interface::menu(N5110 &lcd,Gamepad &pad)
{
    while (!pad.A_pressed())
    {
        lcd.clear();
        lcd.printString("     MENU",0,0);
        lcd.printString("        Start",0,1);
        lcd.printString("   Start(Hell)",0,2);
        lcd.printString("  user-defined",0,3);
        lcd.printString("   Instruction",0,4);
        lcd.printString("       Record",0,5);
        _d = pad.get_direction();
        // in order to easily control Joystick, pointer move upward in a large angle
        if(_d == N||_d ==NE||_d==NW){
            _menu_flag = fsm_5[_menu_flag].next_state[0];
        } else if(_d == S||_d==SE||_d==SW){
            _menu_flag = fsm_5[_menu_flag].next_state[1];
        }
        lcd.drawSprite(0,8*_menu_flag+10,3,2,(int*)pointer); 
        lcd.refresh();
        pad.leds_on();   
        wait(0.3);
        //printf("A_pressed\n");
    }
    _sound.begin_sound(pad);        
}

void Interface::undefined_rate(N5110 &lcd,Gamepad &pad)
{
    pad.tone(10,0.05);
    pad.set_bpm(0);
    pad.reset_buttons();
    while (!pad.A_pressed())
    {
        lcd.clear();
        lcd.printString("  shots/frames",0,0);
        lcd.printString("       0.3",0,1);
        lcd.printString("       0.4",0,2);
        lcd.printString("       0.5",0,3);
        lcd.printString("       0.6",0,4);
        lcd.printString("       0.7",0,5);
        _d = pad.get_direction();
        if(_d == N||_d ==NE||_d==NW){
            _defined_rate_flag = fsm_5[_defined_rate_flag].next_state[0];
        } else if(_d == S||_d==SE||_d==SW){
            _defined_rate_flag = fsm_5[_defined_rate_flag].next_state[1];
        }
        lcd.drawSprite(20,8*_defined_rate_flag+10,3,2,(int*)pointer); 
        lcd.refresh();
        pad.leds_on();   
        wait(0.3);
    }
}


void Interface::undefined_max(N5110 &lcd,Gamepad &pad)
{
    pad.reset_buttons();
    while (!pad.A_pressed())
    {
        lcd.clear();
        lcd.printString("   Max.shots",0,0);
        lcd.printString("       15",0,1);
        lcd.printString("       20",0,2);
        lcd.printString("       25",0,3);
        lcd.printString("       30",0,4);
        lcd.printString("       35",0,5);
        _d = pad.get_direction();
        if(_d == N||_d ==NE||_d==NW){
            _defined_max_flag = fsm_5[_defined_max_flag].next_state[0];
        } else if(_d == S||_d==SE||_d==SW){
            _defined_max_flag = fsm_5[_defined_max_flag].next_state[1];
        }
        lcd.drawSprite(20,8*_defined_max_flag+10,3,2,(int*)pointer); 
        lcd.refresh();
        pad.leds_on();   
        wait(0.3);
    }
    _sound.begin_sound(pad);
}


void Interface::game_over(N5110 &lcd,Gamepad &pad)
{
    _sound.over_sound(pad);
    lcd.clear();
    pad.init();
    while(!pad.B_pressed()){
        lcd.printString("  Game over   ",0,1);
        lcd.printString("  Press B to  ",0,2);
        lcd.printString("  try again?  ",0,3);
        lcd.refresh();
        wait(0.1);
        //printf("Not press B\n");
    }
    _gameover_flag = 1;
}

int Interface::check_pause(N5110 &lcd,Gamepad &pad,int paused_flag, float increment, int max)
{
    if(pad.start_pressed()){
        paused_flag = 1;
        sprintf(_buffer1,"  %.1f shots/s",increment*6);
        sprintf(_buffer2,"  with Max.%d ",max);
    }
        //printf("start press\n");
    while(paused_flag == 1){
        lcd.clear();
        _timer.stop();
        lcd.printString("Paused",23,0);
        lcd.printString(_buffer1,0,2);
        lcd.printString(_buffer2,0,3);
        lcd.refresh();
        if(pad.start_pressed())
            paused_flag = 0;
    }
    _timer.start();
    return paused_flag;
}

void Interface::count_down(N5110 &lcd)
{
    char buffer[6];
    sprintf(buffer,"%d",int(_count_down/6));
    lcd.printString(buffer,40,2);
    //printf("count: %d\n",_count_flag);
    _count_down--;
}

void Interface::update_record(float increment,int max)
{
    if(increment > _record.x||(int(increment)==int(_record.x)&& max > _record.y)){
        _record.x = increment;
        _record.y = max;
    }
}

void Interface::record(N5110 &lcd,Gamepad &pad)
{
    lcd.clear();
    pad.init();
    pad.tone(10,0.05);
    pad.set_bpm(0);
    sprintf(_buffer1,"  %.1f shots/s",_record.x*6);
    sprintf(_buffer2,"  with Max.%.0f ",_record.y);
    while(!pad.B_pressed()){
        lcd.printString("Record",23,0);
        lcd.printString(_buffer1,0,1);
        lcd.printString(_buffer2,0,2);
        lcd.printString(" Press B back ",0,4);
        lcd.printString("   to menu   ",0,5);
        lcd.refresh();
        wait(0.1);
    }
}

void Interface::victory(N5110 &lcd,Gamepad &pad)
{
    _sound.vict_sound(pad);
    lcd.clear();
    pad.init();
    while(!pad.B_pressed()){
        lcd.printString("   Victory!  ",0,1);
        lcd.printString(" Press B back ",0,2);
        lcd.printString("   to menu   ",0,3);
        lcd.refresh();
        wait(0.1);
    }
    _victory_flag = 1;
}

void Interface::simple_game(N5110 &lcd,Gamepad &pad)
{
    lcd.clear();
    pad.init();
    while(!pad.A_pressed()){
        lcd.printString("  DO YOU WANT ",0,1);
        lcd.printString(" MAKE IT EASY? ",0,2);
        lcd.printString("  PRESS A to",0,3);
        lcd.printString("  try again! ",0,4);
        lcd.refresh();
        wait(0.1); 
    }
    _sim_flag = 1;
    _sound.count_sound(pad);
}

void Interface::set_count_down(int count_down)
{
    _count_down = count_down;
}

int Interface::get_menu_flag()
{
    return _menu_flag;
}

int Interface::get_rate_flag()
{
    return _defined_rate_flag;
}

int Interface::get_max_flag()
{
    return _defined_max_flag;
}

int Interface::get_sim_flag()
{
    //printf("Get simple_flag %d\n",_sim_flag);
    return _sim_flag;
}

int Interface::get_gameover_flag()
{
     return _gameover_flag;
}

int Interface::get_victory_flag()
{
    return _victory_flag;
}