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 03 18:40:43 2019 +0000
Revision:
4:5bc9c4363d31
Parent:
2:464c7e62d97d
Child:
5:bc0691d02fd5
3/4/2019 - Created evolution music and animation for Squirtle

Who changed what in which revision?

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