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(); } } }