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.
Map/Map.h@15:40cf30a7a71b, 2019-05-09 (annotated)
- Committer:
- kocemax
- Date:
- Thu May 09 12:19:28 2019 +0000
- Revision:
- 15:40cf30a7a71b
- Parent:
- 14:4b05b5c2a355
Final Commit. Kostadin Chakarov, SID: 201 171 978. I have read the University Regulations on Plagiarism and state that the work covered by this declaration is my own
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kocemax | 5:12c179da4788 | 1 | #ifndef MAP_H |
kocemax | 5:12c179da4788 | 2 | #define MAP_H |
kocemax | 5:12c179da4788 | 3 | |
kocemax | 5:12c179da4788 | 4 | #include "mbed.h" |
kocemax | 5:12c179da4788 | 5 | #include "N5110.h" |
kocemax | 5:12c179da4788 | 6 | #include "Gamepad.h" |
kocemax | 8:9b77eea95088 | 7 | #include "Paddle.h" |
kocemax | 5:12c179da4788 | 8 | #include "Ball.h" |
kocemax | 6:39bda45efeed | 9 | #include <vector> |
kocemax | 5:12c179da4788 | 10 | |
kocemax | 7:cd3cafda3dd4 | 11 | |
kocemax | 8:9b77eea95088 | 12 | /** Struct containing all parameters for the bricks */ |
kocemax | 6:39bda45efeed | 13 | struct Brick { |
kocemax | 12:b3ec47d606a5 | 14 | int x, y, w, h; // x and y coords, width, height |
kocemax | 5:12c179da4788 | 15 | }; |
kocemax | 8:9b77eea95088 | 16 | |
kocemax | 8:9b77eea95088 | 17 | |
kocemax | 12:b3ec47d606a5 | 18 | // Forward declaration |
kocemax | 7:cd3cafda3dd4 | 19 | class Map; |
kocemax | 7:cd3cafda3dd4 | 20 | |
kocemax | 8:9b77eea95088 | 21 | |
kocemax | 8:9b77eea95088 | 22 | /** Level Class |
kocemax | 14:4b05b5c2a355 | 23 | , Creates the levels in the Breakout game |
kocemax | 8:9b77eea95088 | 24 | @author Kostadin Chakarov, University of Leeds |
kocemax | 8:9b77eea95088 | 25 | @date April 2019 |
kocemax | 8:9b77eea95088 | 26 | */ |
kocemax | 8:9b77eea95088 | 27 | |
kocemax | 8:9b77eea95088 | 28 | |
kocemax | 7:cd3cafda3dd4 | 29 | class Level |
kocemax | 7:cd3cafda3dd4 | 30 | { |
kocemax | 7:cd3cafda3dd4 | 31 | public: |
kocemax | 12:b3ec47d606a5 | 32 | /** Draws the bricks and stores them in the levels vector, |
kocemax | 12:b3ec47d606a5 | 33 | * virtual as it changes for each level |
kocemax | 8:9b77eea95088 | 34 | */ |
kocemax | 8:9b77eea95088 | 35 | virtual void initBricks(Map &map) {} |
kocemax | 7:cd3cafda3dd4 | 36 | }; |
kocemax | 7:cd3cafda3dd4 | 37 | |
kocemax | 8:9b77eea95088 | 38 | /** Inherits from level and doesn't have any additional functions */ |
kocemax | 7:cd3cafda3dd4 | 39 | class Level1 : public Level |
kocemax | 7:cd3cafda3dd4 | 40 | { |
kocemax | 7:cd3cafda3dd4 | 41 | public: |
kocemax | 11:bb36db678a6d | 42 | /** Draws the bricks for level 1 and stores them in the levels vector */ |
kocemax | 8:9b77eea95088 | 43 | virtual void initBricks(Map &map); |
kocemax | 8:9b77eea95088 | 44 | }; |
kocemax | 8:9b77eea95088 | 45 | |
kocemax | 8:9b77eea95088 | 46 | /** Inherits from level and doesn't have any additional functions */ |
kocemax | 8:9b77eea95088 | 47 | class Level2 : public Level |
kocemax | 8:9b77eea95088 | 48 | { |
kocemax | 8:9b77eea95088 | 49 | public: |
kocemax | 11:bb36db678a6d | 50 | /** Draws the bricks for level 2 and stores them in the levels vector */ |
kocemax | 7:cd3cafda3dd4 | 51 | virtual void initBricks(Map &map); |
kocemax | 7:cd3cafda3dd4 | 52 | }; |
kocemax | 7:cd3cafda3dd4 | 53 | |
kocemax | 9:f720f5d87420 | 54 | /** Inherits from level and doesn't have any additional functions */ |
kocemax | 9:f720f5d87420 | 55 | class Level3 : public Level |
kocemax | 9:f720f5d87420 | 56 | { |
kocemax | 9:f720f5d87420 | 57 | public: |
kocemax | 11:bb36db678a6d | 58 | /** Draws the bricks for level 3 and stores them in the levels vector */ |
kocemax | 9:f720f5d87420 | 59 | virtual void initBricks(Map &map); |
kocemax | 9:f720f5d87420 | 60 | }; |
kocemax | 9:f720f5d87420 | 61 | |
kocemax | 8:9b77eea95088 | 62 | |
kocemax | 8:9b77eea95088 | 63 | /* |
kocemax | 8:9b77eea95088 | 64 | Power ups Coding strategy: |
kocemax | 8:9b77eea95088 | 65 | 1. Define the PowerUp and it's draw method, set up all it's parameters in ctor |
kocemax | 8:9b77eea95088 | 66 | 2. Lifetime cycle management: |
kocemax | 8:9b77eea95088 | 67 | 2.a. Identify the spawn event (e.g. when brick is killed), then go to that code |
kocemax | 8:9b77eea95088 | 68 | 2.b. Create the power up and put it in the map's powerUps vector |
kocemax | 8:9b77eea95088 | 69 | 2.c. During update, iterate over all powerUps and move them |
kocemax | 8:9b77eea95088 | 70 | 2.d. In checkCollisions, iterate over all powerUps and check if any hit the pad |
kocemax | 8:9b77eea95088 | 71 | 2.d.i. If hit the paddle, remove and apply power-up effect |
kocemax | 8:9b77eea95088 | 72 | 2.d.ii. else if fell below paddle height, just remove and don't apply effect |
kocemax | 8:9b77eea95088 | 73 | */ |
kocemax | 8:9b77eea95088 | 74 | |
kocemax | 8:9b77eea95088 | 75 | |
kocemax | 12:b3ec47d606a5 | 76 | // Forward declaration since needed in PowerUpType struct |
kocemax | 8:9b77eea95088 | 77 | class PowerUp; |
kocemax | 8:9b77eea95088 | 78 | |
kocemax | 11:bb36db678a6d | 79 | /** Struct which contains all the powerup parameters and functions */ |
kocemax | 8:9b77eea95088 | 80 | struct PowerUpType { |
kocemax | 9:f720f5d87420 | 81 | int type; /** Stores the type of the powerup */ |
kocemax | 9:f720f5d87420 | 82 | int* sprite; /** Stores the sprite of the powerup */ |
kocemax | 8:9b77eea95088 | 83 | |
kocemax | 9:f720f5d87420 | 84 | /** Constructor */ |
kocemax | 8:9b77eea95088 | 85 | PowerUpType(int type, int* sprite) : type(type), sprite(sprite) {} |
kocemax | 8:9b77eea95088 | 86 | |
kocemax | 9:f720f5d87420 | 87 | /** Gives the powerup effect to the player */ |
kocemax | 8:9b77eea95088 | 88 | virtual void giveBonus(Paddle &paddle, Ball &ball) {} |
kocemax | 13:3585d2ea4ff4 | 89 | /** Chooses which powerup to draw on the LCD depending on its type */ |
kocemax | 8:9b77eea95088 | 90 | virtual void draw(N5110 &lcd, PowerUp &pUp); |
kocemax | 8:9b77eea95088 | 91 | }; |
kocemax | 8:9b77eea95088 | 92 | |
kocemax | 9:f720f5d87420 | 93 | /** Inherits from the powerUpType struct and only changes the giveBonus function */ |
kocemax | 8:9b77eea95088 | 94 | struct PaddleSizePUpType : public PowerUpType { |
kocemax | 9:f720f5d87420 | 95 | /** Constructor */ |
kocemax | 8:9b77eea95088 | 96 | PaddleSizePUpType(int type, int* sprite) : PowerUpType(type, sprite) {} |
kocemax | 11:bb36db678a6d | 97 | /** Gives the paddle size increase powerup effect to the player */ |
kocemax | 8:9b77eea95088 | 98 | virtual void giveBonus(Paddle &paddle, Ball &ball); |
kocemax | 8:9b77eea95088 | 99 | }; |
kocemax | 8:9b77eea95088 | 100 | |
kocemax | 9:f720f5d87420 | 101 | /** Inherits from the powerUpType struct and only changes the giveBonus function */ |
kocemax | 8:9b77eea95088 | 102 | struct PaddleSpeedPUpType : public PowerUpType { |
kocemax | 9:f720f5d87420 | 103 | /** Constructor */ |
kocemax | 8:9b77eea95088 | 104 | PaddleSpeedPUpType(int type, int* sprite) : PowerUpType(type, sprite) {} |
kocemax | 11:bb36db678a6d | 105 | /** Gives the paddle speed incrase powerup effect to the player */ |
kocemax | 8:9b77eea95088 | 106 | virtual void giveBonus(Paddle &paddle, Ball &ball); |
kocemax | 8:9b77eea95088 | 107 | }; |
kocemax | 8:9b77eea95088 | 108 | |
kocemax | 9:f720f5d87420 | 109 | /** Inherits from the powerUpType struct and only changes the giveBonus function */ |
kocemax | 8:9b77eea95088 | 110 | struct BallSpeedPUpType : public PowerUpType { |
kocemax | 9:f720f5d87420 | 111 | /** Constructor */ |
kocemax | 8:9b77eea95088 | 112 | BallSpeedPUpType(int type, int* sprite) : PowerUpType(type, sprite) {} |
kocemax | 11:bb36db678a6d | 113 | /** Gives the ball speed decrease powerup effect to the player */ |
kocemax | 8:9b77eea95088 | 114 | virtual void giveBonus(Paddle &paddle, Ball &ball); |
kocemax | 8:9b77eea95088 | 115 | }; |
kocemax | 8:9b77eea95088 | 116 | |
kocemax | 8:9b77eea95088 | 117 | #define PowerUpW 3 |
kocemax | 8:9b77eea95088 | 118 | #define PowerUpH 4 |
kocemax | 10:da5743dfb137 | 119 | #define PowerUpDropChancePct 15 |
kocemax | 8:9b77eea95088 | 120 | |
kocemax | 8:9b77eea95088 | 121 | |
kocemax | 8:9b77eea95088 | 122 | /** PowerUp Class |
kocemax | 14:4b05b5c2a355 | 123 | , Creates the power ups in the Breakout game |
kocemax | 8:9b77eea95088 | 124 | @author Kostadin Chakarov, University of Leeds |
kocemax | 8:9b77eea95088 | 125 | @date April 2019 |
kocemax | 8:9b77eea95088 | 126 | */ |
kocemax | 8:9b77eea95088 | 127 | |
kocemax | 8:9b77eea95088 | 128 | class PowerUp : public GameObject { |
kocemax | 8:9b77eea95088 | 129 | //PowerUpType& pUpType; |
kocemax | 8:9b77eea95088 | 130 | |
kocemax | 8:9b77eea95088 | 131 | // we cannot store a reference because (for some reason) it is not copy-constructable |
kocemax | 8:9b77eea95088 | 132 | // and for some reason, PowerUp needs to be that. |
kocemax | 8:9b77eea95088 | 133 | PowerUpType* _pUpType; |
kocemax | 8:9b77eea95088 | 134 | |
kocemax | 8:9b77eea95088 | 135 | |
kocemax | 8:9b77eea95088 | 136 | |
kocemax | 7:cd3cafda3dd4 | 137 | public: |
kocemax | 9:f720f5d87420 | 138 | /** Constructor |
kocemax | 9:f720f5d87420 | 139 | * @param x the initial x-position of the PowerUp |
kocemax | 9:f720f5d87420 | 140 | * @param y the initial y-position of the PowerUp |
kocemax | 9:f720f5d87420 | 141 | * @param pUpType the type of the PowerUp |
kocemax | 9:f720f5d87420 | 142 | */ |
kocemax | 8:9b77eea95088 | 143 | PowerUp(float x, float y, PowerUpType& pUpType); |
kocemax | 9:f720f5d87420 | 144 | /** Destructor - empty */ |
kocemax | 8:9b77eea95088 | 145 | ~PowerUp() {}; |
kocemax | 8:9b77eea95088 | 146 | |
kocemax | 9:f720f5d87420 | 147 | /** Determines the bonus depending on the type of the powerup */ |
kocemax | 8:9b77eea95088 | 148 | void giveBonus(Paddle &paddle, Ball &ball) { |
kocemax | 8:9b77eea95088 | 149 | _pUpType->giveBonus(paddle, ball); |
kocemax | 8:9b77eea95088 | 150 | } |
kocemax | 13:3585d2ea4ff4 | 151 | /** Draws each powerup on the LCD after type has been assigned*/ |
kocemax | 8:9b77eea95088 | 152 | virtual void draw(N5110 &lcd); |
kocemax | 7:cd3cafda3dd4 | 153 | }; |
kocemax | 7:cd3cafda3dd4 | 154 | |
kocemax | 7:cd3cafda3dd4 | 155 | |
kocemax | 9:f720f5d87420 | 156 | /** Map Class |
kocemax | 14:4b05b5c2a355 | 157 | , Creates the map and controls collision between objects in the Breakout game |
kocemax | 9:f720f5d87420 | 158 | @author Kostadin Chakarov, University of Leeds |
kocemax | 9:f720f5d87420 | 159 | @date April 2019 |
kocemax | 9:f720f5d87420 | 160 | */ |
kocemax | 8:9b77eea95088 | 161 | |
kocemax | 5:12c179da4788 | 162 | class Map |
kocemax | 5:12c179da4788 | 163 | { |
kocemax | 6:39bda45efeed | 164 | private: |
kocemax | 8:9b77eea95088 | 165 | int currentLevel; /** Keeps track of the current level */ |
kocemax | 8:9b77eea95088 | 166 | std::vector<Level*> levels; /** Stores the levels in a vector */ |
kocemax | 8:9b77eea95088 | 167 | std::vector<Brick> bricks; /** Stores the bricks in a vector */ |
kocemax | 8:9b77eea95088 | 168 | std::vector<PowerUp> powerUps; /** Stores the powerups in a vector */ |
kocemax | 5:12c179da4788 | 169 | |
kocemax | 5:12c179da4788 | 170 | public: |
kocemax | 8:9b77eea95088 | 171 | /** Constructor */ |
kocemax | 7:cd3cafda3dd4 | 172 | Map(); |
kocemax | 8:9b77eea95088 | 173 | /** Destructor */ |
kocemax | 5:12c179da4788 | 174 | ~Map(); |
kocemax | 8:9b77eea95088 | 175 | /** Gets the current level |
kocemax | 8:9b77eea95088 | 176 | * @return the number of the current level |
kocemax | 8:9b77eea95088 | 177 | */ |
kocemax | 8:9b77eea95088 | 178 | int getCurrentLevel() { return currentLevel; } |
kocemax | 8:9b77eea95088 | 179 | /** Checks if all levels are defeated |
kocemax | 9:f720f5d87420 | 180 | * @return true if current level == number of levels |
kocemax | 8:9b77eea95088 | 181 | */ |
kocemax | 8:9b77eea95088 | 182 | bool hasWon() { return currentLevel >= levels.size(); } |
kocemax | 9:f720f5d87420 | 183 | /** Get the level object based on the current level number and call initBricks() on it */ |
kocemax | 6:39bda45efeed | 184 | void initBricks(); |
kocemax | 9:f720f5d87420 | 185 | /** Updates the moving powerups on map */ |
kocemax | 8:9b77eea95088 | 186 | void update(); |
kocemax | 9:f720f5d87420 | 187 | /** Creates powerUps depending on the PowerUpDropChancePct */ |
kocemax | 8:9b77eea95088 | 188 | void onBrickHit(const Brick&); |
kocemax | 9:f720f5d87420 | 189 | /** Draws all the bricks on the level, as well as powerUps */ |
kocemax | 5:12c179da4788 | 190 | void drawMap(N5110 &lcd); |
kocemax | 8:9b77eea95088 | 191 | /** Checks if brick <-> ball collided */ |
kocemax | 8:9b77eea95088 | 192 | void checkCollision(Ball &ball, Paddle &paddle); |
kocemax | 8:9b77eea95088 | 193 | /** Resolves the collision */ |
kocemax | 8:9b77eea95088 | 194 | void resolveCollision(const Brick &brick, GameObject &obj); |
kocemax | 9:f720f5d87420 | 195 | /** Checks if we cleared the level and if we won |
kocemax | 9:f720f5d87420 | 196 | * @return true if level is cleared |
kocemax | 9:f720f5d87420 | 197 | */ |
kocemax | 8:9b77eea95088 | 198 | bool checkLevel(); |
kocemax | 9:f720f5d87420 | 199 | /** Resets the whole map when game is (re-)started */ |
kocemax | 8:9b77eea95088 | 200 | void reset(); |
kocemax | 9:f720f5d87420 | 201 | /** Adds the brick to the vector */ |
kocemax | 8:9b77eea95088 | 202 | void addBrick(Brick& brick) { bricks.push_back(brick); } |
kocemax | 9:f720f5d87420 | 203 | /** Stores the score of the game */ |
kocemax | 9:f720f5d87420 | 204 | int score; |
kocemax | 5:12c179da4788 | 205 | }; |
kocemax | 5:12c179da4788 | 206 | #endif |