Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17ajf by
Game/Game.cpp@28:e09b7ac11dea, 2019-04-12 (annotated)
- Committer:
- el17ajf
- Date:
- Fri Apr 12 20:53:00 2019 +0000
- Revision:
- 28:e09b7ac11dea
- Parent:
- 27:2ed9e3c9f4e9
- Child:
- 29:d59fbe128d1f
added screen shake
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el17ajf | 4:aa433f9865a6 | 1 | #include "Game.h" |
el17ajf | 28:e09b7ac11dea | 2 | #include "Graphics.h" |
el17ajf | 6:a54df561f442 | 3 | #include "Input.h" |
el17ajf | 18:24ce897024d0 | 4 | #include "Engine.h" |
el17ajf | 21:62d2b5b73160 | 5 | #include "MenuManager.h" |
el17ajf | 21:62d2b5b73160 | 6 | #include "GameOverMenu.h" |
el17ajf | 22:0a474f074553 | 7 | #include "PausedMenu.h" |
el17ajf | 19:370d83a8dc33 | 8 | #include "Prefs.h" |
el17ajf | 28:e09b7ac11dea | 9 | #include "Math.h" |
el17ajf | 2:0b5e289ef905 | 10 | |
el17ajf | 17:cc448ab7266f | 11 | Game::Game(Difficulty difficulty) { |
el17ajf | 7:2e37bad816cb | 12 | currentTetromino = Tetromino::getTetrominoOfType( |
el17ajf | 7:2e37bad816cb | 13 | Tetromino::getRandomTetrominoType()); |
el17ajf | 7:2e37bad816cb | 14 | nextTetrominoType = Tetromino::getRandomTetrominoType(); |
el17ajf | 17:cc448ab7266f | 15 | |
el17ajf | 17:cc448ab7266f | 16 | switch (difficulty) { |
el17ajf | 17:cc448ab7266f | 17 | case EASY: |
el17ajf | 18:24ce897024d0 | 18 | move_frames = Engine::FPS / 6; // ~ 160ms |
el17ajf | 19:370d83a8dc33 | 19 | scoreForRow = 6; |
el17ajf | 17:cc448ab7266f | 20 | break; |
el17ajf | 17:cc448ab7266f | 21 | case MEDIUM: |
el17ajf | 18:24ce897024d0 | 22 | move_frames = Engine::FPS / 9; // ~ 110ms |
el17ajf | 19:370d83a8dc33 | 23 | scoreForRow = 8; |
el17ajf | 17:cc448ab7266f | 24 | break; |
el17ajf | 17:cc448ab7266f | 25 | case HARD: |
el17ajf | 18:24ce897024d0 | 26 | move_frames = Engine::FPS / 12; // ~ 80ms |
el17ajf | 19:370d83a8dc33 | 27 | scoreForRow = 10; |
el17ajf | 17:cc448ab7266f | 28 | break; |
el17ajf | 17:cc448ab7266f | 29 | } |
el17ajf | 15:afeefa3ceb61 | 30 | frames = 0; |
el17ajf | 15:afeefa3ceb61 | 31 | last_move_frame = 0; |
el17ajf | 15:afeefa3ceb61 | 32 | start_x = Grid::GRID_WIDTH / 2 - 1; |
el17ajf | 15:afeefa3ceb61 | 33 | currentTetromino = currentTetromino.teleportedTo(start_x); |
el17ajf | 19:370d83a8dc33 | 34 | score = 0; |
el17ajf | 27:2ed9e3c9f4e9 | 35 | playerNumber = Prefs::getInstance()->getKey(Prefs::LAST_PLAYER); |
el17ajf | 27:2ed9e3c9f4e9 | 36 | if (playerNumber == Prefs::EMPTY) { |
el17ajf | 27:2ed9e3c9f4e9 | 37 | playerNumber = 1; |
el17ajf | 27:2ed9e3c9f4e9 | 38 | } else { |
el17ajf | 27:2ed9e3c9f4e9 | 39 | playerNumber += 1; |
el17ajf | 27:2ed9e3c9f4e9 | 40 | } |
el17ajf | 2:0b5e289ef905 | 41 | } |
el17ajf | 2:0b5e289ef905 | 42 | |
el17ajf | 2:0b5e289ef905 | 43 | Game::~Game() { |
el17ajf | 6:a54df561f442 | 44 | |
el17ajf | 2:0b5e289ef905 | 45 | } |
el17ajf | 2:0b5e289ef905 | 46 | |
el17ajf | 2:0b5e289ef905 | 47 | void Game::update() { |
el17ajf | 15:afeefa3ceb61 | 48 | if (frames++ > last_move_frame + move_frames) { |
el17ajf | 15:afeefa3ceb61 | 49 | last_move_frame = frames; |
el17ajf | 15:afeefa3ceb61 | 50 | moveCurrentTetrominoDown(); |
el17ajf | 15:afeefa3ceb61 | 51 | } |
el17ajf | 15:afeefa3ceb61 | 52 | |
el17ajf | 9:3a7776a29a11 | 53 | if (Input::buttonHit(Input::LEFT)) { |
el17ajf | 7:2e37bad816cb | 54 | if (grid.isSpaceForTetromino(currentTetromino.movedLeft())) { |
el17ajf | 4:aa433f9865a6 | 55 | currentTetromino = currentTetromino.movedLeft(); |
el17ajf | 4:aa433f9865a6 | 56 | } |
el17ajf | 4:aa433f9865a6 | 57 | } |
el17ajf | 9:3a7776a29a11 | 58 | if (Input::buttonHit(Input::RIGHT)) { |
el17ajf | 9:3a7776a29a11 | 59 | if (grid.isSpaceForTetromino(currentTetromino.movedRight())) { |
el17ajf | 9:3a7776a29a11 | 60 | currentTetromino = currentTetromino.movedRight(); |
el17ajf | 9:3a7776a29a11 | 61 | } |
el17ajf | 9:3a7776a29a11 | 62 | } |
el17ajf | 9:3a7776a29a11 | 63 | if (Input::buttonHit(Input::UP)) { |
el17ajf | 9:3a7776a29a11 | 64 | if (grid.isSpaceForTetromino(currentTetromino.rotatedClockwise())) { |
el17ajf | 9:3a7776a29a11 | 65 | currentTetromino = currentTetromino.rotatedClockwise(); |
el17ajf | 9:3a7776a29a11 | 66 | } |
el17ajf | 9:3a7776a29a11 | 67 | } |
el17ajf | 9:3a7776a29a11 | 68 | if (Input::buttonHit(Input::DOWN)) { |
el17ajf | 9:3a7776a29a11 | 69 | dropCurrentTetromino(); |
el17ajf | 9:3a7776a29a11 | 70 | } |
el17ajf | 22:0a474f074553 | 71 | if (Input::buttonHit(Input::START)) { |
el17ajf | 22:0a474f074553 | 72 | Menus::MenuManager::add(new Menus::PausedMenu()); |
el17ajf | 22:0a474f074553 | 73 | } |
el17ajf | 4:aa433f9865a6 | 74 | } |
el17ajf | 4:aa433f9865a6 | 75 | |
el17ajf | 19:370d83a8dc33 | 76 | void Game::addScore(int rowsCleared) { |
el17ajf | 19:370d83a8dc33 | 77 | score += scoreForRow * rowsCleared * rowsCleared; |
el17ajf | 28:e09b7ac11dea | 78 | move_frames = Math::lerp(move_frames, 1, (double)score/9999); |
el17ajf | 19:370d83a8dc33 | 79 | if (score > 9999) { |
el17ajf | 19:370d83a8dc33 | 80 | score = 9999; |
el17ajf | 19:370d83a8dc33 | 81 | } |
el17ajf | 19:370d83a8dc33 | 82 | } |
el17ajf | 19:370d83a8dc33 | 83 | |
el17ajf | 7:2e37bad816cb | 84 | void Game::moveCurrentTetrominoDown() { |
el17ajf | 7:2e37bad816cb | 85 | if (grid.isSpaceForTetromino(currentTetromino.movedDown())) { |
el17ajf | 4:aa433f9865a6 | 86 | currentTetromino = currentTetromino.movedDown(); |
el17ajf | 4:aa433f9865a6 | 87 | } else { |
el17ajf | 19:370d83a8dc33 | 88 | int rowsCleared = grid.placeTetromino(currentTetromino); |
el17ajf | 19:370d83a8dc33 | 89 | if (rowsCleared != 0) { |
el17ajf | 19:370d83a8dc33 | 90 | addScore(rowsCleared); |
el17ajf | 19:370d83a8dc33 | 91 | } |
el17ajf | 7:2e37bad816cb | 92 | currentTetromino = Tetromino::getTetrominoOfType(nextTetrominoType); |
el17ajf | 15:afeefa3ceb61 | 93 | // centre it |
el17ajf | 15:afeefa3ceb61 | 94 | currentTetromino = currentTetromino.teleportedTo(start_x); |
el17ajf | 15:afeefa3ceb61 | 95 | if (!grid.isSpaceForTetromino(currentTetromino)) { |
el17ajf | 15:afeefa3ceb61 | 96 | // no space for tetromino, game over |
el17ajf | 15:afeefa3ceb61 | 97 | gameOver(); |
el17ajf | 15:afeefa3ceb61 | 98 | } |
el17ajf | 13:59e17cab320a | 99 | nextTetrominoType = Tetromino::getRandomTetrominoType(); |
el17ajf | 4:aa433f9865a6 | 100 | } |
el17ajf | 2:0b5e289ef905 | 101 | } |
el17ajf | 2:0b5e289ef905 | 102 | |
el17ajf | 7:2e37bad816cb | 103 | void Game::dropCurrentTetromino() { |
el17ajf | 9:3a7776a29a11 | 104 | while (grid.isSpaceForTetromino(currentTetromino.movedDown())) { |
el17ajf | 19:370d83a8dc33 | 105 | score += 1; |
el17ajf | 9:3a7776a29a11 | 106 | currentTetromino = currentTetromino.movedDown(); |
el17ajf | 9:3a7776a29a11 | 107 | } |
el17ajf | 9:3a7776a29a11 | 108 | moveCurrentTetrominoDown(); |
el17ajf | 28:e09b7ac11dea | 109 | Graphics::Game::shake(3); |
el17ajf | 7:2e37bad816cb | 110 | } |
el17ajf | 7:2e37bad816cb | 111 | |
el17ajf | 2:0b5e289ef905 | 112 | void Game::draw() { |
el17ajf | 7:2e37bad816cb | 113 | currentTetromino.draw(); |
el17ajf | 4:aa433f9865a6 | 114 | grid.draw(); |
el17ajf | 2:0b5e289ef905 | 115 | } |
el17ajf | 15:afeefa3ceb61 | 116 | |
el17ajf | 27:2ed9e3c9f4e9 | 117 | void Game::gameOver() { |
el17ajf | 27:2ed9e3c9f4e9 | 118 | printf("Player %i finished game with %i points\n", playerNumber, score); |
el17ajf | 27:2ed9e3c9f4e9 | 119 | Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, playerNumber); |
el17ajf | 27:2ed9e3c9f4e9 | 120 | Prefs::getInstance()->setKey(Prefs::LAST_SCORE, score); |
el17ajf | 28:e09b7ac11dea | 121 | Prefs::getInstance()->printAll(); |
el17ajf | 28:e09b7ac11dea | 122 | printf("WRITTEN DATA TO WHATEVER THING\n"); |
el17ajf | 28:e09b7ac11dea | 123 | printf("UPDATING LEADERBOARD\n"); |
el17ajf | 28:e09b7ac11dea | 124 | updateLeaderboard(); |
el17ajf | 28:e09b7ac11dea | 125 | Prefs::getInstance()->printAll(); |
el17ajf | 28:e09b7ac11dea | 126 | printf("DONE UPDATING LEADERBOARD\n"); |
el17ajf | 27:2ed9e3c9f4e9 | 127 | Menus::MenuManager::add(new Menus::GameOverMenu()); |
el17ajf | 27:2ed9e3c9f4e9 | 128 | } |
el17ajf | 27:2ed9e3c9f4e9 | 129 | |
el17ajf | 27:2ed9e3c9f4e9 | 130 | void Game::updateLeaderboard() { |
el17ajf | 27:2ed9e3c9f4e9 | 131 | for (int i = 0; i <= Prefs::HIGHSCORE3; i++) { |
el17ajf | 21:62d2b5b73160 | 132 | if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) { |
el17ajf | 28:e09b7ac11dea | 133 | // move all scores down |
el17ajf | 28:e09b7ac11dea | 134 | for (int j = Prefs::HIGHSCORE3 - 1; j >= i; j--) { |
el17ajf | 27:2ed9e3c9f4e9 | 135 | Prefs::getInstance()->setKey( |
el17ajf | 27:2ed9e3c9f4e9 | 136 | (Prefs::Key)(j + 1), |
el17ajf | 27:2ed9e3c9f4e9 | 137 | Prefs::getInstance()->getKey((Prefs::Key)i) |
el17ajf | 27:2ed9e3c9f4e9 | 138 | ); |
el17ajf | 27:2ed9e3c9f4e9 | 139 | Prefs::getInstance()->setKey( |
el17ajf | 27:2ed9e3c9f4e9 | 140 | (Prefs::Key)((j + 1) + 3), |
el17ajf | 27:2ed9e3c9f4e9 | 141 | Prefs::getInstance()->getKey((Prefs::Key)(i + 3)) |
el17ajf | 27:2ed9e3c9f4e9 | 142 | ); |
el17ajf | 27:2ed9e3c9f4e9 | 143 | } |
el17ajf | 28:e09b7ac11dea | 144 | // set ith score to the current score |
el17ajf | 21:62d2b5b73160 | 145 | Prefs::getInstance()->setKey((Prefs::Key)i, score); |
el17ajf | 21:62d2b5b73160 | 146 | Prefs::getInstance()->setKey((Prefs::Key)(i + 3), playerNumber); |
el17ajf | 27:2ed9e3c9f4e9 | 147 | break; |
el17ajf | 19:370d83a8dc33 | 148 | } |
el17ajf | 19:370d83a8dc33 | 149 | } |
el17ajf | 19:370d83a8dc33 | 150 | } |