Game codes for Pokemon Academy Yiu Fai Kwok - 201198802 I have read the University Regulations on Plagiarism and state that the work covered by this declaration is my own and does not contain any unacknowledged work from other sources.
Dependencies: mbed FXOS8700CQ mbed-rtos
Game_one/Game_one.cpp@17:5d8ff39a0e49, 2019-04-21 (annotated)
- Committer:
- yfkwok
- Date:
- Sun Apr 21 11:02:28 2019 +0000
- Revision:
- 17:5d8ff39a0e49
- Parent:
- 11:5a6b9dffd78a
- Child:
- 20:50ad2dad310d
21/04/2019 - Add Doxygen comments for the following classes: Exam, Characters, Score and Start
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yfkwok | 2:464c7e62d97d | 1 | #include "Game_one.h" |
yfkwok | 2:464c7e62d97d | 2 | |
yfkwok | 2:464c7e62d97d | 3 | Game_one::Game_one() |
yfkwok | 2:464c7e62d97d | 4 | { |
yfkwok | 2:464c7e62d97d | 5 | |
yfkwok | 2:464c7e62d97d | 6 | } |
yfkwok | 2:464c7e62d97d | 7 | |
yfkwok | 2:464c7e62d97d | 8 | Game_one::~Game_one() |
yfkwok | 2:464c7e62d97d | 9 | { |
yfkwok | 2:464c7e62d97d | 10 | |
yfkwok | 2:464c7e62d97d | 11 | } |
yfkwok | 2:464c7e62d97d | 12 | |
yfkwok | 17:5d8ff39a0e49 | 13 | //Enumerate instruction menu from page 1 - 4 |
yfkwok | 4:5bc9c4363d31 | 14 | enum Page { |
yfkwok | 17:5d8ff39a0e49 | 15 | PAGE_1, PAGE_2, PAGE_3, PAGE_4 |
yfkwok | 4:5bc9c4363d31 | 16 | }; |
yfkwok | 4:5bc9c4363d31 | 17 | |
yfkwok | 2:464c7e62d97d | 18 | void Game_one::init(int speed, int cha, int r) |
yfkwok | 2:464c7e62d97d | 19 | { |
yfkwok | 2:464c7e62d97d | 20 | // Set the speed of the objects |
yfkwok | 2:464c7e62d97d | 21 | _speed = speed; |
yfkwok | 2:464c7e62d97d | 22 | |
yfkwok | 2:464c7e62d97d | 23 | // Set the character being drawn |
yfkwok | 2:464c7e62d97d | 24 | _cha = cha; |
yfkwok | 2:464c7e62d97d | 25 | |
yfkwok | 2:464c7e62d97d | 26 | // Set the random parameter for coin/block ratio |
yfkwok | 2:464c7e62d97d | 27 | _rand = r; |
yfkwok | 2:464c7e62d97d | 28 | |
yfkwok | 17:5d8ff39a0e49 | 29 | // Player's x position defined |
yfkwok | 2:464c7e62d97d | 30 | _p1x = 61; |
yfkwok | 2:464c7e62d97d | 31 | |
yfkwok | 17:5d8ff39a0e49 | 32 | // Initialize round counter |
yfkwok | 2:464c7e62d97d | 33 | _count = 0; |
yfkwok | 2:464c7e62d97d | 34 | _alt = 0; |
yfkwok | 2:464c7e62d97d | 35 | |
yfkwok | 17:5d8ff39a0e49 | 36 | // Initialize all game objects: character, coin and block |
yfkwok | 2:464c7e62d97d | 37 | _p1.init(_p1x); |
yfkwok | 2:464c7e62d97d | 38 | _coin.init(_speed); |
yfkwok | 2:464c7e62d97d | 39 | _block.init(_speed); |
yfkwok | 2:464c7e62d97d | 40 | |
yfkwok | 2:464c7e62d97d | 41 | // 4 possibilities. 3 for coin, 1 for block. |
yfkwok | 2:464c7e62d97d | 42 | srand(time(NULL)); |
yfkwok | 2:464c7e62d97d | 43 | _type = rand() % 4; // randomise type. |
yfkwok | 2:464c7e62d97d | 44 | } |
yfkwok | 2:464c7e62d97d | 45 | |
yfkwok | 2:464c7e62d97d | 46 | void Game_one::render(N5110 &lcd, int cha) |
yfkwok | 2:464c7e62d97d | 47 | { |
yfkwok | 2:464c7e62d97d | 48 | lcd.clear(); |
yfkwok | 2:464c7e62d97d | 49 | draw(lcd, cha); |
yfkwok | 2:464c7e62d97d | 50 | lcd.refresh(); |
yfkwok | 2:464c7e62d97d | 51 | } |
yfkwok | 2:464c7e62d97d | 52 | |
yfkwok | 2:464c7e62d97d | 53 | void Game_one::read_input(Gamepad &pad) |
yfkwok | 2:464c7e62d97d | 54 | { |
yfkwok | 17:5d8ff39a0e49 | 55 | // Read input from Gamepad for direction and magnitude of motion control |
yfkwok | 2:464c7e62d97d | 56 | _d = pad.get_direction(); |
yfkwok | 2:464c7e62d97d | 57 | _mag = pad.get_mag(); |
yfkwok | 2:464c7e62d97d | 58 | } |
yfkwok | 2:464c7e62d97d | 59 | |
yfkwok | 2:464c7e62d97d | 60 | void Game_one::draw(N5110 &lcd, int cha) |
yfkwok | 2:464c7e62d97d | 61 | { |
yfkwok | 2:464c7e62d97d | 62 | int alt = update_alt(); |
yfkwok | 17:5d8ff39a0e49 | 63 | // Draw player on lcd |
yfkwok | 2:464c7e62d97d | 64 | if(alt <= 1){_p1.draw(lcd, cha);} |
yfkwok | 2:464c7e62d97d | 65 | else {_p1.draw_alt(lcd, cha);} |
yfkwok | 2:464c7e62d97d | 66 | print_scores(lcd); |
yfkwok | 17:5d8ff39a0e49 | 67 | // Spawn coin if _type < _rand |
yfkwok | 2:464c7e62d97d | 68 | if(_type < _rand) {_coin.draw(lcd);} |
yfkwok | 17:5d8ff39a0e49 | 69 | // Spawn block if _type > _rand |
yfkwok | 2:464c7e62d97d | 70 | else {_block.draw(lcd);} |
yfkwok | 2:464c7e62d97d | 71 | } |
yfkwok | 2:464c7e62d97d | 72 | |
yfkwok | 2:464c7e62d97d | 73 | void Game_one::update(Gamepad &pad, N5110 &lcd) |
yfkwok | 2:464c7e62d97d | 74 | { |
yfkwok | 2:464c7e62d97d | 75 | if(_type < _rand) { |
yfkwok | 2:464c7e62d97d | 76 | check_miss_coin(pad); |
yfkwok | 2:464c7e62d97d | 77 | _p1.update(_d,_mag); |
yfkwok | 2:464c7e62d97d | 78 | _coin.update(); |
yfkwok | 2:464c7e62d97d | 79 | check_player_collect(pad); |
yfkwok | 2:464c7e62d97d | 80 | } |
yfkwok | 2:464c7e62d97d | 81 | else { |
yfkwok | 2:464c7e62d97d | 82 | check_miss_block(pad); |
yfkwok | 2:464c7e62d97d | 83 | _p1.update(_d,_mag); |
yfkwok | 2:464c7e62d97d | 84 | _block.update(); |
yfkwok | 2:464c7e62d97d | 85 | check_player_collide(pad, lcd); |
yfkwok | 2:464c7e62d97d | 86 | } |
yfkwok | 2:464c7e62d97d | 87 | } |
yfkwok | 2:464c7e62d97d | 88 | |
yfkwok | 2:464c7e62d97d | 89 | void Game_one::check_player_collect(Gamepad &pad) |
yfkwok | 2:464c7e62d97d | 90 | { |
yfkwok | 2:464c7e62d97d | 91 | // read current coin attributes |
yfkwok | 2:464c7e62d97d | 92 | Vector2D coin_pos = _coin.get_pos(); |
yfkwok | 2:464c7e62d97d | 93 | int coin_speed = _coin.get_velocity(); |
yfkwok | 2:464c7e62d97d | 94 | |
yfkwok | 2:464c7e62d97d | 95 | // check p1 first |
yfkwok | 2:464c7e62d97d | 96 | Vector2D p1_pos = _p1.get_pos(); |
yfkwok | 2:464c7e62d97d | 97 | |
yfkwok | 2:464c7e62d97d | 98 | // see if coin has hit the player by checking for overlaps |
yfkwok | 2:464c7e62d97d | 99 | if ( |
yfkwok | 2:464c7e62d97d | 100 | (coin_pos.y >= p1_pos.y) && //top |
yfkwok | 2:464c7e62d97d | 101 | (coin_pos.y <= p1_pos.y + 21) && //bottom |
yfkwok | 2:464c7e62d97d | 102 | (coin_pos.x >= _p1x) && //left |
yfkwok | 2:464c7e62d97d | 103 | (coin_pos.x <= _p1x + 17) //right |
yfkwok | 2:464c7e62d97d | 104 | ) |
yfkwok | 2:464c7e62d97d | 105 | { |
yfkwok | 2:464c7e62d97d | 106 | // write new attributes |
yfkwok | 2:464c7e62d97d | 107 | _p1.add_score(); |
yfkwok | 2:464c7e62d97d | 108 | _coin.init(_speed); |
yfkwok | 2:464c7e62d97d | 109 | music.coin(pad); |
yfkwok | 2:464c7e62d97d | 110 | _count++; |
yfkwok | 17:5d8ff39a0e49 | 111 | _type = rand() % 8; // re-randomise _type to create new object if coin is being collected |
yfkwok | 2:464c7e62d97d | 112 | } |
yfkwok | 2:464c7e62d97d | 113 | } |
yfkwok | 2:464c7e62d97d | 114 | |
yfkwok | 2:464c7e62d97d | 115 | void Game_one::check_player_collide(Gamepad &pad, N5110 &lcd) |
yfkwok | 2:464c7e62d97d | 116 | { |
yfkwok | 2:464c7e62d97d | 117 | // read current block attributes |
yfkwok | 2:464c7e62d97d | 118 | Vector2D block_pos = _block.get_pos(); |
yfkwok | 2:464c7e62d97d | 119 | int block_speed = _block.get_velocity(); |
yfkwok | 2:464c7e62d97d | 120 | |
yfkwok | 2:464c7e62d97d | 121 | Vector2D p1_pos = _p1.get_pos(); |
yfkwok | 2:464c7e62d97d | 122 | |
yfkwok | 2:464c7e62d97d | 123 | // see if block has hit the player by checking for overlaps |
yfkwok | 2:464c7e62d97d | 124 | if ( |
yfkwok | 5:bc0691d02fd5 | 125 | (block_pos.y >= p1_pos.y - 6) && //top |
yfkwok | 5:bc0691d02fd5 | 126 | (block_pos.y <= p1_pos.y + 14) && //bottom |
yfkwok | 2:464c7e62d97d | 127 | (block_pos.x >= _p1x) && //left |
yfkwok | 2:464c7e62d97d | 128 | (block_pos.x <= _p1x + 17) //right |
yfkwok | 2:464c7e62d97d | 129 | ) |
yfkwok | 2:464c7e62d97d | 130 | { |
yfkwok | 17:5d8ff39a0e49 | 131 | // write new attributes, execute gameover screen when block is collided |
yfkwok | 2:464c7e62d97d | 132 | _block.init(_speed); |
yfkwok | 2:464c7e62d97d | 133 | gameover(lcd, pad); |
yfkwok | 2:464c7e62d97d | 134 | } |
yfkwok | 2:464c7e62d97d | 135 | } |
yfkwok | 2:464c7e62d97d | 136 | |
yfkwok | 2:464c7e62d97d | 137 | void Game_one::check_miss_coin(Gamepad &pad) |
yfkwok | 2:464c7e62d97d | 138 | { |
yfkwok | 2:464c7e62d97d | 139 | Vector2D coin_pos = _coin.get_pos(); |
yfkwok | 17:5d8ff39a0e49 | 140 | // Check if the player has missed |
yfkwok | 2:464c7e62d97d | 141 | if (coin_pos.x > WIDTH) { |
yfkwok | 2:464c7e62d97d | 142 | _coin.init(_speed); |
yfkwok | 2:464c7e62d97d | 143 | pad.tone(750.0,0.1); |
yfkwok | 17:5d8ff39a0e49 | 144 | _count++; // Add 1 to increase coin counter to terminate game loop after 10 coins appeared |
yfkwok | 2:464c7e62d97d | 145 | wait(0.1); |
yfkwok | 17:5d8ff39a0e49 | 146 | _type = rand() % 8; // re-randomise _type to create new object when coin is missed |
yfkwok | 2:464c7e62d97d | 147 | } |
yfkwok | 2:464c7e62d97d | 148 | |
yfkwok | 2:464c7e62d97d | 149 | } |
yfkwok | 2:464c7e62d97d | 150 | |
yfkwok | 2:464c7e62d97d | 151 | void Game_one::check_miss_block(Gamepad &pad) |
yfkwok | 2:464c7e62d97d | 152 | { |
yfkwok | 2:464c7e62d97d | 153 | Vector2D block_pos = _block.get_pos(); |
yfkwok | 17:5d8ff39a0e49 | 154 | // Check if player has missed |
yfkwok | 2:464c7e62d97d | 155 | if (block_pos.x > WIDTH) { |
yfkwok | 2:464c7e62d97d | 156 | _block.init(_speed); |
yfkwok | 2:464c7e62d97d | 157 | pad.tone(750.0,0.1); |
yfkwok | 2:464c7e62d97d | 158 | wait(0.1); |
yfkwok | 17:5d8ff39a0e49 | 159 | _type = rand() % 8; // re-randomise _type to create new object when block is missed |
yfkwok | 2:464c7e62d97d | 160 | } |
yfkwok | 2:464c7e62d97d | 161 | |
yfkwok | 2:464c7e62d97d | 162 | } |
yfkwok | 2:464c7e62d97d | 163 | |
yfkwok | 2:464c7e62d97d | 164 | int Game_one::print_scores(N5110 &lcd) |
yfkwok | 2:464c7e62d97d | 165 | { |
yfkwok | 2:464c7e62d97d | 166 | // get scores from paddles |
yfkwok | 2:464c7e62d97d | 167 | int p1_score = _p1.get_score(); |
yfkwok | 2:464c7e62d97d | 168 | int total = get_count(); |
yfkwok | 2:464c7e62d97d | 169 | |
yfkwok | 2:464c7e62d97d | 170 | // print to LCD i |
yfkwok | 2:464c7e62d97d | 171 | char buffer1[14]; |
yfkwok | 2:464c7e62d97d | 172 | sprintf(buffer1,"%2d / %2d",p1_score, total); |
yfkwok | 2:464c7e62d97d | 173 | lcd.printString(buffer1,WIDTH/2 - 20,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits |
yfkwok | 2:464c7e62d97d | 174 | return p1_score; |
yfkwok | 2:464c7e62d97d | 175 | } |
yfkwok | 2:464c7e62d97d | 176 | |
yfkwok | 2:464c7e62d97d | 177 | void Game_one::set_count(int count) |
yfkwok | 2:464c7e62d97d | 178 | { |
yfkwok | 2:464c7e62d97d | 179 | _count = count; |
yfkwok | 2:464c7e62d97d | 180 | } |
yfkwok | 2:464c7e62d97d | 181 | |
yfkwok | 2:464c7e62d97d | 182 | int Game_one::get_count() |
yfkwok | 2:464c7e62d97d | 183 | { |
yfkwok | 2:464c7e62d97d | 184 | int count = _count; |
yfkwok | 2:464c7e62d97d | 185 | return count; |
yfkwok | 2:464c7e62d97d | 186 | } |
yfkwok | 2:464c7e62d97d | 187 | |
yfkwok | 2:464c7e62d97d | 188 | void Game_one::set_alt(int alt) |
yfkwok | 2:464c7e62d97d | 189 | { |
yfkwok | 2:464c7e62d97d | 190 | _alt = alt; |
yfkwok | 2:464c7e62d97d | 191 | } |
yfkwok | 2:464c7e62d97d | 192 | |
yfkwok | 2:464c7e62d97d | 193 | int Game_one::update_alt() |
yfkwok | 2:464c7e62d97d | 194 | { |
yfkwok | 17:5d8ff39a0e49 | 195 | // _alt parameter to alter the character sprite to create run animation |
yfkwok | 2:464c7e62d97d | 196 | if(_alt < 4){_alt = _alt++;} |
yfkwok | 2:464c7e62d97d | 197 | else {_alt=0;} |
yfkwok | 2:464c7e62d97d | 198 | int alt = _alt; |
yfkwok | 2:464c7e62d97d | 199 | return alt; |
yfkwok | 2:464c7e62d97d | 200 | } |
yfkwok | 2:464c7e62d97d | 201 | |
yfkwok | 2:464c7e62d97d | 202 | void Game_one::gameover(N5110 &lcd, Gamepad &pad) |
yfkwok | 2:464c7e62d97d | 203 | { |
yfkwok | 17:5d8ff39a0e49 | 204 | // Gameover screen instructions |
yfkwok | 2:464c7e62d97d | 205 | while(pad.check_event(Gamepad::B_PRESSED) == false) { |
yfkwok | 2:464c7e62d97d | 206 | lcd.clear(); |
yfkwok | 2:464c7e62d97d | 207 | lcd.printString("You rushed ",0,0); |
yfkwok | 2:464c7e62d97d | 208 | lcd.printString("into a block!",0,1); |
yfkwok | 2:464c7e62d97d | 209 | lcd.printString("You are late",0,2); |
yfkwok | 2:464c7e62d97d | 210 | lcd.printString("for class!",0,3); |
yfkwok | 2:464c7e62d97d | 211 | lcd.printString("Press B",0,5); |
yfkwok | 2:464c7e62d97d | 212 | lcd.refresh(); |
yfkwok | 2:464c7e62d97d | 213 | wait(0.1); |
yfkwok | 2:464c7e62d97d | 214 | } |
yfkwok | 2:464c7e62d97d | 215 | _count = 10; |
yfkwok | 4:5bc9c4363d31 | 216 | } |
yfkwok | 4:5bc9c4363d31 | 217 | |
yfkwok | 4:5bc9c4363d31 | 218 | void Game_one::intro(Gamepad &pad, N5110 &lcd) |
yfkwok | 4:5bc9c4363d31 | 219 | { |
yfkwok | 17:5d8ff39a0e49 | 220 | // Game 1 instruction pages |
yfkwok | 4:5bc9c4363d31 | 221 | Page currentPage = PAGE_1; |
yfkwok | 4:5bc9c4363d31 | 222 | int fps = 8.0; |
yfkwok | 11:5a6b9dffd78a | 223 | int instruct_data[4][7] = { |
yfkwok | 11:5a6b9dffd78a | 224 | {1,1,1,1,1,1,1}, |
yfkwok | 11:5a6b9dffd78a | 225 | {0,1,1,1,1,1,0}, |
yfkwok | 11:5a6b9dffd78a | 226 | {0,0,1,1,1,0,0}, |
yfkwok | 11:5a6b9dffd78a | 227 | {0,0,0,1,0,0,0}, |
yfkwok | 4:5bc9c4363d31 | 228 | }; |
yfkwok | 4:5bc9c4363d31 | 229 | |
yfkwok | 4:5bc9c4363d31 | 230 | while(pad.check_event(Gamepad::A_PRESSED) == false){ |
yfkwok | 4:5bc9c4363d31 | 231 | switch (currentPage) { |
yfkwok | 4:5bc9c4363d31 | 232 | case PAGE_1: |
yfkwok | 4:5bc9c4363d31 | 233 | lcd.clear(); |
yfkwok | 4:5bc9c4363d31 | 234 | lcd.printString("Squirtle",0,0); |
yfkwok | 4:5bc9c4363d31 | 235 | lcd.printString("is rushing",0,1); |
yfkwok | 4:5bc9c4363d31 | 236 | lcd.printString("to his lecture",0,2); |
yfkwok | 4:5bc9c4363d31 | 237 | lcd.printString("Collect coins",0,4); |
yfkwok | 11:5a6b9dffd78a | 238 | lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data); |
yfkwok | 4:5bc9c4363d31 | 239 | lcd.refresh(); |
yfkwok | 4:5bc9c4363d31 | 240 | if(pad.get_direction() == S){currentPage = PAGE_2;} |
yfkwok | 4:5bc9c4363d31 | 241 | wait(1.0f/fps); |
yfkwok | 4:5bc9c4363d31 | 242 | break; |
yfkwok | 4:5bc9c4363d31 | 243 | case PAGE_2: |
yfkwok | 4:5bc9c4363d31 | 244 | lcd.clear(); |
yfkwok | 4:5bc9c4363d31 | 245 | lcd.printString("so he can have",0,0); |
yfkwok | 4:5bc9c4363d31 | 246 | lcd.printString("lunch and ",0,1); |
yfkwok | 4:5bc9c4363d31 | 247 | lcd.printString("reach the",0,2); |
yfkwok | 4:5bc9c4363d31 | 248 | lcd.printString("classroom in",0,3); |
yfkwok | 4:5bc9c4363d31 | 249 | lcd.printString("time by ",0,4); |
yfkwok | 11:5a6b9dffd78a | 250 | lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data); |
yfkwok | 4:5bc9c4363d31 | 251 | lcd.refresh(); |
yfkwok | 4:5bc9c4363d31 | 252 | if(pad.get_direction() == S){currentPage = PAGE_3;} |
yfkwok | 17:5d8ff39a0e49 | 253 | if(pad.get_direction() == N){currentPage = PAGE_1;} |
yfkwok | 4:5bc9c4363d31 | 254 | wait(1.0f/fps); |
yfkwok | 4:5bc9c4363d31 | 255 | break; |
yfkwok | 4:5bc9c4363d31 | 256 | case PAGE_3: |
yfkwok | 4:5bc9c4363d31 | 257 | lcd.clear(); |
yfkwok | 4:5bc9c4363d31 | 258 | lcd.printString("avoiding the",0,0); |
yfkwok | 17:5d8ff39a0e49 | 259 | lcd.printString("blocks.",0,1); |
yfkwok | 17:5d8ff39a0e49 | 260 | lcd.printString("Collect more",0,2); |
yfkwok | 17:5d8ff39a0e49 | 261 | lcd.printString("than 7 coins",0,3); |
yfkwok | 17:5d8ff39a0e49 | 262 | lcd.printString("to complete",0,4); |
yfkwok | 17:5d8ff39a0e49 | 263 | lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data); |
yfkwok | 17:5d8ff39a0e49 | 264 | lcd.refresh(); |
yfkwok | 17:5d8ff39a0e49 | 265 | if(pad.get_direction() == S){currentPage = PAGE_4;} |
yfkwok | 17:5d8ff39a0e49 | 266 | if(pad.get_direction() == N){currentPage = PAGE_2;} |
yfkwok | 17:5d8ff39a0e49 | 267 | wait(1.0f/fps); |
yfkwok | 17:5d8ff39a0e49 | 268 | break; |
yfkwok | 17:5d8ff39a0e49 | 269 | case PAGE_4: |
yfkwok | 17:5d8ff39a0e49 | 270 | lcd.clear(); |
yfkwok | 17:5d8ff39a0e49 | 271 | lcd.printString("the mission",0,0); |
yfkwok | 17:5d8ff39a0e49 | 272 | lcd.printString("successfully!",0,1); |
yfkwok | 4:5bc9c4363d31 | 273 | lcd.printString("Press A",0,5); |
yfkwok | 4:5bc9c4363d31 | 274 | lcd.refresh(); |
yfkwok | 17:5d8ff39a0e49 | 275 | if(pad.get_direction() == N){currentPage = PAGE_3;} |
yfkwok | 4:5bc9c4363d31 | 276 | wait(1.0f/fps); |
yfkwok | 17:5d8ff39a0e49 | 277 | break; |
yfkwok | 4:5bc9c4363d31 | 278 | |
yfkwok | 4:5bc9c4363d31 | 279 | } |
yfkwok | 4:5bc9c4363d31 | 280 | } |
yfkwok | 5:bc0691d02fd5 | 281 | } |
yfkwok | 5:bc0691d02fd5 | 282 |