예제 #1
0
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());
}
예제 #2
0
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();
}
예제 #3
0
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();
예제 #4
0
// 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
예제 #5
0
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;
		}
	}
}
예제 #6
0
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);
}