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

Committer:
yfkwok
Date:
Wed Apr 17 17:53:56 2019 +0000
Revision:
13:02002658e718
Child:
14:abe64fe0b6a5
17/04/2019 - Update Game_two template

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yfkwok 13:02002658e718 1 #include "Game_two.h"
yfkwok 13:02002658e718 2
yfkwok 13:02002658e718 3 Game_two::Game_two()
yfkwok 13:02002658e718 4 {
yfkwok 13:02002658e718 5
yfkwok 13:02002658e718 6 }
yfkwok 13:02002658e718 7
yfkwok 13:02002658e718 8 Game_two::~Game_two()
yfkwok 13:02002658e718 9 {
yfkwok 13:02002658e718 10
yfkwok 13:02002658e718 11 }
yfkwok 13:02002658e718 12
yfkwok 13:02002658e718 13 //Enumerate instruction menu from page 1 - 3
yfkwok 13:02002658e718 14 enum Page {
yfkwok 13:02002658e718 15 PAGE_1, PAGE_2, PAGE_3
yfkwok 13:02002658e718 16 };
yfkwok 13:02002658e718 17
yfkwok 13:02002658e718 18 void Game_two::init(int speed, int cha, int r)
yfkwok 13:02002658e718 19 {
yfkwok 13:02002658e718 20 // Set the speed of the objects
yfkwok 13:02002658e718 21 _speed = speed;
yfkwok 13:02002658e718 22
yfkwok 13:02002658e718 23 // Set the character being drawn
yfkwok 13:02002658e718 24 _cha = cha;
yfkwok 13:02002658e718 25
yfkwok 13:02002658e718 26 // Set the random parameter for coin/block ratio
yfkwok 13:02002658e718 27 _rand = r;
yfkwok 13:02002658e718 28
yfkwok 13:02002658e718 29 // initialize round counter
yfkwok 13:02002658e718 30 _count = 0;
yfkwok 13:02002658e718 31 _alt = 0;
yfkwok 13:02002658e718 32
yfkwok 13:02002658e718 33 }
yfkwok 13:02002658e718 34
yfkwok 13:02002658e718 35 /*void Game_two::render(N5110 &lcd, int cha)
yfkwok 13:02002658e718 36 {
yfkwok 13:02002658e718 37 lcd.clear();
yfkwok 13:02002658e718 38 draw(lcd, cha);
yfkwok 13:02002658e718 39 lcd.refresh();
yfkwok 13:02002658e718 40 }
yfkwok 13:02002658e718 41
yfkwok 13:02002658e718 42 void Game_two::read_input(Gamepad &pad)
yfkwok 13:02002658e718 43 {
yfkwok 13:02002658e718 44 _d = pad.get_direction();
yfkwok 13:02002658e718 45 _mag = pad.get_mag();
yfkwok 13:02002658e718 46 }
yfkwok 13:02002658e718 47
yfkwok 13:02002658e718 48 void Game_two::draw(N5110 &lcd, int cha)
yfkwok 13:02002658e718 49 {
yfkwok 13:02002658e718 50 int alt = update_alt();
yfkwok 13:02002658e718 51 // draw player on lcd
yfkwok 13:02002658e718 52 if(alt <= 1){_p1.draw(lcd, cha);}
yfkwok 13:02002658e718 53 else {_p1.draw_alt(lcd, cha);}
yfkwok 13:02002658e718 54 print_scores(lcd);
yfkwok 13:02002658e718 55 // spawn coin
yfkwok 13:02002658e718 56 if(_type < _rand) {_coin.draw(lcd);}
yfkwok 13:02002658e718 57 else {_block.draw(lcd);}
yfkwok 13:02002658e718 58 }
yfkwok 13:02002658e718 59
yfkwok 13:02002658e718 60 void Game_two::update(Gamepad &pad, N5110 &lcd)
yfkwok 13:02002658e718 61 {
yfkwok 13:02002658e718 62 if(_type < _rand) {
yfkwok 13:02002658e718 63 check_miss_coin(pad);
yfkwok 13:02002658e718 64 _p1.update(_d,_mag);
yfkwok 13:02002658e718 65 _coin.update();
yfkwok 13:02002658e718 66 check_player_collect(pad);
yfkwok 13:02002658e718 67 }
yfkwok 13:02002658e718 68 else {
yfkwok 13:02002658e718 69 check_miss_block(pad);
yfkwok 13:02002658e718 70 _p1.update(_d,_mag);
yfkwok 13:02002658e718 71 _block.update();
yfkwok 13:02002658e718 72 check_player_collide(pad, lcd);
yfkwok 13:02002658e718 73 }
yfkwok 13:02002658e718 74 }
yfkwok 13:02002658e718 75
yfkwok 13:02002658e718 76 void Game_two::check_player_collect(Gamepad &pad)
yfkwok 13:02002658e718 77 {
yfkwok 13:02002658e718 78 // read current coin attributes
yfkwok 13:02002658e718 79 Vector2D coin_pos = _coin.get_pos();
yfkwok 13:02002658e718 80 int coin_speed = _coin.get_velocity();
yfkwok 13:02002658e718 81
yfkwok 13:02002658e718 82 // check p1 first
yfkwok 13:02002658e718 83 Vector2D p1_pos = _p1.get_pos();
yfkwok 13:02002658e718 84
yfkwok 13:02002658e718 85 // see if coin has hit the player by checking for overlaps
yfkwok 13:02002658e718 86 if (
yfkwok 13:02002658e718 87 (coin_pos.y >= p1_pos.y) && //top
yfkwok 13:02002658e718 88 (coin_pos.y <= p1_pos.y + 21) && //bottom
yfkwok 13:02002658e718 89 (coin_pos.x >= _p1x) && //left
yfkwok 13:02002658e718 90 (coin_pos.x <= _p1x + 17) //right
yfkwok 13:02002658e718 91 )
yfkwok 13:02002658e718 92 {
yfkwok 13:02002658e718 93 // write new attributes
yfkwok 13:02002658e718 94 _p1.add_score();
yfkwok 13:02002658e718 95 _coin.init(_speed);
yfkwok 13:02002658e718 96 music.coin(pad);
yfkwok 13:02002658e718 97 _count++;
yfkwok 13:02002658e718 98 _type = rand() % 8; // randomise type
yfkwok 13:02002658e718 99 }
yfkwok 13:02002658e718 100 }
yfkwok 13:02002658e718 101
yfkwok 13:02002658e718 102 void Game_two::check_player_collide(Gamepad &pad, N5110 &lcd)
yfkwok 13:02002658e718 103 {
yfkwok 13:02002658e718 104 // read current block attributes
yfkwok 13:02002658e718 105 Vector2D block_pos = _block.get_pos();
yfkwok 13:02002658e718 106 int block_speed = _block.get_velocity();
yfkwok 13:02002658e718 107
yfkwok 13:02002658e718 108 Vector2D p1_pos = _p1.get_pos();
yfkwok 13:02002658e718 109
yfkwok 13:02002658e718 110 // see if block has hit the player by checking for overlaps
yfkwok 13:02002658e718 111 if (
yfkwok 13:02002658e718 112 (block_pos.y >= p1_pos.y - 6) && //top
yfkwok 13:02002658e718 113 (block_pos.y <= p1_pos.y + 14) && //bottom
yfkwok 13:02002658e718 114 (block_pos.x >= _p1x) && //left
yfkwok 13:02002658e718 115 (block_pos.x <= _p1x + 17) //right
yfkwok 13:02002658e718 116 )
yfkwok 13:02002658e718 117 {
yfkwok 13:02002658e718 118 // write new attributes
yfkwok 13:02002658e718 119 _block.init(_speed);
yfkwok 13:02002658e718 120 gameover(lcd, pad);
yfkwok 13:02002658e718 121 }
yfkwok 13:02002658e718 122 }
yfkwok 13:02002658e718 123
yfkwok 13:02002658e718 124 void Game_two::check_miss_coin(Gamepad &pad)
yfkwok 13:02002658e718 125 {
yfkwok 13:02002658e718 126 Vector2D coin_pos = _coin.get_pos();
yfkwok 13:02002658e718 127 // player has missed
yfkwok 13:02002658e718 128 if (coin_pos.x > WIDTH) {
yfkwok 13:02002658e718 129 _coin.init(_speed);
yfkwok 13:02002658e718 130 pad.tone(750.0,0.1);
yfkwok 13:02002658e718 131 _count++;
yfkwok 13:02002658e718 132 wait(0.1);
yfkwok 13:02002658e718 133 _type = rand() % 8; // randomise type
yfkwok 13:02002658e718 134 }
yfkwok 13:02002658e718 135
yfkwok 13:02002658e718 136 }
yfkwok 13:02002658e718 137
yfkwok 13:02002658e718 138 void Game_two::check_miss_block(Gamepad &pad)
yfkwok 13:02002658e718 139 {
yfkwok 13:02002658e718 140 Vector2D block_pos = _block.get_pos();
yfkwok 13:02002658e718 141 // player has missed
yfkwok 13:02002658e718 142 if (block_pos.x > WIDTH) {
yfkwok 13:02002658e718 143 _block.init(_speed);
yfkwok 13:02002658e718 144 pad.tone(750.0,0.1);
yfkwok 13:02002658e718 145 wait(0.1);
yfkwok 13:02002658e718 146 _type = rand() % 8; // randomise type
yfkwok 13:02002658e718 147 }
yfkwok 13:02002658e718 148
yfkwok 13:02002658e718 149 }
yfkwok 13:02002658e718 150
yfkwok 13:02002658e718 151 int Game_two::print_scores(N5110 &lcd)
yfkwok 13:02002658e718 152 {
yfkwok 13:02002658e718 153 // get scores from paddles
yfkwok 13:02002658e718 154 int p1_score = _p1.get_score();
yfkwok 13:02002658e718 155 int total = get_count();
yfkwok 13:02002658e718 156
yfkwok 13:02002658e718 157 // print to LCD i
yfkwok 13:02002658e718 158 char buffer1[14];
yfkwok 13:02002658e718 159 sprintf(buffer1,"%2d / %2d",p1_score, total);
yfkwok 13:02002658e718 160 lcd.printString(buffer1,WIDTH/2 - 20,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
yfkwok 13:02002658e718 161 return p1_score;
yfkwok 13:02002658e718 162 }
yfkwok 13:02002658e718 163
yfkwok 13:02002658e718 164 void Game_two::set_count(int count)
yfkwok 13:02002658e718 165 {
yfkwok 13:02002658e718 166 _count = count;
yfkwok 13:02002658e718 167 }
yfkwok 13:02002658e718 168
yfkwok 13:02002658e718 169 int Game_two::get_count()
yfkwok 13:02002658e718 170 {
yfkwok 13:02002658e718 171 int count = _count;
yfkwok 13:02002658e718 172 return count;
yfkwok 13:02002658e718 173 }
yfkwok 13:02002658e718 174
yfkwok 13:02002658e718 175 void Game_two::set_alt(int alt)
yfkwok 13:02002658e718 176 {
yfkwok 13:02002658e718 177 _alt = alt;
yfkwok 13:02002658e718 178 }
yfkwok 13:02002658e718 179
yfkwok 13:02002658e718 180 int Game_two::update_alt()
yfkwok 13:02002658e718 181 {
yfkwok 13:02002658e718 182 if(_alt < 4){_alt = _alt++;}
yfkwok 13:02002658e718 183 else {_alt=0;}
yfkwok 13:02002658e718 184 int alt = _alt;
yfkwok 13:02002658e718 185 return alt;
yfkwok 13:02002658e718 186 }
yfkwok 13:02002658e718 187
yfkwok 13:02002658e718 188 void Game_two::gameover(N5110 &lcd, Gamepad &pad)
yfkwok 13:02002658e718 189 {
yfkwok 13:02002658e718 190 while(pad.check_event(Gamepad::B_PRESSED) == false) {
yfkwok 13:02002658e718 191 lcd.clear();
yfkwok 13:02002658e718 192 lcd.printString("You rushed ",0,0);
yfkwok 13:02002658e718 193 lcd.printString("into a block!",0,1);
yfkwok 13:02002658e718 194 lcd.printString("You are late",0,2);
yfkwok 13:02002658e718 195 lcd.printString("for class!",0,3);
yfkwok 13:02002658e718 196 lcd.printString("Press B",0,5);
yfkwok 13:02002658e718 197 lcd.refresh();
yfkwok 13:02002658e718 198 wait(0.1);
yfkwok 13:02002658e718 199 }
yfkwok 13:02002658e718 200 _count = 10;
yfkwok 13:02002658e718 201 }
yfkwok 13:02002658e718 202
yfkwok 13:02002658e718 203 void Game_two::intro(Gamepad &pad, N5110 &lcd)
yfkwok 13:02002658e718 204 {
yfkwok 13:02002658e718 205 Page currentPage = PAGE_1;
yfkwok 13:02002658e718 206 int fps = 8.0;
yfkwok 13:02002658e718 207 int instruct_data[4][7] = {
yfkwok 13:02002658e718 208 {1,1,1,1,1,1,1},
yfkwok 13:02002658e718 209 {0,1,1,1,1,1,0},
yfkwok 13:02002658e718 210 {0,0,1,1,1,0,0},
yfkwok 13:02002658e718 211 {0,0,0,1,0,0,0},
yfkwok 13:02002658e718 212 };
yfkwok 13:02002658e718 213
yfkwok 13:02002658e718 214 while(pad.check_event(Gamepad::A_PRESSED) == false){
yfkwok 13:02002658e718 215 switch (currentPage) {
yfkwok 13:02002658e718 216 case PAGE_1:
yfkwok 13:02002658e718 217 lcd.clear();
yfkwok 13:02002658e718 218 lcd.printString("Squirtle",0,0);
yfkwok 13:02002658e718 219 lcd.printString("is rushing",0,1);
yfkwok 13:02002658e718 220 lcd.printString("to his lecture",0,2);
yfkwok 13:02002658e718 221 lcd.printString("Collect coins",0,4);
yfkwok 13:02002658e718 222 lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data);
yfkwok 13:02002658e718 223 lcd.refresh();
yfkwok 13:02002658e718 224 if(pad.get_direction() == S){currentPage = PAGE_2;}
yfkwok 13:02002658e718 225 wait(1.0f/fps);
yfkwok 13:02002658e718 226 break;
yfkwok 13:02002658e718 227 case PAGE_2:
yfkwok 13:02002658e718 228 lcd.clear();
yfkwok 13:02002658e718 229 lcd.printString("so he can have",0,0);
yfkwok 13:02002658e718 230 lcd.printString("lunch and ",0,1);
yfkwok 13:02002658e718 231 lcd.printString("reach the",0,2);
yfkwok 13:02002658e718 232 lcd.printString("classroom in",0,3);
yfkwok 13:02002658e718 233 lcd.printString("time by ",0,4);
yfkwok 13:02002658e718 234 lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data);
yfkwok 13:02002658e718 235 lcd.refresh();
yfkwok 13:02002658e718 236 if(pad.get_direction() == S){currentPage = PAGE_3;}
yfkwok 13:02002658e718 237 wait(1.0f/fps);
yfkwok 13:02002658e718 238 break;
yfkwok 13:02002658e718 239 case PAGE_3:
yfkwok 13:02002658e718 240 lcd.clear();
yfkwok 13:02002658e718 241 lcd.printString("avoiding the",0,0);
yfkwok 13:02002658e718 242 lcd.printString("blocks",0,1);
yfkwok 13:02002658e718 243 lcd.printString("Press A",0,5);
yfkwok 13:02002658e718 244 lcd.refresh();
yfkwok 13:02002658e718 245 wait(1.0f/fps);
yfkwok 13:02002658e718 246
yfkwok 13:02002658e718 247 }
yfkwok 13:02002658e718 248 }
yfkwok 13:02002658e718 249 }
yfkwok 13:02002658e718 250
yfkwok 13:02002658e718 251 */