ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Mon Apr 29 16:30:47 2019 +0000
Revision:
39:e128071a95b0
Parent:
36:c854f1f51f43
finished documenting all public methods;

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 34:0bb0d010e755 11 Game::Game(Difficulty difficulty) :
el17ajf 39:e128071a95b0 12 score(0), next_tetromino_type(Tetromino::getRandomTetrominoType()),
el17ajf 34:0bb0d010e755 13 current_tetromino(
el17ajf 34:0bb0d010e755 14 Tetromino::getTetrominoOfType(Tetromino::getRandomTetrominoType())),
el17ajf 39:e128071a95b0 15 frames(0), last_move_frame(0), start_x(Grid::GRID_WIDTH / 2 - 1),
el17ajf 34:0bb0d010e755 16 player_number(Prefs::getInstance()->getKey(Prefs::LAST_PLAYER)) {
el17ajf 34:0bb0d010e755 17 current_tetromino = current_tetromino.teleportedTo(start_x);
el17ajf 39:e128071a95b0 18
el17ajf 17:cc448ab7266f 19 switch (difficulty) {
el17ajf 17:cc448ab7266f 20 case EASY:
el17ajf 18:24ce897024d0 21 move_frames = Engine::FPS / 6; // ~ 160ms
el17ajf 31:69fedaa9b171 22 score_for_row = 6;
el17ajf 17:cc448ab7266f 23 break;
el17ajf 17:cc448ab7266f 24 case MEDIUM:
el17ajf 18:24ce897024d0 25 move_frames = Engine::FPS / 9; // ~ 110ms
el17ajf 31:69fedaa9b171 26 score_for_row = 8;
el17ajf 17:cc448ab7266f 27 break;
el17ajf 17:cc448ab7266f 28 case HARD:
el17ajf 18:24ce897024d0 29 move_frames = Engine::FPS / 12; // ~ 80ms
el17ajf 31:69fedaa9b171 30 score_for_row = 10;
el17ajf 17:cc448ab7266f 31 break;
el17ajf 17:cc448ab7266f 32 }
el17ajf 39:e128071a95b0 33
el17ajf 39:e128071a95b0 34 player_number = player_number == Prefs::EMPTY ? 1 : player_number + 1;
el17ajf 2:0b5e289ef905 35 }
el17ajf 2:0b5e289ef905 36
el17ajf 36:c854f1f51f43 37 Game::~Game() {}
el17ajf 2:0b5e289ef905 38
el17ajf 2:0b5e289ef905 39 void Game::update() {
el17ajf 15:afeefa3ceb61 40 if (frames++ > last_move_frame + move_frames) {
el17ajf 15:afeefa3ceb61 41 last_move_frame = frames;
el17ajf 15:afeefa3ceb61 42 moveCurrentTetrominoDown();
el17ajf 15:afeefa3ceb61 43 }
el17ajf 15:afeefa3ceb61 44
el17ajf 9:3a7776a29a11 45 if (Input::buttonHit(Input::LEFT)) {
el17ajf 31:69fedaa9b171 46 if (grid.isSpaceForTetromino(current_tetromino.movedLeft())) {
el17ajf 31:69fedaa9b171 47 current_tetromino = current_tetromino.movedLeft();
el17ajf 4:aa433f9865a6 48 }
el17ajf 39:e128071a95b0 49 } else if (Input::buttonHit(Input::RIGHT)) {
el17ajf 31:69fedaa9b171 50 if (grid.isSpaceForTetromino(current_tetromino.movedRight())) {
el17ajf 31:69fedaa9b171 51 current_tetromino = current_tetromino.movedRight();
el17ajf 9:3a7776a29a11 52 }
el17ajf 39:e128071a95b0 53 } else if (Input::buttonHit(Input::UP)) {
el17ajf 31:69fedaa9b171 54 if (grid.isSpaceForTetromino(current_tetromino.rotatedClockwise())) {
el17ajf 31:69fedaa9b171 55 current_tetromino = current_tetromino.rotatedClockwise();
el17ajf 9:3a7776a29a11 56 }
el17ajf 39:e128071a95b0 57 } else if (Input::buttonHit(Input::DOWN)) {
el17ajf 9:3a7776a29a11 58 dropCurrentTetromino();
el17ajf 39:e128071a95b0 59 } else if (Input::buttonHit(Input::START)) {
el17ajf 22:0a474f074553 60 Menus::MenuManager::add(new Menus::PausedMenu());
el17ajf 22:0a474f074553 61 }
el17ajf 4:aa433f9865a6 62 }
el17ajf 4:aa433f9865a6 63
el17ajf 31:69fedaa9b171 64 void Game::addScore(int rows_cleared) {
el17ajf 31:69fedaa9b171 65 score += score_for_row * rows_cleared * rows_cleared;
el17ajf 28:e09b7ac11dea 66 move_frames = Math::lerp(move_frames, 1, (double)score/9999);
el17ajf 19:370d83a8dc33 67 if (score > 9999) {
el17ajf 19:370d83a8dc33 68 score = 9999;
el17ajf 19:370d83a8dc33 69 }
el17ajf 19:370d83a8dc33 70 }
el17ajf 19:370d83a8dc33 71
el17ajf 7:2e37bad816cb 72 void Game::moveCurrentTetrominoDown() {
el17ajf 31:69fedaa9b171 73 if (grid.isSpaceForTetromino(current_tetromino.movedDown())) {
el17ajf 31:69fedaa9b171 74 current_tetromino = current_tetromino.movedDown();
el17ajf 4:aa433f9865a6 75 } else {
el17ajf 31:69fedaa9b171 76 int rows_cleared = grid.placeTetromino(current_tetromino);
el17ajf 31:69fedaa9b171 77 if (rows_cleared != 0) {
el17ajf 31:69fedaa9b171 78 addScore(rows_cleared);
el17ajf 19:370d83a8dc33 79 }
el17ajf 31:69fedaa9b171 80 current_tetromino = Tetromino::getTetrominoOfType(next_tetromino_type);
el17ajf 15:afeefa3ceb61 81 // centre it
el17ajf 31:69fedaa9b171 82 current_tetromino = current_tetromino.teleportedTo(start_x);
el17ajf 31:69fedaa9b171 83 if (!grid.isSpaceForTetromino(current_tetromino)) {
el17ajf 15:afeefa3ceb61 84 // no space for tetromino, game over
el17ajf 15:afeefa3ceb61 85 gameOver();
el17ajf 15:afeefa3ceb61 86 }
el17ajf 31:69fedaa9b171 87 next_tetromino_type = Tetromino::getRandomTetrominoType();
el17ajf 4:aa433f9865a6 88 }
el17ajf 2:0b5e289ef905 89 }
el17ajf 2:0b5e289ef905 90
el17ajf 7:2e37bad816cb 91 void Game::dropCurrentTetromino() {
el17ajf 31:69fedaa9b171 92 while (grid.isSpaceForTetromino(current_tetromino.movedDown())) {
el17ajf 19:370d83a8dc33 93 score += 1;
el17ajf 31:69fedaa9b171 94 current_tetromino = current_tetromino.movedDown();
el17ajf 9:3a7776a29a11 95 }
el17ajf 9:3a7776a29a11 96 moveCurrentTetrominoDown();
el17ajf 29:d59fbe128d1f 97 Graphics::Game::shake(0, 3);
el17ajf 7:2e37bad816cb 98 }
el17ajf 7:2e37bad816cb 99
el17ajf 2:0b5e289ef905 100 void Game::draw() {
el17ajf 31:69fedaa9b171 101 current_tetromino.draw();
el17ajf 4:aa433f9865a6 102 grid.draw();
el17ajf 2:0b5e289ef905 103 }
el17ajf 15:afeefa3ceb61 104
el17ajf 27:2ed9e3c9f4e9 105 void Game::gameOver() {
el17ajf 31:69fedaa9b171 106 Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, player_number);
el17ajf 27:2ed9e3c9f4e9 107 Prefs::getInstance()->setKey(Prefs::LAST_SCORE, score);
el17ajf 28:e09b7ac11dea 108 updateLeaderboard();
el17ajf 27:2ed9e3c9f4e9 109 Menus::MenuManager::add(new Menus::GameOverMenu());
el17ajf 27:2ed9e3c9f4e9 110 }
el17ajf 27:2ed9e3c9f4e9 111
el17ajf 27:2ed9e3c9f4e9 112 void Game::updateLeaderboard() {
el17ajf 27:2ed9e3c9f4e9 113 for (int i = 0; i <= Prefs::HIGHSCORE3; i++) {
el17ajf 21:62d2b5b73160 114 if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) {
el17ajf 28:e09b7ac11dea 115 // move all scores down
el17ajf 28:e09b7ac11dea 116 for (int j = Prefs::HIGHSCORE3 - 1; j >= i; j--) {
el17ajf 27:2ed9e3c9f4e9 117 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 118 (Prefs::Key)(j + 1),
el17ajf 27:2ed9e3c9f4e9 119 Prefs::getInstance()->getKey((Prefs::Key)i)
el17ajf 27:2ed9e3c9f4e9 120 );
el17ajf 27:2ed9e3c9f4e9 121 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 122 (Prefs::Key)((j + 1) + 3),
el17ajf 27:2ed9e3c9f4e9 123 Prefs::getInstance()->getKey((Prefs::Key)(i + 3))
el17ajf 27:2ed9e3c9f4e9 124 );
el17ajf 27:2ed9e3c9f4e9 125 }
el17ajf 28:e09b7ac11dea 126 // set ith score to the current score
el17ajf 21:62d2b5b73160 127 Prefs::getInstance()->setKey((Prefs::Key)i, score);
el17ajf 31:69fedaa9b171 128 Prefs::getInstance()->setKey((Prefs::Key)(i + 3), player_number);
el17ajf 27:2ed9e3c9f4e9 129 break;
el17ajf 19:370d83a8dc33 130 }
el17ajf 19:370d83a8dc33 131 }
el17ajf 19:370d83a8dc33 132 }