JianWei Lee
/
project_game
Meteor defense project
Diff: GameEngine/GameEngine.cpp
- Revision:
- 49:bf802df54786
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GameEngine/GameEngine.cpp Thu May 04 11:55:00 2017 +0000 @@ -0,0 +1,223 @@ +#include "GameEngine.h" + +GameEngine::GameEngine() +{ + +} + +GameEngine::~GameEngine() +{ + +} +void GameEngine::startingMenu(Gamepad &pad, N5110 &lcd) { + _gui.startingMenu(lcd); + ledNumber ++; + pad.led(ledNumber, 1.0); + pad.led(ledNumber - 1, 0.0); + if (ledNumber == 6) { + ledNumber = 0; + } else { + pad.led(6, 0.0); + } + _gui.preventDoubleClick(pad); + +} +void GameEngine::init(int w) { + NumberOfLife = 3; //3 life on every wave + weap.init(); + _d1.droneInit(20, 46, 0, 42, weap._droneDamage, weap._droneRange); //drone1 is taking left side pixel 0 to 42. + _d2.droneInit(62, 46, 42, 84, weap._droneDamage, weap._droneRange); //drone2 is taking right side pixel 42 to 83; + spa.init(w); + //printf("init completed \n"); +} +void GameEngine::update(Gamepad &pad, N5110 &lcd) { + weap.init(); + _d1.drone_main(scnd.Arr, scnd.cArr, lcd); + _d2.drone_main(scnd.Arr, scnd.cArr, lcd); + drawSpawn(lcd); + laser_and_cannon(pad, lcd); + bomb_And_Shield(pad, lcd); + checkGameRule(pad, lcd); + //_gui.preventDoubleClick(pad); +} +void GameEngine::weapUpgrade(Gamepad &pad, N5110 &lcd) { + if (pad.check_event(Gamepad::START_PRESSED)) { + _gui.upgrading_flag = 1; + _gui.preventDoubleClick(pad); + while (_gui.upgrading_flag == 1) { + //printf("laserDamage = %i \n",weap._laserDamage); + //go to the upgrade page with all the values (from Weapon) as reference. + _gui.upgrades(weap._laserDamage, weap._bombDamage, weap._bombRange, weap._bombCooldown, weap._droneDamage, weap._droneRange, weap._shieldCapacity, weap._shieldRegenRate, weap._cannonDamage, weap._cannonCapacity, weap._cannonRegenRate, pad, lcd); + //printf("_gui.saveTheData = %d",_gui.saveTheData); + if (_gui.saveTheData_flag == 1) { + Data _upgrades = _gui.get_data(); //saving data + //_gui.testingtest(_upgrades); //code used to test the struct + weap.setVar(_upgrades.up, _upgrades.up1); + weap.setVar(_upgrades.u1p, _upgrades.u1p1); + //printf("TESTING up = %d, up1 = %d, u1p = %d, u1p1 = %d \n",_upgrades.up,_upgrades.up1,_upgrades.u1p,_upgrades.u1p1); + _gui.saveTheData_flag = 0; + _gui.upgrading_flag = 0; //get out of while loop after done upgrading + } + lcd.refresh(); + wait(0.2); + lcd.clear(); + } + doneUpgrade_flag = 1; + //remember to re-initialise everything after a wave. + } +} +void GameEngine::drawSpawn(N5110 &lcd){ + updateArray(); //clean up & update the main.Arr after the spawn took damage. + if (drawit == 0) { + drawit = 30; + spa.summon_spawn(main.Arr, main.cArr);//summon spawn when drawit == 0 + spa.moveSpawnABC(main.Arr, scnd.Arr, main.cArr, scnd.cArr); + spa.moveSpawnDE(main.Arr, scnd.Arr, main.cArr, scnd.cArr); + //printf("why u do this to cannonFiring_flag?? cannonFiring_flag = %d \n",weap.cannonFiring_flag); + if ( fireInTheHole_flag ==1) { //this code because whenever spawn ABCDE moves, weap.cannonFiring_flag goes to 0 automatically (NO IDEA WHY) + weap.cannonFiring_flag = 1; + } + } else { + drawit -= 0.5; + spa.moveSpawnDE(main.Arr, scnd.Arr, main.cArr, scnd.cArr); + spa.moveSpawnB(main.Arr, scnd.Arr, main.cArr, scnd.cArr); + //printf("moving spawn b \n"); + } + spa.updateSpawn(main.Arr, scnd.Arr, main.cArr, scnd.cArr, lcd); +} +void GameEngine::laser_and_cannon(Gamepad &pad, N5110 &lcd) { + weap.drawPlayer(pad, lcd); + weap.cannon_recharge(); + weap.cannon_Meter(lcd); + //draw a line for the laser when button is pressed + if (pad.buttonhold_A == 1) { + //printf("hi, button is working \n"); + weap.weaponMath(pad); + weap.laser_Main(scnd.Arr, scnd.cArr, lcd); + + //cannon can only be fired when the laser is switched on. + if ( weap._cannon > 320) { //when sufficient, check for button Y. + if ( pad.check_event(Gamepad::Y_PRESSED)) { //press button to set flag (fire the cannon) + fireInTheHole_flag = 1; + } + } + } + if ( fireInTheHole_flag == 1) { //if flag toggled + weap.cannon_main(scnd.Arr, scnd.cArr, lcd); + } + if ( weap.cannonFiring_flag == 0) { //clear flag when cannon is done + fireInTheHole_flag = 0; + } +} +void GameEngine::checkGameRule(Gamepad &pad, N5110 &lcd) { + //the only way to lose a life is when a spawn reaches y = 46. + numberOfLife_leds(pad); + for ( int x = 0; x < 84; x ++) { + if (main.Arr[x][46] > 0) { //if anything reaches line y=46 + NumberOfLife --; + pad.tone(750.0,0.5); + //printf("opps you lost a life. NumberOfLife = %d \n",NumberOfLife); + if (NumberOfLife == 0) { + gameOver(pad, lcd); + } + } + } +} +void GameEngine::gameOver(Gamepad &pad, N5110 &lcd) { + while (retry_flag == 0 && gameMenu_flag == 0) { //while both are 0 + lcd.clear(); + lcd.printString("Game Over",10,3); + lcd.printString("GiveUp Retry",0,5); + lcd.refresh(); + pad.leds_on(); + wait(0.1); + pad.leds_off(); + wait(0.1); + //printf("press a button pls. you lost retry_flag = %d gameMenu_flag = %d\n",retry_flag,gameMenu_flag); + //must click atleast one button to continue + if (pad.check_event(Gamepad::START_PRESSED)) { + retry_flag = 1; + printf("retry pressed \n"); + update_RetryToMain(); + } + if (pad.check_event(Gamepad::BACK_PRESSED)) { + gameMenu_flag = 1; //bring the player to game menu + printf("player surrendered \n"); + } + + } +} +void GameEngine::numberOfLife_leds(Gamepad &pad) { + //light up LEDs depends on number of lifes left. + if (NumberOfLife == 3) { + pad.leds_on(); //turn on all leds + } + if (NumberOfLife == 2) { + pad.led(1, 1.0); //turn on led 1, 2, 5 and 6 + pad.led(2, 1.0); + pad.led(3, 0.0); + pad.led(4, 0.0); + pad.led(5, 1.0); + pad.led(6, 1.0); + } + if (NumberOfLife == 1) { + pad.led(1, 1.0); //turn on led 1 and 6 + pad.led(2, 0.0); + pad.led(3, 0.0); + pad.led(4, 0.0); + pad.led(5, 0.0); + pad.led(6, 1.0); + } +} +void GameEngine::bomb_And_Shield(Gamepad &pad, N5110 &lcd) { + weap.bomb_main(scnd.Arr, pad, lcd); + if (pad.check_event(Gamepad::X_PRESSED)) { + //to prevent from detonating the bomb at instant when button X is accidentally pressed + //printf("instant bomb detonate prevented"); + } + weap.shield_main(scnd.Arr, scnd.cArr, pad, lcd); + if (pad.check_event(Gamepad::B_PRESSED)) { + //to prevent the button from clicking twice + printf("shield double click prevented"); + } +} +void GameEngine::updateArray() { //update main array with secondary array and clean up the array + for (int x = 0; x < Cols; x++) { + for (int y = 0; y < Rows; y++) { + main.Arr[x][y] = scnd.Arr[x][y]; + //printf(" main.Arr[%d][%d] = %d \n",x,y,scnd.Arr[x][y]); + spa.deleteChar(x, y, main.Arr, scnd.cArr); + } + } +} +void GameEngine::update_MainToRetry() { //update Retry array with main array + for (int x = 0; x < Cols; x ++) { + for (int y = 0; y < Rows; y ++) { + retry.Arr[x][y] = main.Arr[x][y]; + retry.cArr[x][y]= main.cArr[x][y]; + } + } + printf("main to retry array updated \n"); +} +void GameEngine::update_RetryToMain() {//update main & secondary array with Retry array + for (int x = 0; x < Cols; x ++) { + for (int y = 0; y < Rows; y ++) { + main.Arr[x][y] = retry.Arr[x][y]; + main.cArr[x][y] = retry.cArr[x][y]; + scnd.Arr[x][y] = retry.Arr[x][y]; + scnd.cArr[x][y] = retry.cArr[x][y]; + } + } + printf("retry to main array updated \n"); +} +void GameEngine::reset_Game() { //reset everything in the game + for (int x = 0; x < Cols; x ++) { + for (int y = 0; y < Rows; y ++) { //clear array + main.Arr[x][y] = 0; + main.cArr[x][y] = '\0'; + scnd.Arr[x][y] = 0; + scnd.cArr[x][y] = '\0'; + } + } + weap.reset_WeaponVariables(); //clear weapon variables +} \ No newline at end of file