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(); }
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(); }