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.
Dependencies: mbed
Gameengine.cpp
00001 #include "Gameengine.h" 00002 00003 Gameengine::Gameengine() 00004 { 00005 } 00006 Gameengine::~Gameengine() 00007 { 00008 } 00009 //initialises default game parameters 00010 void Gameengine::game_init() 00011 { 00012 _enem_flag = false; // flag to initialise enemies each new level 00013 _key_reinit = false; // re initialise keys at start of new level 00014 _five_keys = 5; // number of keys to advance to next level 00015 _level = 0; //start level 00016 _sprites.miner_init(3, 37); //start position of player 00017 _lives = 3; // starting lives 00018 _time = 120; // time to complete each level 00019 _t.reset(); // resets timer to zero 00020 _sprites.zero_keys(); // resets keys collected to zero 00021 } 00022 // updates player position and interaction with level objects 00023 void Gameengine::update(N5110 &lcd, Gamepad &pad) 00024 { 00025 read_direction(pad); 00026 _sprites.miner_draw(lcd); 00027 _sprites.miner_move(_d, lcd); 00028 _sprites.miner_gravity(lcd); 00029 _sprites.miner_jump(lcd, pad); 00030 _sprites.miner_land(lcd); 00031 _sprites.keys_collected(); 00032 key_draw(lcd, pad); 00033 lose_life(pad, lcd); 00034 game_over(); 00035 next_level(lcd, pad); 00036 oxygen_leds(); 00037 lives_leds(); 00038 //printf("_x = %d \n",_sprites._x); 00039 //printf("_y = %d \n",_sprites._y); 00040 } 00041 // draws level 1 objects 00042 void Gameengine::draw_l1(N5110 &lcd, Gamepad &pad) 00043 { 00044 if (_level == 0) { 00045 00046 _t.start(); // starts level timer 00047 key_reinit(); 00048 _lev.level_platforms1(lcd); // position of platforms 00049 _lev.key_pos1(); // key positions 00050 _lev.trap_pos1(); // trap positions 00051 _lev.block_pos1(); // solid block positions 00052 _lev.soft_pos1(); // sinking block positions 00053 _lev.enem_pos1(); // enemy positions 00054 blocks(lcd); // block placement and collision settings 00055 } 00056 } 00057 // draws level 2 objects 00058 void Gameengine::draw_l2(N5110 &lcd, Gamepad &pad) 00059 { 00060 if(_level == 1) { 00061 00062 _t.start(); 00063 key_reinit(); // re-sets key settings so they appear and disappear once collected 00064 _lev.level_platforms2(lcd); 00065 _lev.key_pos2(); 00066 _lev.trap_pos2(); 00067 _lev.block_pos2(); 00068 _lev.soft_pos2(); 00069 _lev.enem_pos2(); 00070 blocks(lcd); 00071 //printf("_level = %d \n",_level); 00072 } 00073 } 00074 // draws level 3 objects 00075 void Gameengine::draw_l3(N5110 &lcd, Gamepad &pad) 00076 { 00077 if(_level == 2) { 00078 00079 _t.start(); 00080 key_reinit(); 00081 _lev.level_platforms3(lcd); 00082 _lev.key_pos3(); 00083 _lev.trap_pos3(); 00084 _lev.block_pos3(); 00085 _lev.soft_pos3(); 00086 _lev.enem_pos3(); 00087 blocks(lcd); 00088 } 00089 } 00090 00091 void Gameengine::draw_l4(N5110 &lcd, Gamepad &pad) 00092 { 00093 if(_level == 3) { 00094 00095 _t.start(); 00096 key_reinit(); 00097 _lev.level_platforms4(lcd); 00098 _lev.key_pos4(); 00099 _lev.trap_pos4(); 00100 _lev.block_pos4(); 00101 _lev.soft_pos4(); 00102 _lev.enem_pos4(); 00103 blocks(lcd); 00104 game_complete(lcd); // displays game complete screen 00105 } 00106 } 00107 00108 // reads direction of joystick 00109 void Gameengine::read_direction(Gamepad &pad) 00110 { 00111 _d = pad.get_direction(); 00112 } 00113 00114 // turns off LEDS proportionally Vs time left to complete level 00115 int Gameengine::oxygen_leds() 00116 { 00117 if(_t.read() < (_time*0.33f)) { 00118 _oxy_state = 3; 00119 } 00120 if(_t.read() > (_time*0.33f) && _t.read() < (_time*0.66f)) { 00121 _oxy_state = 2; 00122 } 00123 if(_t.read() > (_time*0.66f)) { 00124 _oxy_state = 1; 00125 } 00126 if(_t.read() >= _time) { 00127 _oxy_state = 0; 00128 } 00129 return _oxy_state; // _oxy_state will change FSM value in main.cpp leds() 00130 } 00131 00132 // turns off led every time life is lost 00133 int Gameengine::lives_leds() 00134 { 00135 _life_state = _lives; 00136 return _life_state; // _life_state will change FSM value in main.cpp leds() 00137 } 00138 00139 // displays score at end of game 00140 void Gameengine::get_score(N5110 &lcd) 00141 { 00142 // score is, time left at each level + 10 points for each key, if game completed time is multiplied by lives left 00143 float flt_score = ((_lives +1) * _total_time + (10 * _sprites.keys_collected())); 00144 //printf("flt_score = %d \n",flt_score); 00145 int int_score = static_cast<int>(flt_score); //converts float to integer 00146 char buffer[14]; 00147 sprintf(buffer,"%2d",int_score); 00148 lcd.printString(buffer,54,2); 00149 } 00150 00151 // returns true final level complete 00152 bool Gameengine::game_complete(N5110 &lcd) 00153 { 00154 if(_level == 4) { 00155 return true; 00156 } 00157 return false; 00158 } 00159 00160 void Gameengine::lose_life(Gamepad &pad, N5110 &lcd) 00161 { 00162 if (trap_death(lcd) == true || enemies(lcd) == true) { 00163 _lives--; //reduces lives left by 1 00164 pad.tone(200, 0.5); // death sound 00165 _sprites.miner_init(3, 37); // puts player back to start of level 00166 wait(1); //short pause so restart isn't instant 00167 } 00168 } 00169 00170 // game over when lives lost or time runs out 00171 bool Gameengine::game_over() 00172 { 00173 if(_lives == 0 || _t.read() > _time) { 00174 _t.stop(); 00175 _lives = 0; // lives reduced to zero if time runs out 00176 printf("total time %f \n", _total_time); 00177 return true; 00178 } 00179 return false; 00180 } 00181 00182 // activates level exit when all keys collected 00183 bool Gameengine::level_exit(N5110 &lcd) 00184 { 00185 if(_sprites.exit_level(79,41,lcd) == true) { 00186 return true; 00187 } else { 00188 return false; 00189 } 00190 } 00191 00192 // if keys collected and player reaches exit, sets next level parameters 00193 void Gameengine::next_level(N5110 &lcd, Gamepad &pad) 00194 { 00195 if(level_exit(lcd) && _sprites.keys_collected() == _five_keys) { 00196 _t.stop(); // stops level timer 00197 _total_time += (_time - _t.read()); // adds up time left for score calculation 00198 _level = _level++; // next level activated 00199 _five_keys += 5; // raises keys needed by 5 for next level 00200 _sprites.miner_init(3,39); // resets player position 00201 _enem_flag = false; // allows enemies to be reinitialised 00202 _key_reinit = false; // allows keys to be reintialised 00203 _t.reset(); // resets level timer 00204 pad.tone(700, 0.5); 00205 } 00206 } 00207 00208 // places traps and checks if collision with player 00209 bool Gameengine::trap_death(N5110 &lcd) 00210 { 00211 int i = _level; // tells function which level settings to use 00212 if( _sprites.trap(_lev.trap1.tx[i], _lev.trap1.ty[i], lcd) || 00213 _sprites.trap(_lev.trap2.tx[i], _lev.trap2.ty[i], lcd) || 00214 _sprites.trap(_lev.trap3.tx[i], _lev.trap3.ty[i], lcd) || 00215 _sprites.trap(_lev.trap4.tx[i], _lev.trap4.ty[i], lcd) || 00216 _sprites.trap(_lev.trap5.tx[i], _lev.trap5.ty[i], lcd)) { 00217 return true; 00218 } 00219 return false; 00220 } 00221 00222 // draws keys and checks if collision with player 00223 void Gameengine::key_draw(N5110 &lcd, Gamepad &pad) 00224 { 00225 int i = _level; // tells function which level settings to use 00226 _sprites.key_collect(0, _lev.key1.kx[i], _lev.key1.ky[i], lcd, pad); 00227 _sprites.key_collect(1, _lev.key2.kx[i], _lev.key2.ky[i], lcd, pad); 00228 _sprites.key_collect(2, _lev.key3.kx[i], _lev.key3.ky[i], lcd, pad); 00229 _sprites.key_collect(3, _lev.key4.kx[i], _lev.key4.ky[i], lcd, pad); 00230 _sprites.key_collect(4, _lev.key5.kx[i], _lev.key5.ky[i], lcd, pad); 00231 } 00232 00233 00234 // places and checks for collision with sinking and solid blocks 00235 void Gameengine::blocks(N5110 &lcd) 00236 { 00237 int i = _level; // tells function which level settings to use 00238 // sinking blocks position length and collision detection 00239 _sprites.soft_blocks(_lev.sof1.sx1[i], _lev.sof1.sy[i], _lev.sof1.sx2[i], lcd); 00240 _sprites.soft_blocks(_lev.sof2.sx1[i], _lev.sof2.sy[i], _lev.sof2.sx2[i], lcd); 00241 _sprites.soft_blocks(_lev.sof3.sx1[i], _lev.sof3.sy[i], _lev.sof3.sx2[i], lcd); 00242 _sprites.soft_blocks(_lev.sof4.sx1[i], _lev.sof4.sy[i], _lev.sof4.sx2[i], lcd); 00243 _sprites.soft_blocks(_lev.sof5.sx1[i], _lev.sof5.sy[i], _lev.sof5.sx2[i], lcd); 00244 // block positions and collision settings, indexed so no conflicts if player is contact with multiple blocks 00245 _sprites.blocks(_d, 0, _lev.sol1.bx[i], _lev.sol1.by[i], lcd); 00246 _sprites.blocks(_d, 1, _lev.sol2.bx[i], _lev.sol2.by[i], lcd); 00247 _sprites.blocks(_d, 2, _lev.sol3.bx[i], _lev.sol3.by[i], lcd); 00248 _sprites.blocks(_d, 3, _lev.sol4.bx[i], _lev.sol4.by[i], lcd); 00249 _sprites.blocks(_d, 4, _lev.sol5.bx[i], _lev.sol5.by[i], lcd); 00250 } 00251 // initialises enemies at level start, updates movement, checks collisions 00252 // indexed (0, 1, 2) so each enemy is treated independently 00253 bool Gameengine::enemies(N5110 &lcd) 00254 { 00255 int i = _level; // tells function which level settings to use 00256 if(_enem_flag == false) { 00257 // initialises enemy position and distance to move each way 00258 _sprites.enemy_init(0, _lev.enem1.ex[i], _lev.enem1.ey[i], _lev.enem1.d[i]); 00259 _sprites.enemy_init(1, _lev.enem2.ex[i], _lev.enem2.ey[i], _lev.enem2.d[i]); 00260 _sprites.enemy_init(2, _lev.enem3.ex[i], _lev.enem3.ey[i], _lev.enem3.d[i]); 00261 _enem_flag = true; // stops enemies from being reinitialised constantly 00262 } 00263 // enemy velocity 00264 _sprites.enemy_move(0, _lev.enem1.v[i], lcd); 00265 _sprites.enemy_move(1, _lev.enem2.v[i], lcd); 00266 _sprites.enemy_move(2, _lev.enem3.v[i], lcd); 00267 // checks if collision 00268 if(_sprites.enemy_collision(0) || _sprites.enemy_collision(1) || 00269 _sprites.enemy_collision(2)) { 00270 return true; 00271 } 00272 return false; 00273 } 00274 00275 // reinitialises keys when level complete 00276 void Gameengine::key_reinit() 00277 { 00278 if(_key_reinit == false) { 00279 for(int i = 0; i<5; i++) { 00280 _sprites._key[i] = false; 00281 } 00282 _key_reinit = true; 00283 } 00284 }
Generated on Wed Jul 13 2022 01:25:31 by
1.7.2