Project Submission (late)

Dependencies:   mbed

main.cpp

Committer:
el17tc
Date:
2019-05-10
Revision:
2:43bb635db736
Parent:
1:12c5c593f64a
Child:
3:83e79d31930c

File content as of revision 2:43bb635db736:

#include "mbed.h"
#include "Gamepad.h"
#include "N5110.h"
#include "Maze.h"
#include "Vector2Di.h"
#include "Player.h"
#include "Drawer.h"
#include "MainMenu.h"
#include "DefeatMenu.h"
#include "VictoryMenu.h"

N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Gamepad gamepad;

void buttonPressedUp() {
    if (currentMenu->buttonIndex > 0) {
        currentMenu->buttonIndex -= 1;   
        currentButton = currentMenu->buttons[currentMenu->buttonIndex];
    }
    printf("currentMenu->buttonIndex = %d\n", currentMenu->buttonIndex);
}

void buttonPressedDown() {
    if (currentMenu->buttonIndex < (currentMenu->numOfButtons - 1)) {
        currentMenu->buttonIndex += 1;
        currentButton = currentMenu->buttons[currentMenu->buttonIndex];
    }
    printf("currentMenu->buttonIndex = %d\n", currentMenu->buttonIndex);
}

Ticker arrowFlicker;
Ticker ingameCounter;
bool arrowFlickFlag = 1;
int ingameTime;

void drawTimer() {
    lcd.drawRect(1,1,20,8,FILL_WHITE);
    std::stringstream ss;
    ss << ingameTime;
    std::string timeStr = "Time:" + ss.str();
    lcd.printString(timeStr.c_str(), 1,0);
}
void timerFunc() {
    if (timerFlag)
        ingameTime--;
    else
        ingameTime++;
}
void selectionArrowFunc() {
    arrowFlickFlag = !arrowFlickFlag;
};


int main() {
    gamepad.init();
    lcd.init();
    lcd.setContrast(0.5);
    lcd.normalMode();
    lcd.setBrightness(0.5);
    
    arrowFlicker.attach(&selectionArrowFunc,0.9);
    currentMenu = new MainMenu(&lcd);
    
    // program loop - never exits
    while (true) {
        // menu loop
        gamepad.check_event(Gamepad::START_PRESSED); // consume trailing input from last loop
        while (true) {
          
          if (gamepad.check_event(Gamepad::A_PRESSED)) {
            buttonPressedDown();
          }
          if (gamepad.check_event(Gamepad::Y_PRESSED)) {
            buttonPressedUp();
          }
          if (gamepad.check_event(Gamepad::X_PRESSED)) {
            currentButton->runBack();
            gamepad.check_event(Gamepad::X_PRESSED); // consume second input if it appeared
          }
          if (gamepad.check_event(Gamepad::B_PRESSED)) {
            currentButton->run();
            gamepad.check_event(Gamepad::B_PRESSED); // consume second input if it appeared
          }
          if (gamepad.check_event(Gamepad::START_PRESSED)) {
            currentButton->run();
            gamepad.check_event(Gamepad::START_PRESSED); // consume second input if it appeared
          }
          if (gamepad.check_event(Gamepad::BACK_PRESSED)) {
            delete currentMenu;
            currentMenu = new MainMenu(&lcd);
          }
          
          lcd.clear();
          currentMenu->draw();
          
          if (arrowFlickFlag)
            lcd.drawSprite((currentButton->x)-2,(currentButton->y),7,4, (int *)selectArrow2);
          
          lcd.refresh();
          if (beginFlag) {
            beginFlag = false;
            printf("begin flag is true\n");
            break;
          }
          sleep();
        }
        delete currentMenu;

        Maze maze;
        Player player(&maze);
        maze.selectMaze(mazeSize);
        player.pos.x = maze.startX;
        player.pos.y = maze.startY;
        Drawer drawer(&player, &lcd);
    
        if (timerFlag)
          ingameTime = maze.timeToFinish;
        else
          ingameTime = 0;
        ingameCounter.attach(&timerFunc, 1);
        arrowFlicker.detach();
        bool winFlag = false;
    
        // Main game loop
        while (true) {
            if (gamepad.check_event(Gamepad::Y_PRESSED)) {
                if (player.checkLocation(player.pos, 0, 2)) {
                    winFlag = true;
                }
                player.walk();
                wait(0.2);
                if (gamepad.check_event(Gamepad::Y_PRESSED)) {
                    printf("walked but input fired twice\n");
                }
            }
            if (gamepad.check_event(Gamepad::X_PRESSED)) {
                player.turnLeft();
                wait(0.2);
                if (gamepad.check_event(Gamepad::X_PRESSED)) {
                    printf("turned left but input fired twice\n");
                }
            }
            if (gamepad.check_event(Gamepad::B_PRESSED)) {
                player.turnRight();
                wait(0.2);
                if (gamepad.check_event(Gamepad::B_PRESSED)) {
                    printf("turned right but input fired twice\n");
                }
            }
            if (gamepad.check_event(Gamepad::A_PRESSED)) {
                player.stepBack();
                wait(0.2);
                if (gamepad.check_event(Gamepad::A_PRESSED)) {
                    printf("stepped back but input fired twice\n");
                }
            }
            if (gamepad.check_event(Gamepad::R_PRESSED)) {
                player.turnRight();
                wait(0.2);
                if (gamepad.check_event(Gamepad::R_PRESSED)) {
                    printf("turned right but input fired twice\n");
                }
            }
            if (gamepad.check_event(Gamepad::L_PRESSED)) {
                player.turnLeft();
                wait(0.2);
                if (gamepad.check_event(Gamepad::L_PRESSED)) {
                    printf("turned left but input fired twice\n");
                }
            }
            
            if (winFlag) {
                printf("Player has escaped the maze\n");
                // player has won, end the game loop
                winFlag = false;
                currentMenu = new VictoryMenu(&lcd);
                if (timerFlag) {
                    currentMenu->score = maze.timeToFinish + (ingameTime * 2);
                } else {
                    currentMenu->score = maze.timeToFinish + ((maze.timeToFinish*10)/ingameTime);
                }
                break;
            }
            if (timerFlag && (ingameTime <= 0)) {
                printf("Player has ran out of time\n");
                // player has lost, end the game loop
                currentMenu = new DefeatMenu(&lcd);
                currentMenu->score = 0;
                break;
            }
            printf("========\n");
            
            lcd.clear();
            drawer.drawScreen();
            drawTimer();
            lcd.refresh();
            
            sleep();
        }
    
        arrowFlicker.attach(&selectionArrowFunc,0.9);
        gamepad.check_event(Gamepad::START_PRESSED);
        while (true) {
          if (gamepad.check_event(Gamepad::B_PRESSED)) {
            buttonPressedDown();
          }
          if (gamepad.check_event(Gamepad::X_PRESSED)) {
            buttonPressedUp();
          }
          if (gamepad.check_event(Gamepad::A_PRESSED)) {
            //buttonActivate(*currentButton);
          }
          if (gamepad.check_event(Gamepad::START_PRESSED)) {
            currentButton->run();
          } 
          lcd.clear();
          currentMenu->draw();
          if (arrowFlickFlag) {
                lcd.drawSprite((currentButton->x)-2,(currentButton->y),7,4, 
                (int *)selectArrow2);
          }
          if (restartFlag) {
            restartFlag = false;
            delete currentMenu;
            currentMenu = new StartMenu(&lcd);
            break;
          }
          if (menuFlag) {
            menuFlag = false;
            delete currentMenu;
            currentMenu = new MainMenu(&lcd);
            break;
          }
          lcd.refresh();
          sleep();
        }
    }
}