ELEC2645 (2018/19) / Mbed 2 deprecated el17arm

Dependencies:   mbed

Committer:
el17arm
Date:
Tue Apr 16 18:18:44 2019 +0000
Revision:
42:d81c008b0436
Parent:
41:0cf320f73424
Child:
43:1ec6b6293c6b
fixed problem of player occasionally falling into the 'solid blocks'

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17arm 29:d85886364643 1 #include "Gameengine.h"
el17arm 29:d85886364643 2
el17arm 41:0cf320f73424 3
el17arm 29:d85886364643 4 Gameengine::Gameengine()
el17arm 29:d85886364643 5 {
el17arm 29:d85886364643 6 }
el17arm 29:d85886364643 7
el17arm 29:d85886364643 8 Gameengine::~Gameengine()
el17arm 29:d85886364643 9 {
el17arm 29:d85886364643 10 }
el17arm 29:d85886364643 11
el17arm 29:d85886364643 12 void Gameengine::game_init()
el17arm 29:d85886364643 13 {
el17arm 40:913339e324b8 14 _turn_flag = false;
el17arm 40:913339e324b8 15 _enem_flag = false;
el17arm 40:913339e324b8 16 _key_reinit = false;
el17arm 40:913339e324b8 17 _five_keys = 5;
el17arm 42:d81c008b0436 18 _level = 1;
el17arm 33:023f57d52b1c 19 _sprites.miner_init(3, 33);
el17arm 29:d85886364643 20 _lives = 3;
el17arm 41:0cf320f73424 21 _time = 120;
el17arm 41:0cf320f73424 22
el17arm 29:d85886364643 23 }
el17arm 29:d85886364643 24
el17arm 29:d85886364643 25 void Gameengine::update(N5110 &lcd, Gamepad &pad)
el17arm 29:d85886364643 26 {
el17arm 42:d81c008b0436 27 _lev.level_exits(lcd);
el17arm 29:d85886364643 28 read_direction(pad);
el17arm 38:55bb9da08a52 29 _sprites.miner_draw(lcd);
el17arm 33:023f57d52b1c 30 _sprites.miner_move(_d, lcd);
el17arm 33:023f57d52b1c 31 _sprites.miner_gravity(lcd);
el17arm 33:023f57d52b1c 32 _sprites.miner_jump(lcd, pad);
el17arm 33:023f57d52b1c 33 _sprites.miner_land(lcd);
el17arm 40:913339e324b8 34 _sprites.keys_collected();
el17arm 40:913339e324b8 35 key_draw(lcd, pad);
el17arm 41:0cf320f73424 36 lose_life(pad, lcd);
el17arm 29:d85886364643 37 game_over();
el17arm 29:d85886364643 38 next_level(lcd);
el17arm 41:0cf320f73424 39 oxygen_leds();
el17arm 41:0cf320f73424 40 lives_leds();
el17arm 41:0cf320f73424 41 }
el17arm 41:0cf320f73424 42
el17arm 41:0cf320f73424 43 void Gameengine::draw_l1(N5110 &lcd, Gamepad &pad)
el17arm 41:0cf320f73424 44 {
el17arm 41:0cf320f73424 45 if (_level == 0) {
el17arm 41:0cf320f73424 46
el17arm 41:0cf320f73424 47 _t.start();
el17arm 42:d81c008b0436 48 _lev.level_platforms1(lcd);
el17arm 42:d81c008b0436 49 _lev.key_pos1();
el17arm 42:d81c008b0436 50 _lev.trap_pos1();
el17arm 42:d81c008b0436 51 _lev.block_pos1();
el17arm 42:d81c008b0436 52 _lev.soft_pos1();
el17arm 42:d81c008b0436 53 _lev.enem_pos1();
el17arm 41:0cf320f73424 54 blocks(lcd);
el17arm 41:0cf320f73424 55
el17arm 41:0cf320f73424 56 }
el17arm 41:0cf320f73424 57 }
el17arm 41:0cf320f73424 58 void Gameengine::draw_l2(N5110 &lcd, Gamepad &pad)
el17arm 41:0cf320f73424 59 {
el17arm 41:0cf320f73424 60 if(_level == 1) {
el17arm 41:0cf320f73424 61
el17arm 41:0cf320f73424 62 _t.start();
el17arm 41:0cf320f73424 63 key_reinit();
el17arm 42:d81c008b0436 64 _lev.level_platforms2(lcd);
el17arm 42:d81c008b0436 65 //_lev.key_pos2();
el17arm 42:d81c008b0436 66 //_lev.trap_pos2();
el17arm 42:d81c008b0436 67 _lev.block_pos2();
el17arm 42:d81c008b0436 68 _lev.soft_pos2();
el17arm 42:d81c008b0436 69 //_lev.enem_pos2();
el17arm 41:0cf320f73424 70 blocks(lcd);
el17arm 41:0cf320f73424 71 }
el17arm 29:d85886364643 72 }
el17arm 29:d85886364643 73
el17arm 38:55bb9da08a52 74 void Gameengine::read_direction(Gamepad &pad)
el17arm 38:55bb9da08a52 75 {
el17arm 38:55bb9da08a52 76 _d = pad.get_direction();
el17arm 38:55bb9da08a52 77 }
el17arm 38:55bb9da08a52 78
el17arm 41:0cf320f73424 79 void Gameengine::lose_life(Gamepad &pad, N5110 &lcd)
el17arm 29:d85886364643 80 {
el17arm 40:913339e324b8 81 if (trap_death(lcd) == true || enemies(lcd) == true) {
el17arm 29:d85886364643 82 _lives--;
el17arm 41:0cf320f73424 83 pad.tone(200, 0.5);
el17arm 33:023f57d52b1c 84 _sprites.miner_init(3, 33);
el17arm 29:d85886364643 85 wait(1);
el17arm 29:d85886364643 86 }
el17arm 29:d85886364643 87 }
el17arm 29:d85886364643 88
el17arm 29:d85886364643 89 bool Gameengine::game_over()
el17arm 29:d85886364643 90 {
el17arm 41:0cf320f73424 91 if(_lives == 0 || _t.read() > _time) {
el17arm 41:0cf320f73424 92 _t.stop();
el17arm 41:0cf320f73424 93
el17arm 29:d85886364643 94 return true;
el17arm 41:0cf320f73424 95 }
el17arm 29:d85886364643 96 return false;
el17arm 29:d85886364643 97 }
el17arm 29:d85886364643 98
el17arm 40:913339e324b8 99 bool Gameengine::level_exit(N5110 &lcd)
el17arm 41:0cf320f73424 100 {
el17arm 40:913339e324b8 101 int i = _level;
el17arm 42:d81c008b0436 102 if(_sprites.exit_level(_lev.exit1.lx[i],_lev.exit1.ly[i],lcd) == true) {
el17arm 40:913339e324b8 103 return true;
el17arm 40:913339e324b8 104 } else {
el17arm 40:913339e324b8 105 return false;
el17arm 40:913339e324b8 106 }
el17arm 40:913339e324b8 107 }
el17arm 40:913339e324b8 108
el17arm 40:913339e324b8 109 void Gameengine::next_level(N5110 &lcd)
el17arm 40:913339e324b8 110 {
el17arm 40:913339e324b8 111 if(level_exit(lcd) && _sprites.keys_collected() == _five_keys) {
el17arm 41:0cf320f73424 112 _t.stop();
el17arm 41:0cf320f73424 113 _total_time += (_time - _t.read());
el17arm 40:913339e324b8 114 _level = _level++;
el17arm 40:913339e324b8 115 _five_keys += 5;
el17arm 40:913339e324b8 116 _sprites.miner_init(3,33);
el17arm 40:913339e324b8 117 _key_reinit = false;
el17arm 41:0cf320f73424 118 _t.reset();
el17arm 29:d85886364643 119 }
el17arm 34:c5a042973e0c 120 }
el17arm 34:c5a042973e0c 121
el17arm 34:c5a042973e0c 122 bool Gameengine::trap_death(N5110 &lcd)
el17arm 41:0cf320f73424 123 {
el17arm 40:913339e324b8 124 int i = _level;
el17arm 42:d81c008b0436 125 if( _sprites.trap(_lev.trap1.tx[i], _lev.trap1.ty[i], lcd) ||
el17arm 42:d81c008b0436 126 _sprites.trap(_lev.trap2.tx[i], _lev.trap2.ty[i], lcd) ||
el17arm 42:d81c008b0436 127 _sprites.trap(_lev.trap3.tx[i], _lev.trap3.ty[i], lcd) ||
el17arm 42:d81c008b0436 128 _sprites.trap(_lev.trap4.tx[i], _lev.trap4.ty[i], lcd) ||
el17arm 42:d81c008b0436 129 _sprites.trap(_lev.trap5.tx[i], _lev.trap5.ty[i], lcd)) {
el17arm 34:c5a042973e0c 130 return true;
el17arm 40:913339e324b8 131 }
el17arm 40:913339e324b8 132 return false;
el17arm 34:c5a042973e0c 133 }
el17arm 34:c5a042973e0c 134
el17arm 37:4d525a37d5d2 135 void Gameengine::key_draw(N5110 &lcd, Gamepad &pad)
el17arm 41:0cf320f73424 136 {
el17arm 40:913339e324b8 137 int i = _level;
el17arm 42:d81c008b0436 138 _sprites.key_collect(0, _lev.key1.kx[i], _lev.key1.ky[i], lcd, pad);
el17arm 42:d81c008b0436 139 _sprites.key_collect(1, _lev.key2.kx[i], _lev.key2.ky[i], lcd, pad);
el17arm 42:d81c008b0436 140 _sprites.key_collect(2, _lev.key3.kx[i], _lev.key3.ky[i], lcd, pad);
el17arm 42:d81c008b0436 141 _sprites.key_collect(3, _lev.key4.kx[i], _lev.key4.ky[i], lcd, pad);
el17arm 42:d81c008b0436 142 _sprites.key_collect(4, _lev.key5.kx[i], _lev.key5.ky[i], lcd, pad);
el17arm 40:913339e324b8 143 }
el17arm 40:913339e324b8 144
el17arm 40:913339e324b8 145 void Gameengine::key_reinit()
el17arm 37:4d525a37d5d2 146 {
el17arm 40:913339e324b8 147 if(_key_reinit == false) {
el17arm 40:913339e324b8 148 for(int i = 0; i<5; i++) {
el17arm 40:913339e324b8 149 _sprites._k.key[i] = false;
el17arm 40:913339e324b8 150 _key_reinit = true;
el17arm 40:913339e324b8 151 }
el17arm 40:913339e324b8 152 }
el17arm 38:55bb9da08a52 153 }
el17arm 38:55bb9da08a52 154
el17arm 38:55bb9da08a52 155 void Gameengine::blocks(N5110 &lcd)
el17arm 41:0cf320f73424 156 {
el17arm 40:913339e324b8 157 int i = _level;
el17arm 42:d81c008b0436 158 _sprites.soft_blocks(_lev.sof1.sx1[i], _lev.sof1.sy[i], _lev.sof1.sx2[i], lcd);
el17arm 42:d81c008b0436 159 _sprites.soft_blocks(_lev.sof2.sx1[i], _lev.sof2.sy[i], _lev.sof2.sx2[i], lcd);
el17arm 42:d81c008b0436 160 _sprites.soft_blocks(_lev.sof3.sx1[i], _lev.sof3.sy[i], _lev.sof3.sx2[i], lcd);
el17arm 42:d81c008b0436 161 _sprites.soft_blocks(_lev.sof4.sx1[i], _lev.sof4.sy[i], _lev.sof4.sx2[i], lcd);
el17arm 42:d81c008b0436 162 _sprites.soft_blocks(_lev.sof5.sx1[i], _lev.sof5.sy[i], _lev.sof5.sx2[i], lcd);
el17arm 41:0cf320f73424 163
el17arm 42:d81c008b0436 164 _sprites.blocks(_d, _lev.sol1.bx[i], _lev.sol1.by[i], lcd);
el17arm 42:d81c008b0436 165 _sprites.blocks(_d, _lev.sol2.bx[i], _lev.sol2.by[i], lcd);
el17arm 42:d81c008b0436 166 _sprites.blocks(_d, _lev.sol3.bx[i], _lev.sol3.by[i], lcd);
el17arm 42:d81c008b0436 167 _sprites.blocks(_d, _lev.sol4.bx[i], _lev.sol4.by[i], lcd);
el17arm 42:d81c008b0436 168 _sprites.blocks(_d, _lev.sol5.bx[i], _lev.sol5.by[i], lcd);
el17arm 38:55bb9da08a52 169 }
el17arm 38:55bb9da08a52 170
el17arm 38:55bb9da08a52 171 bool Gameengine::enemies(N5110 &lcd)
el17arm 41:0cf320f73424 172 {
el17arm 40:913339e324b8 173 int i = _level;
el17arm 40:913339e324b8 174 if(_enem_flag == false) {
el17arm 42:d81c008b0436 175 _sprites.enemy_init(0, _lev.enem1.ex[i], _lev.enem1.ey[i], _lev.enem1.d[i]);
el17arm 42:d81c008b0436 176 _sprites.enemy_init(1, _lev.enem2.ex[i], _lev.enem2.ey[i], _lev.enem2.d[i]);
el17arm 42:d81c008b0436 177 _sprites.enemy_init(2, _lev.enem3.ex[i], _lev.enem3.ey[i], _lev.enem3.d[i]);
el17arm 40:913339e324b8 178 _enem_flag = true;
el17arm 40:913339e324b8 179 }
el17arm 42:d81c008b0436 180 _sprites.enemy_move(0, _lev.enem1.v[i], lcd);
el17arm 42:d81c008b0436 181 _sprites.enemy_move(1, _lev.enem2.v[i], lcd);
el17arm 42:d81c008b0436 182 _sprites.enemy_move(2, _lev.enem3.v[i], lcd);
el17arm 41:0cf320f73424 183
el17arm 42:d81c008b0436 184 if(_sprites.enemy_collision(0) || _sprites.enemy_collision(1) ||
el17arm 42:d81c008b0436 185 _sprites.enemy_collision(2)) {
el17arm 40:913339e324b8 186 return true;
el17arm 40:913339e324b8 187 }
el17arm 40:913339e324b8 188 return false;
el17arm 41:0cf320f73424 189 }
el17arm 41:0cf320f73424 190
el17arm 41:0cf320f73424 191 int Gameengine::oxygen_leds()
el17arm 41:0cf320f73424 192 {
el17arm 41:0cf320f73424 193 if(_t.read() < (_time*0.33f)) {
el17arm 41:0cf320f73424 194 _oxy_state = 3;
el17arm 41:0cf320f73424 195 }
el17arm 41:0cf320f73424 196 if(_t.read() > (_time*0.33f) && _t.read() < (_time*0.66f)) {
el17arm 41:0cf320f73424 197 _oxy_state = 2;
el17arm 41:0cf320f73424 198 }
el17arm 41:0cf320f73424 199 if(_t.read() > (_time*0.66f)) {
el17arm 41:0cf320f73424 200 _oxy_state = 1;
el17arm 41:0cf320f73424 201 }
el17arm 41:0cf320f73424 202 if(_t.read() >= _time) {
el17arm 41:0cf320f73424 203 _oxy_state = 0;
el17arm 41:0cf320f73424 204 }
el17arm 41:0cf320f73424 205 return _oxy_state;
el17arm 41:0cf320f73424 206
el17arm 41:0cf320f73424 207 }
el17arm 41:0cf320f73424 208
el17arm 41:0cf320f73424 209 int Gameengine::lives_leds()
el17arm 41:0cf320f73424 210 {
el17arm 41:0cf320f73424 211 _life_state = _lives;
el17arm 41:0cf320f73424 212 return _life_state;
el17arm 41:0cf320f73424 213 }
el17arm 41:0cf320f73424 214
el17arm 41:0cf320f73424 215 void Gameengine::get_score(N5110 &lcd)
el17arm 41:0cf320f73424 216 {
el17arm 41:0cf320f73424 217 float flt_score = ((_lives +1) * _total_time + (10 * _sprites.keys_collected()));
el17arm 41:0cf320f73424 218 int int_score = static_cast<int>(flt_score);
el17arm 41:0cf320f73424 219 char buffer[14];
el17arm 41:0cf320f73424 220 sprintf(buffer,"%2d",int_score);
el17arm 41:0cf320f73424 221 lcd.printString(buffer,40,2);
el17arm 41:0cf320f73424 222 printf("score = %i \n", int_score);
el17arm 37:4d525a37d5d2 223 }