Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

classes/FishEngine.cpp

Committer:
el18a2k
Date:
2021-03-24
Revision:
5:02e7b5197827
Parent:
4:db929dab4f13
Child:
6:7aafcaf7cbe2

File content as of revision 5:02e7b5197827:

#include "FishEngine.h"

#define UP 0
#define DOWN 1
#define CENTRE 2

//attach
BusOut RGB_led(p24,p23,p22); //RGB bus MSB - LSB, inverted logic 1 = low
DigitalIn button_A(p29);
DigitalIn button_B(p28);
DigitalIn button_C(p27);
DigitalIn button_D(p26);

//objects
ShiftReg shift;
Graphics graphics;

//initialise all of the board
void FishEngine::system_init(N5110 &lcd, Tone &dac, Joystick &joystick){
    lcd.init();
    lcd.setBrightness(0.5);
    joystick.init();
    dac.init();
    shift.write(0x00);
    RGB_led.write(0b111);
    button_A.mode(PullNone);
    button_B.mode(PullNone);
    button_C.mode(PullNone);
    button_D.mode(PullNone);
}

// creates intro sequence
void FishEngine::titleSequence(N5110 &lcd){
    lcd.clear();
    graphics.titleScreen(lcd); //prints titlescreen (held in graphics.h)
    lcd.refresh();
    wait_ms(2000);
        
    while(button_A.read() == 0){
        lcd.clear();
        graphics.confirmationScreen(lcd); //calls confirmation function (held in graphics.h)
        lcd.refresh();
        wait_ms(1000/10);
    }
        
    graphics.screenFlash(lcd); //calls screen flash function (held in graphics.h)
    lcd.refresh();
}

// creates the games main menu screen with scrolling ability through the use of a 
// state machine.
void FishEngine::mainMenu(N5110 &lcd, Tone &dac, Joystick &joystick){
    const int Fish_1[4][9]= {
        { 1,0,0,1,1,1,1,1,0, },
        { 1,1,1,1,1,1,1,0,1, },
        { 1,1,1,1,1,1,1,1,1, },
        { 1,0,0,1,1,1,1,1,0, },
    };
    
    // outputs for the state machine are used to draw Fish_1 beside the corrosponding 
    // menu choice 
    int g_menu_output[4] = {10, 18, 26, 34};
    int state = 0; //set inital state to 0
    int direction = CENTRE; //set inital direction to remain on that state until an input is received
    int y_pos;
    
    while(1){
        lcd.clear();
        lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
        
        //prints players options
        lcd.printString("New Game", 15, 1);
        lcd.printString("High Score", 15, 2);
        lcd.printString("How to Play", 15, 3);
        lcd.printString("Settings", 15, 4);
        
        
        /*implementation of state machine allows the determination of the position of the fish marker
        based on the users joystick input:
        
                     inputs
        state     0     1   2  where 0 is UP and 1 is DOWN 2 is CENTRE
        
        0         3     1   0
        1         0     2   1   
        2         1     3   2
        3         2     0   3  */   
        
        
        if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP
            direction = UP;
        }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN
            direction = DOWN;
        }else{
            direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE
        };
        
        y_pos = g_menu_output[state];//y_position is the array output at position 'state'
        
        
        //implement state machine
        switch(state) {
            
            //case for new game
            case 0:
                if(button_A.read()){
                    gamePlay(lcd,dac);
                }
                switch(direction) {
                    case UP:
                        state = 3;
                        break;
                    case DOWN:
                        state = 1;
                        break;
                    case CENTRE: 
                        state = 0;
                        break;
                }
                break;
                
            //case for HighScore
            case 1:
                if(button_A.read()){
                    highScore(lcd);
                }
                switch(direction) {
                    case UP:
                        state = 0;
                        break;
                    case DOWN:
                        state = 2;
                        break;
                    case CENTRE: 
                        state = 1;
                        break;
                }
                break;
                
            //case for how to play    
            case 2:
                if(button_A.read()){
                    Instructions(lcd);
                }
                switch(direction) {
                    case UP:
                        state = 1;
                        break;
                    case DOWN:
                        state = 3;
                        break;
                    case CENTRE: 
                        state = 2;
                        break;
                }
                break;
                
            //case for settings    
            case 3:
                if(button_A.read()){
                    Settings(lcd, dac, joystick);    
                }
                switch(direction) {
                    case UP:
                        state = 2;
                        break;
                    case DOWN:
                        state = 0;
                        break;
                    case CENTRE: 
                        state = 3;
                        break;
                    
                }
                break;
            default:
                state = 0;
                break;
        }
        
        //draw sprite at position (3, y_pos)
        lcd.drawSprite(3, y_pos, 4, 9, (int*)Fish_1);
        lcd.refresh();
        wait_ms(500);
    }
}

// function for game play
void FishEngine::gamePlay(N5110 &lcd, Tone &dac){
    graphics.screenFlash(lcd);
    
    do{
        lcd.clear();
        lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
        lcd.printString(" Play game", 10, 2);
        lcd.refresh();
        wait_ms(1000/10);
    }while(button_B.read() == false);
}

//function for viewing high score
void FishEngine::highScore(N5110 &lcd){
    graphics.screenFlash(lcd);
    
    do{
        lcd.clear();
        lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
        lcd.printString(" High score", 10, 2);
        lcd.refresh();
        wait_ms(1000/10);
    }while(button_B.read() == false);
}

//function for providing instruction on how to play
void FishEngine::Instructions(N5110 &lcd){
    graphics.screenFlash(lcd);
    
    do{
        lcd.clear();
        lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
        lcd.printString(" How to play", 10, 2);
        lcd.refresh();
        wait_ms(1000/10);
    }while(button_B.read() == false);
}

//functions for changing settings
void FishEngine::Settings(N5110 &lcd, Tone &dac, Joystick &joystick){
    graphics.screenFlash(lcd);
    RGB_led.write(0b101);
    int rect_width = 32;
    const int rightArrow[6][3] =   {
            { 1,0,0, },
            { 1,1,0, },
            { 1,1,1, },
            { 1,1,1, },
            { 1,1,0, },
            { 1,0,0, },
    };
    
    // outputs for the state machine are used to draw Fish_1 beside the corrosponding 
    // menu choice 
    int g_setting_menu_output[2] = {7, 37};
    int state = 0; //set inital state to 0
    int direction = CENTRE; //set inital direction to remain on that state until an input is received
    int x_pos;

    do{
        lcd.clear();        
        lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
        lcd.printString("Contrast", 15, 1);
        lcd.printString("Music", 15, 3);
        lcd.printString("On", 15, 4);
        lcd.printString("Off", 45, 4);
        
        if(joystick.get_direction() == E && rect_width < 64){
            rect_width = rect_width + 16;
        }else if(joystick.get_direction() == W && rect_width > 0){
            rect_width = rect_width - 16;
        }
        
        //contrast bar is 20 pixels high and 64 pixels long
        lcd.drawRect(10,16,64,5,FILL_TRANSPARENT); //draws outer rectangle
        lcd.drawRect(10,16,rect_width,5,FILL_BLACK); //draws inner rectangle
                    
        if(rect_width == 0){
            lcd.setBrightness(0.3);
            
        }else if(rect_width == 16){
            lcd.setBrightness(0.4);
            
        }else if(rect_width == 32){
            lcd.setBrightness(0.5);
            
        }else if(rect_width == 48){
            lcd.setBrightness(0.6);
            
        }else if(rect_width == 64){
            lcd.setBrightness(0.7);
        } 
        
        /*implementation of state machine allows the determination of the position of the arrow marker
        based on the users joystick input:
        
                     inputs
        state     0     1   2  where 0 is UP and 1 is DOWN 2 is CENTRE
        
        0         1     1   0
        1         0     0   1 */
        
        if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP
            direction = UP;
        }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN
            direction = DOWN;
        }else{
            direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE
        };
        
        x_pos = g_setting_menu_output[state];//x_position is the array output at position 'state'
        
        
        //implement state machine
        switch(state) {
            //case for music on
            case 0:
                if(button_A.read()){
                    RGB_led.write(0b101);
                }
                switch(direction) {
                    case UP:
                        state = 1;
                        break;
                    case DOWN:
                        state = 1;
                        break;
                    case CENTRE: 
                        state = 0;
                        break;
                }
                break;
                
            //case for music off
            case 1:
                if(button_A.read()){
                    RGB_led.write(0b110);
                }
                switch(direction) {
                    case UP:
                        state = 0;
                        break;
                    case DOWN:
                        state = 0;
                        break;
                    case CENTRE: 
                        state = 1;
                        break;
                }
                break;
                
            default:
                state = 0;
                break;
        }
        
         //pos / sprite x y / x  y
        lcd.drawSprite(x_pos,32,6,3,(int*)rightArrow);
        lcd.refresh();

        wait_ms(1000/10);
    }while(button_B.read() == false);
}