Esempio n. 1
0
void World::Impl::GuideMissiles()
{
	// Setup command that stores all enemies in mActiveEnemies
	Command enemyCollector;
	enemyCollector.category = Category::EnemyAircraft;
	enemyCollector.action = derivedAction<Aircraft>( [this] ( Aircraft& enemy, sf::Time )
	{
		if ( !enemy.IsDestroyed() )
			mActiveEnemies.push_back( &enemy );
	} );

	// Setup command that guides all missiles to the enemy which is currently closest to the player
	Command missileGuider;
	missileGuider.category = Category::AlliedProjectile;
	missileGuider.action = derivedAction<Projectile>( [this] ( Projectile& missile, sf::Time )
	{
		// Ignore unguided bullets
		if ( !missile.IsGuided() )
			return;

		float minDistance = std::numeric_limits<float>::max();
		Aircraft* closestEnemy = nullptr;

		// Find closest enemy
		for( Aircraft* enemy : mActiveEnemies )
		{
			float enemyDistance = distance( missile, *enemy );

			if ( enemyDistance < minDistance )
			{
				closestEnemy = enemy;
				minDistance = enemyDistance;
			}
		}

		if ( closestEnemy )
			missile.GuideTowards( closestEnemy->GetWorldPosition() );
	} );

	// Push commands, reset active enemies
	mCommandQueue.Push( enemyCollector );
	mCommandQueue.Push( missileGuider );
	mActiveEnemies.clear();
}
Esempio n. 2
0
void
World::guideMissiles() {
    Command enemyCollector;
    enemyCollector.category = Category::EnemyAircraft;
    enemyCollector.action   = derivedAction<Aircraft>(
        [this] ( Aircraft& enemy, sf::Time ) {
            if ( !enemy.IsDestroyed() ) {
                mActiveEnemies.push_back( &enemy );
            }
        }
    );

    Command missileGuider;
    missileGuider.category  = Category::AlliedProjectile;
    missileGuider.action    = derivedAction<Projectile>(
        // TODO: outsource this function into separate method
        [this] ( Projectile& missile, sf::Time ) {
            // Ignore unguided bullets
            if ( !missile.IsGuided() ) {
                return;
            }

            float minDistance       = std::numeric_limits<float>::max();
            Aircraft* closestEnemy  = nullptr;

            for( Aircraft* enemy : mActiveEnemies ) {
                float enemyDistance = Distance( missile, *enemy );

                if ( enemyDistance < minDistance ) {
                    closestEnemy    = enemy;
                    minDistance     = enemyDistance;
                }
            }
            if ( closestEnemy ) {
                missile.GuideTowards( closestEnemy->GetWorldPosition() );
            }
        }
    );

    mCommandQueue.push( enemyCollector );
    mCommandQueue.push( missileGuider );
    mActiveEnemies.clear();
}