Project Submission (late)
Dependencies: mbed
main.cpp@2:43bb635db736, 2019-05-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |