ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

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?

UserRevisionLine numberNew 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 }