ELEC2645 (2018/19) / Mbed 2 deprecated el17arm

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Gameengine.cpp Source File

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 }