void Game::move_all ( void ) { int i = -1; while (++i < WIN_WIDTH) { _background[i].move(); _background2[i].move(); } i = -1; while (++i < MAX_ENEMY ) { if ( this->_enemies[i] ) { moveBullets(_enemies[i]->getBullets()); if (this->_enemies[i]->move()) { getPlayer()->addScore(-(_enemies[i]->getScorePoints())); delete this->_enemies[i]; this->_enemies[i] = NULL; } } } moveBullets(_player->getBullets()); }
void World::update() { if (_playerBase == nullptr) { gameOver(); } else if (_playerTank == nullptr) { if (_playerLife > 0) { _playerLife--; Tank *tank = new Tank; tank->setPos(_spawnPos[0]); _playerTank = tank; _tankList.append(tank); } else { gameOver(); } } else if (_tankList.size() < 3) { if (_enemyLife > 0) { _enemyLife--; Tank *tank = new Tank; tank->setTeam(1); tank->setPos(_spawnPos[_tankList.size()]); tank->setAngle(2); _tankList.append(tank); } } if (_isVideo) { playVideo(); } else { moveBots(); } updateTanks(); moveBullets(); }
void idle() { explosion->updateParticleSystems(0.01); if(explosionControl >= 1000.0 && !detonator) { audio->stopAL(1); audio->playAL(6); explosion->createParticleSystem(morteNera->getX(), morteNera->getY(), morteNera->getZ()); explosionControl = 0.0; detonator = true; } //Movimento dei TieFighter tieFighter->movement(2.1, -2.1, 5, 0.5, tieFighter->getSpeed(), 0, -18); tieFighter2->movement(2.1, -2.1, 5, 0.5, tieFighter2->getSpeed(), 0, -18); tieFighter3->movement(60,-560,0,1.5,tieFighter3->getSpeed(),2,0); tieFighter4->movement(60,-60,0,1,tieFighter4->getSpeed(),2,0); tieFighter5->movement(60,-60,0,1.5,tieFighter5->getSpeed(),2,0); tieFighter6->movement(60,-60,0,1,tieFighter6->getSpeed(),2,0); tieFighter3->moveDarth(60,-60,-90); tieFighter4->moveDarth(60,-60,-90); tieFighter5->moveDarth(60,-60,-90); tieFighter6->moveDarth(60,-60,-90); //Arrivo dei TieFighter tieFighter->incoming(deathStar, deathStar2); tieFighter2->incoming(deathStar, deathStar2); //rotazione per i TieFighter if(tieFighter->getZ() < -11 && tieFighter->getAngle() < 180) { tieFighter->setAngle(tieFighter->getAngle() + 3.0); } if(tieFighter2->getZ() < -11 && tieFighter2->getAngle() > -180) { tieFighter2->setAngle(tieFighter2->getAngle() - 3.0); } //Reset dei TieFighter dopo che sono stati sparati tieFighter->reset(7, 5, -5, explosion); tieFighter2->reset(-4, 5, -5, explosion); //Distruzione dei TieFighter se colpiti tieFighter->destroy(); tieFighter2->destroy(); //Colpi dei TieFighter if(tieFighter->getY() <= 0.5 && tieFighter->getZ() <= -17) { bulletEnemy->setShooted(true); if(bulletEnemy->isShooted() && bulletEnemy->getZ() == tieFighter->getZ()) { audio->playAL(0); } } if(tieFighter2->getY() <= 0.5 && tieFighter2->getZ() <= -17) { bulletEnemy2->setShooted(true); if(bulletEnemy2->isShooted() && bulletEnemy2->getZ() == tieFighter2->getZ()) { audio->playAL(0); } } if(tieFighter3->getY() <= 1.5) { bulletEnemy3->setShooted(true); if(!fleetFire) { audio->playAL(0); } fleetFire = true; } if(tieFighter4->getY() <= 1) { bulletEnemy4->setShooted(true); } if(tieFighter5->getY() <= 1.5) { bulletEnemy5->setShooted(true); } if(tieFighter6->getY() <= 1) { bulletEnemy6->setShooted(true); } //attack of tiefighters and darthvader attack(); //set bullet //Colpi del primo TieFighter bulletEnemy->moveBullet(tieFighter); bulletEnemy->fireEnemy(tieFighter,xWing, 50, 0.5, -18, -2.15, -5); bulletEnemy2->moveBullet(tieFighter2); bulletEnemy2->fireEnemy(tieFighter2,xWing, 50, 0.5, -18, -2.15, -5); bulletEnemy3->moveBullet(tieFighter3); bulletEnemy3->fireEnemy(tieFighter3,xWing, 50, 1.5, -11.49, -2.15, -5); bulletEnemy4->moveBullet(tieFighter4); bulletEnemy4->fireEnemy(tieFighter4,xWing, 50, 1, -8.99, -2.15, -5); bulletEnemy5->moveBullet(tieFighter5); bulletEnemy5->fireEnemy(tieFighter5,xWing, 50, 1.5, -11.49, -2.15, -5); bulletEnemy6->moveBullet(tieFighter6); bulletEnemy6->fireEnemy(tieFighter6,xWing, 50, 1, -8.99, -2.15, -5); if(bulletEnemy2->isShooted()) { bulletEnemy2->destroyXwing(xWing,tieFighter2); } if(bulletEnemy->isShooted()) { bulletEnemy->destroyXwing(xWing,tieFighter); } if(bulletEnemy3->isShooted()) { bulletEnemy3->destroyXwing(xWing,tieFighter3); } if(bulletEnemy4->isShooted()) { bulletEnemy4->destroyXwing(xWing,tieFighter4); } if(bulletEnemy5->isShooted()) { bulletEnemy5->destroyXwing(xWing,tieFighter5); } if(bulletEnemy6->isShooted()) { bulletEnemy6->destroyXwing(xWing,tieFighter6); } //Controllo sui colpi dell X-Wing bullet0->destroy(tieFighter); bullet0->destroy(tieFighter2); bullet0->destroy(darthVader); //Movimento dell corridoio della MorteNera deathStar->movement(deathStar->getSpeed()); deathStar->controlPlane(); deathStar2->movement(deathStar2->getSpeed()); deathStar2->controlPlane(); //Movimento di DarthVade if(!arrivato) { darthVader->movement(60, -60, 0, 0.5, darthVader->getSpeed(), -18, 0); darthVader->moveDarth(60,-60,-90); if(darthVader->getY() < 1) { arrivato = true; darthVader->setLeft(true); } } else { bulletDarth->setShooted(true); if(!darthVader->getDeath()) { if(bulletDarth->isShooted() && bulletDarth->getZ() == darthVader->getZ()) { audio->playAL(0); } } darthVader->setForward(false); darthVader->setBack(false); if(darthVader->getX() >= 2.1) { darthVader->setRight(false); darthVader->setLeft(true); } if(darthVader->getX() <= -2.1) { darthVader->setRight(true); darthVader->setLeft(false); } darthVader->movement(2.1,-2.1,0,0.5,darthVader->getSpeed(),0,0); } if(bulletDarth->isShooted()) { bulletDarth->destroyXwing(xWing,darthVader); } darthVader->explodeDarth(explosion); darthVader->destroy(); bulletDarth->moveBullet(darthVader); bulletDarth->fireEnemy(darthVader, xWing, 40, 0.5, -18, -2.15, -5); moveBullets(); //Gestione dei movimenti dell X-Wing if(win) { xWing->movement(50,0,30,0,0.05); xWing->goOut(); morteNera->setAngle(morteNera->getAngle() - 0.03); if(morteNera->getAngle() <= -50) { explosionControl = 1000.0; morteNera->setDeath(true); } if(detonator == false) { explosion->destroyParticleSystems(); } } else { xWing->explosionWall(deathStar, deathStar2, explosion); //xWing->explosionBorder(explosion); xWing->movement(2, -2, -1.15, -2.15, 0.06); } xWing->lose(explosion); if(bomb->isShooted() && bomb->getY() > -5) { bomb->fire(0,-0.1,0); } else { bomb->setShooted(false); bomb->reset(xWing, 0, 0, 0); } final();
// executeFrame *********** // Execute a frame, without drawing it on screen. It's what I call // "virtual frames". // Only return false for non-recover errors. bool GameLoopCode::executeFrame(DWORD frameNumber) { int i;// for some small loops vectorListNodeStruct<playerUnitStruct> *unit;// for checking how many players are on screen // ANY PLAYERS? // Count the active players for (unit=playerList.getFirstNode(), i=0; unit!=NULL; unit=playerList.getNextNode(unit)) { if (!unit->data.nowActive) continue;// don't count inactive units i++; } // If there is no players alive, and the game isn't finishing right // now, start finishing it now if (i<=0 && gameWorld.gameFinishedTimeLeft==-1) { // start finishing the game gameWorld.gameFinishedTimeLeft=gameWorld.maxGameFinishedTimeLeft; } /* // end the game if the escape key was pressed, or if the // time for finishing the game is zero (so meaning the game has to // end now) if (KEYEVENTDOWN(keyboard.keys, keyboard.latestKeys, DIK_ESCAPE) || gameWorld.gameFinishedTimeLeft==0) { // that's the end, go to the intro if (!switchToProgramZone(pgzon_gameMenues, 0, 0, true)) return false; } // check for the pause key... if (KEYEVENTDOWN(keyboard.keys, keyboard.latestKeys, DIK_P)) { // switch the pause mode, only if console isn't open if (!showConsole) gameWorld.isGamePaused=!gameWorld.isGamePaused; } */ // check for pause mode... if we are in that mode, there is // nothing to do here if (gameWorld.isGamePaused) return true;// all ok // increment our internal frame number counter nonPausedFrameNumber++; // move the camera at first if (!moveCamera()) { logger.logLine("Failed moveCamera"); return false; } // do the management of automatic stage advancement if (!manageAutomaticStaging(frameNumber)) { logger.logLine("Failed doing the automatic staging"); return false; } // Game finish count down (or game over management) if (gameWorld.gameFinishedTimeLeft>0) gameWorld.gameFinishedTimeLeft--; // Move all the bullet units on the game world // It _has_ to be done before anything else is moved, so // spawned bullets don't move the first time. if (!moveBullets(frameNumber)) { logger.logLine("Failed moveBullets"); return false; } // Now use the keyboard input for managing the player... if (!movePlayers(keyboard.keys)) { logger.logLine("Failed movePlayers"); return false; } // Start the frame managing the enemy waves (that is, the addition // of new groups of enemies). if (!executeEnemyWaves(frameNumber)) { logger.logLine("Failed executeEnemyWaves"); return false; } // Execute the enemy AI of all the units on the game world if (!executeEnemyAI(frameNumber)) { logger.logLine("Failed executeEnemyAI"); return false; } // Now go check the collisions between the game objects... if (!checkCollisions()) { logger.logLine("Failed checkCollisions"); return false; } return true;// all ok }// executeFrame
void render() { // Clears the buffer with this colour attribute clearBuffer(0x00); // Set up sample colours, and output shadings const WORD colors[] = { 0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F, 0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6 }; COORD c; // displays the framerate std::ostringstream ss; ss << std::fixed << std::setprecision(3); ss << 1.0 / deltaTime << "fps"; c.X = ConsoleSize.X-9; c.Y = 0; writeToBuffer(c, ss.str()); // displays the elapsed time ss.str(""); ss << elapsedTime << "secs"; c.X = 0; c.Y = ConsoleSize.Y - 1; writeToBuffer(c, ss.str(), 0x59); if (!levelStart) levelStart = initLevel(); renderShip(); moveBullets(); checkBulletCollision(enemyArr, levelInfo.number); renderBullets(); if (!spawnBufferCount && enemiesSpawned < levelInfo.number) { if (spawnEnemy(enemyArr, levelInfo.number)) { spawnBufferCount += levelInfo.spawnBuffer; enemiesSpawned++; } } else if (spawnBufferCount) spawnBufferCount--; moveEnemy(enemyArr, levelInfo.number); checkBulletCollision(enemyArr, levelInfo.number); checkEnemyCollision(enemyArr, levelInfo.number); renderEnemy(enemyArr, levelInfo.number); if (levelInfo.bullets) { if (spawnEnemyBullet(enemyArr)) { spawnBufferCount += bulletInfo.spawnBuffer; } moveEnemy(enemyBulletArr, bulletInfo.number); checkEnemyCollision(enemyBulletArr, bulletInfo.number); renderEnemy(enemyBulletArr, bulletInfo.number); } // Writes the buffer to the console, hence you will see what you have written flushBufferToConsole(); if (enemiesSpawned == levelInfo.number) { if (checkClear(enemyArr, levelInfo.number)) { levelStart = false; enemiesSpawned = 0; spawnBufferCount = 0; delete[] enemyArr; delete[] enemyBulletArr; levelInfo.level = levelInfo.nextLevel; } } }
void run(){ Display gDisplay; Assets gAssets; ControlState gControlState; SDL_Event e; bool quit = false; srand(time(NULL)); if (!initDisplay(&gDisplay)) { fprintf(stderr, "ERROR: failed to initialize\n"); exit(1); } if (!loadAssets(&gAssets, &gDisplay)) { fprintf(stderr, "ERROR: failed to load game assets\n"); exit(1); } Player p = P_createPlayer(); AI *ai = AI_createAI(); LinkedList playerBulletList = LL_createLinkedList(); LinkedList enemyBulletList = LL_createLinkedList(); LinkedList enemyList = LL_createLinkedList(); Timer fpsCapTimer = T_createTimer(); Timer gameTimer = T_createTimer(); unsigned int lastShooting = 0; unsigned int lastEnemenySpawn = 0; unsigned int check = 0; T_start(&gameTimer); int controlarray[4] = {0}; SDL_Rect healthbar; initialisehealthbar(&healthbar); quit = staticscreen(gDisplay.renderer, "Assets/startmenu.bmp"); SDL_Surface* temp; SDL_Texture* background; temp = SDL_LoadBMP("Assets/background.bmp"); background = SDL_CreateTextureFromSurface(gDisplay.renderer, temp); SDL_FreeSurface(temp); temp = NULL; /*Event loop*/ do{ // start frame timer T_start(&fpsCapTimer); // check for exit event SDL_PollEvent(&e); quit = (e.type == SDL_QUIT); // check to open ai interface if(e.type == SDL_KEYDOWN){ if(e.key.keysym.sym == SDLK_ESCAPE){ quit = openaiscreen(gDisplay.renderer, controlarray); e.key.keysym.sym = SDLK_0; SDL_PushEvent(&e); } } // move player getKeyState(&gControlState); getMouseState(&gControlState); movePlayer(&p, &gControlState, &gAssets); AI_move(ai, P_getPosition(&p)); if ((check = T_getTicks(&gameTimer)) - lastEnemenySpawn > DEFAULT_SPAWN_INTERVAL) { spawnEnemy(&enemyList); lastEnemenySpawn = check; } aiaction(ai, &playerBulletList, &enemyList, T_getTicks(&gameTimer), controlarray, &p); moveEnemies(&enemyList, P_getPosition(&p)); enemiesShoot(&enemyList, &enemyBulletList, &p, T_getTicks(&gameTimer)); if (leftMouseIsDown() && ((check = T_getTicks(&gameTimer)) - lastShooting) > SHOOT_DELAY) { double mx = (double)gControlState.mouseX / SCREEN_WIDTH; double my = (double)gControlState.mouseY / SCREEN_HEIGHT; Point origin = P_getPosition(&p); Point destination = {mx, my}; shootBullet(&playerBulletList, origin, getShotDirection(origin, destination), PLAYER); lastShooting = check; } moveBullets(&playerBulletList); moveBullets(&enemyBulletList); detectCollision(&playerBulletList, &enemyList, &gAssets); detectCollisionPlayer(&enemyBulletList, &p, &gAssets); /* Update Screen */ SDL_RenderCopy(gDisplay.renderer, background, NULL, NULL); displayhealth(gDisplay.renderer, healthbar, p.health); renderBullets(&playerBulletList, &gDisplay, &gAssets, PLAYER); renderBullets(&enemyBulletList, &gDisplay, &gAssets, ENEMY); renderEnemies(&enemyList, &gDisplay, &gAssets); renderPlayer(&gDisplay, &gAssets, &gControlState); renderAI(ai, &gDisplay, &gAssets); // draw screen SDL_RenderPresent(gDisplay.renderer); delayNextFrame(T_getTicks(&fpsCapTimer)); if (gameOver(&p)) { printf("GAME OVER\n"); quit = staticscreen(gDisplay.renderer, "Assets/gameover.bmp"); p.health = 100; } } while (!quit); /* Memory Cleanup */ LL_destroyLinkedList(&playerBulletList); LL_destroyLinkedList(&enemyBulletList); AI_destroyAI(ai); SDL_DestroyTexture(background); freeAssets(&gAssets); closeDisplay(&gDisplay); }