Project Submission (late)

Dependencies:   mbed

Committer:
el17tc
Date:
Fri May 10 10:51:19 2019 +0000
Revision:
2:43bb635db736
Parent:
1:12c5c593f64a
Child:
3:83e79d31930c
final version, ready for API documentation;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17tc 0:72f372170a73 1 #include "mbed.h"
el17tc 0:72f372170a73 2 #include "Gamepad.h"
el17tc 0:72f372170a73 3 #include "N5110.h"
el17tc 0:72f372170a73 4 #include "Maze.h"
el17tc 0:72f372170a73 5 #include "Vector2Di.h"
el17tc 0:72f372170a73 6 #include "Player.h"
el17tc 0:72f372170a73 7 #include "Drawer.h"
el17tc 0:72f372170a73 8 #include "MainMenu.h"
el17tc 2:43bb635db736 9 #include "DefeatMenu.h"
el17tc 2:43bb635db736 10 #include "VictoryMenu.h"
el17tc 0:72f372170a73 11
el17tc 0:72f372170a73 12 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
el17tc 2:43bb635db736 13 Gamepad gamepad;
el17tc 2:43bb635db736 14
el17tc 2:43bb635db736 15 void buttonPressedUp() {
el17tc 2:43bb635db736 16 if (currentMenu->buttonIndex > 0) {
el17tc 2:43bb635db736 17 currentMenu->buttonIndex -= 1;
el17tc 2:43bb635db736 18 currentButton = currentMenu->buttons[currentMenu->buttonIndex];
el17tc 2:43bb635db736 19 }
el17tc 2:43bb635db736 20 printf("currentMenu->buttonIndex = %d\n", currentMenu->buttonIndex);
el17tc 2:43bb635db736 21 }
el17tc 2:43bb635db736 22
el17tc 2:43bb635db736 23 void buttonPressedDown() {
el17tc 2:43bb635db736 24 if (currentMenu->buttonIndex < (currentMenu->numOfButtons - 1)) {
el17tc 2:43bb635db736 25 currentMenu->buttonIndex += 1;
el17tc 2:43bb635db736 26 currentButton = currentMenu->buttons[currentMenu->buttonIndex];
el17tc 2:43bb635db736 27 }
el17tc 2:43bb635db736 28 printf("currentMenu->buttonIndex = %d\n", currentMenu->buttonIndex);
el17tc 2:43bb635db736 29 }
el17tc 2:43bb635db736 30
el17tc 2:43bb635db736 31 Ticker arrowFlicker;
el17tc 2:43bb635db736 32 Ticker ingameCounter;
el17tc 2:43bb635db736 33 bool arrowFlickFlag = 1;
el17tc 2:43bb635db736 34 int ingameTime;
el17tc 2:43bb635db736 35
el17tc 2:43bb635db736 36 void drawTimer() {
el17tc 2:43bb635db736 37 lcd.drawRect(1,1,20,8,FILL_WHITE);
el17tc 2:43bb635db736 38 std::stringstream ss;
el17tc 2:43bb635db736 39 ss << ingameTime;
el17tc 2:43bb635db736 40 std::string timeStr = "Time:" + ss.str();
el17tc 2:43bb635db736 41 lcd.printString(timeStr.c_str(), 1,0);
el17tc 2:43bb635db736 42 }
el17tc 2:43bb635db736 43 void timerFunc() {
el17tc 2:43bb635db736 44 if (timerFlag)
el17tc 2:43bb635db736 45 ingameTime--;
el17tc 2:43bb635db736 46 else
el17tc 2:43bb635db736 47 ingameTime++;
el17tc 2:43bb635db736 48 }
el17tc 2:43bb635db736 49 void selectionArrowFunc() {
el17tc 2:43bb635db736 50 arrowFlickFlag = !arrowFlickFlag;
el17tc 0:72f372170a73 51 };
el17tc 0:72f372170a73 52
el17tc 2:43bb635db736 53
el17tc 0:72f372170a73 54 int main() {
el17tc 2:43bb635db736 55 gamepad.init();
el17tc 0:72f372170a73 56 lcd.init();
el17tc 0:72f372170a73 57 lcd.setContrast(0.5);
el17tc 0:72f372170a73 58 lcd.normalMode();
el17tc 0:72f372170a73 59 lcd.setBrightness(0.5);
el17tc 0:72f372170a73 60
el17tc 2:43bb635db736 61 arrowFlicker.attach(&selectionArrowFunc,0.9);
el17tc 0:72f372170a73 62 currentMenu = new MainMenu(&lcd);
el17tc 0:72f372170a73 63
el17tc 2:43bb635db736 64 // program loop - never exits
el17tc 0:72f372170a73 65 while (true) {
el17tc 2:43bb635db736 66 // menu loop
el17tc 2:43bb635db736 67 gamepad.check_event(Gamepad::START_PRESSED); // consume trailing input from last loop
el17tc 2:43bb635db736 68 while (true) {
el17tc 2:43bb635db736 69
el17tc 2:43bb635db736 70 if (gamepad.check_event(Gamepad::A_PRESSED)) {
el17tc 2:43bb635db736 71 buttonPressedDown();
el17tc 2:43bb635db736 72 }
el17tc 2:43bb635db736 73 if (gamepad.check_event(Gamepad::Y_PRESSED)) {
el17tc 2:43bb635db736 74 buttonPressedUp();
el17tc 2:43bb635db736 75 }
el17tc 2:43bb635db736 76 if (gamepad.check_event(Gamepad::X_PRESSED)) {
el17tc 2:43bb635db736 77 currentButton->runBack();
el17tc 2:43bb635db736 78 gamepad.check_event(Gamepad::X_PRESSED); // consume second input if it appeared
el17tc 2:43bb635db736 79 }
el17tc 2:43bb635db736 80 if (gamepad.check_event(Gamepad::B_PRESSED)) {
el17tc 2:43bb635db736 81 currentButton->run();
el17tc 2:43bb635db736 82 gamepad.check_event(Gamepad::B_PRESSED); // consume second input if it appeared
el17tc 2:43bb635db736 83 }
el17tc 2:43bb635db736 84 if (gamepad.check_event(Gamepad::START_PRESSED)) {
el17tc 2:43bb635db736 85 currentButton->run();
el17tc 2:43bb635db736 86 gamepad.check_event(Gamepad::START_PRESSED); // consume second input if it appeared
el17tc 2:43bb635db736 87 }
el17tc 2:43bb635db736 88 if (gamepad.check_event(Gamepad::BACK_PRESSED)) {
el17tc 2:43bb635db736 89 delete currentMenu;
el17tc 2:43bb635db736 90 currentMenu = new MainMenu(&lcd);
el17tc 2:43bb635db736 91 }
el17tc 2:43bb635db736 92
el17tc 2:43bb635db736 93 lcd.clear();
el17tc 2:43bb635db736 94 currentMenu->draw();
el17tc 2:43bb635db736 95
el17tc 2:43bb635db736 96 if (arrowFlickFlag)
el17tc 2:43bb635db736 97 lcd.drawSprite((currentButton->x)-2,(currentButton->y),7,4, (int *)selectArrow2);
el17tc 2:43bb635db736 98
el17tc 2:43bb635db736 99 lcd.refresh();
el17tc 2:43bb635db736 100 if (beginFlag) {
el17tc 2:43bb635db736 101 beginFlag = false;
el17tc 2:43bb635db736 102 printf("begin flag is true\n");
el17tc 2:43bb635db736 103 break;
el17tc 2:43bb635db736 104 }
el17tc 2:43bb635db736 105 sleep();
el17tc 2:43bb635db736 106 }
el17tc 2:43bb635db736 107 delete currentMenu;
el17tc 2:43bb635db736 108
el17tc 2:43bb635db736 109 Maze maze;
el17tc 2:43bb635db736 110 Player player(&maze);
el17tc 2:43bb635db736 111 maze.selectMaze(mazeSize);
el17tc 2:43bb635db736 112 player.pos.x = maze.startX;
el17tc 2:43bb635db736 113 player.pos.y = maze.startY;
el17tc 2:43bb635db736 114 Drawer drawer(&player, &lcd);
el17tc 2:43bb635db736 115
el17tc 2:43bb635db736 116 if (timerFlag)
el17tc 2:43bb635db736 117 ingameTime = maze.timeToFinish;
el17tc 2:43bb635db736 118 else
el17tc 2:43bb635db736 119 ingameTime = 0;
el17tc 2:43bb635db736 120 ingameCounter.attach(&timerFunc, 1);
el17tc 2:43bb635db736 121 arrowFlicker.detach();
el17tc 2:43bb635db736 122 bool winFlag = false;
el17tc 2:43bb635db736 123
el17tc 2:43bb635db736 124 // Main game loop
el17tc 2:43bb635db736 125 while (true) {
el17tc 2:43bb635db736 126 if (gamepad.check_event(Gamepad::Y_PRESSED)) {
el17tc 2:43bb635db736 127 if (player.checkLocation(player.pos, 0, 2)) {
el17tc 2:43bb635db736 128 winFlag = true;
el17tc 2:43bb635db736 129 }
el17tc 2:43bb635db736 130 player.walk();
el17tc 2:43bb635db736 131 wait(0.2);
el17tc 2:43bb635db736 132 if (gamepad.check_event(Gamepad::Y_PRESSED)) {
el17tc 2:43bb635db736 133 printf("walked but input fired twice\n");
el17tc 2:43bb635db736 134 }
el17tc 2:43bb635db736 135 }
el17tc 2:43bb635db736 136 if (gamepad.check_event(Gamepad::X_PRESSED)) {
el17tc 2:43bb635db736 137 player.turnLeft();
el17tc 2:43bb635db736 138 wait(0.2);
el17tc 2:43bb635db736 139 if (gamepad.check_event(Gamepad::X_PRESSED)) {
el17tc 2:43bb635db736 140 printf("turned left but input fired twice\n");
el17tc 2:43bb635db736 141 }
el17tc 2:43bb635db736 142 }
el17tc 2:43bb635db736 143 if (gamepad.check_event(Gamepad::B_PRESSED)) {
el17tc 2:43bb635db736 144 player.turnRight();
el17tc 2:43bb635db736 145 wait(0.2);
el17tc 2:43bb635db736 146 if (gamepad.check_event(Gamepad::B_PRESSED)) {
el17tc 2:43bb635db736 147 printf("turned right but input fired twice\n");
el17tc 2:43bb635db736 148 }
el17tc 2:43bb635db736 149 }
el17tc 2:43bb635db736 150 if (gamepad.check_event(Gamepad::A_PRESSED)) {
el17tc 2:43bb635db736 151 player.stepBack();
el17tc 2:43bb635db736 152 wait(0.2);
el17tc 2:43bb635db736 153 if (gamepad.check_event(Gamepad::A_PRESSED)) {
el17tc 2:43bb635db736 154 printf("stepped back but input fired twice\n");
el17tc 2:43bb635db736 155 }
el17tc 2:43bb635db736 156 }
el17tc 2:43bb635db736 157 if (gamepad.check_event(Gamepad::R_PRESSED)) {
el17tc 2:43bb635db736 158 player.turnRight();
el17tc 2:43bb635db736 159 wait(0.2);
el17tc 2:43bb635db736 160 if (gamepad.check_event(Gamepad::R_PRESSED)) {
el17tc 2:43bb635db736 161 printf("turned right but input fired twice\n");
el17tc 2:43bb635db736 162 }
el17tc 2:43bb635db736 163 }
el17tc 2:43bb635db736 164 if (gamepad.check_event(Gamepad::L_PRESSED)) {
el17tc 2:43bb635db736 165 player.turnLeft();
el17tc 2:43bb635db736 166 wait(0.2);
el17tc 2:43bb635db736 167 if (gamepad.check_event(Gamepad::L_PRESSED)) {
el17tc 2:43bb635db736 168 printf("turned left but input fired twice\n");
el17tc 2:43bb635db736 169 }
el17tc 2:43bb635db736 170 }
el17tc 2:43bb635db736 171
el17tc 2:43bb635db736 172 if (winFlag) {
el17tc 2:43bb635db736 173 printf("Player has escaped the maze\n");
el17tc 2:43bb635db736 174 // player has won, end the game loop
el17tc 2:43bb635db736 175 winFlag = false;
el17tc 2:43bb635db736 176 currentMenu = new VictoryMenu(&lcd);
el17tc 2:43bb635db736 177 if (timerFlag) {
el17tc 2:43bb635db736 178 currentMenu->score = maze.timeToFinish + (ingameTime * 2);
el17tc 2:43bb635db736 179 } else {
el17tc 2:43bb635db736 180 currentMenu->score = maze.timeToFinish + ((maze.timeToFinish*10)/ingameTime);
el17tc 2:43bb635db736 181 }
el17tc 2:43bb635db736 182 break;
el17tc 2:43bb635db736 183 }
el17tc 2:43bb635db736 184 if (timerFlag && (ingameTime <= 0)) {
el17tc 2:43bb635db736 185 printf("Player has ran out of time\n");
el17tc 2:43bb635db736 186 // player has lost, end the game loop
el17tc 2:43bb635db736 187 currentMenu = new DefeatMenu(&lcd);
el17tc 2:43bb635db736 188 currentMenu->score = 0;
el17tc 2:43bb635db736 189 break;
el17tc 2:43bb635db736 190 }
el17tc 2:43bb635db736 191 printf("========\n");
el17tc 2:43bb635db736 192
el17tc 2:43bb635db736 193 lcd.clear();
el17tc 2:43bb635db736 194 drawer.drawScreen();
el17tc 2:43bb635db736 195 drawTimer();
el17tc 2:43bb635db736 196 lcd.refresh();
el17tc 2:43bb635db736 197
el17tc 2:43bb635db736 198 sleep();
el17tc 2:43bb635db736 199 }
el17tc 2:43bb635db736 200
el17tc 2:43bb635db736 201 arrowFlicker.attach(&selectionArrowFunc,0.9);
el17tc 2:43bb635db736 202 gamepad.check_event(Gamepad::START_PRESSED);
el17tc 2:43bb635db736 203 while (true) {
el17tc 2:43bb635db736 204 if (gamepad.check_event(Gamepad::B_PRESSED)) {
el17tc 2:43bb635db736 205 buttonPressedDown();
el17tc 2:43bb635db736 206 }
el17tc 2:43bb635db736 207 if (gamepad.check_event(Gamepad::X_PRESSED)) {
el17tc 2:43bb635db736 208 buttonPressedUp();
el17tc 2:43bb635db736 209 }
el17tc 2:43bb635db736 210 if (gamepad.check_event(Gamepad::A_PRESSED)) {
el17tc 2:43bb635db736 211 //buttonActivate(*currentButton);
el17tc 2:43bb635db736 212 }
el17tc 2:43bb635db736 213 if (gamepad.check_event(Gamepad::START_PRESSED)) {
el17tc 2:43bb635db736 214 currentButton->run();
el17tc 2:43bb635db736 215 }
el17tc 2:43bb635db736 216 lcd.clear();
el17tc 2:43bb635db736 217 currentMenu->draw();
el17tc 2:43bb635db736 218 if (arrowFlickFlag) {
el17tc 2:43bb635db736 219 lcd.drawSprite((currentButton->x)-2,(currentButton->y),7,4,
el17tc 2:43bb635db736 220 (int *)selectArrow2);
el17tc 2:43bb635db736 221 }
el17tc 2:43bb635db736 222 if (restartFlag) {
el17tc 2:43bb635db736 223 restartFlag = false;
el17tc 2:43bb635db736 224 delete currentMenu;
el17tc 2:43bb635db736 225 currentMenu = new StartMenu(&lcd);
el17tc 2:43bb635db736 226 break;
el17tc 2:43bb635db736 227 }
el17tc 2:43bb635db736 228 if (menuFlag) {
el17tc 2:43bb635db736 229 menuFlag = false;
el17tc 2:43bb635db736 230 delete currentMenu;
el17tc 2:43bb635db736 231 currentMenu = new MainMenu(&lcd);
el17tc 2:43bb635db736 232 break;
el17tc 2:43bb635db736 233 }
el17tc 2:43bb635db736 234 lcd.refresh();
el17tc 2:43bb635db736 235 sleep();
el17tc 2:43bb635db736 236 }
el17tc 2:43bb635db736 237 }
el17tc 2:43bb635db736 238 }