void World::enemyProjectileCollision() { NodeContainer mCollidableNodes; for (const auto& node1 : mEnemyBulletNodes) { if (node1->isDestroyed()) continue; mCollidableNodes.clear(); mQuadTreeSecondary.getCloseObjects(node1->getBoundingRect(), mCollidableNodes); for (const auto& node2 : mCollidableNodes) { if (node2->isDestroyed()) continue; if (node2->getCategory() & Category::Shield) { auto& shield(static_cast<Shield&>(*node2)); auto& projectile(static_cast<Projectile&>(*node1)); if (!collision(shield, projectile)) continue; shield.onHit(projectile.getBoundingRect(), projectile.getPosition(), projectile.getCategory()); projectile.destroy(); } else if (node2->getCategory() & Category::PlayerSpaceship) { if (!collision(*node1, *node2)) continue; auto& player(static_cast<Player&>(*node2)); auto& projectile(static_cast<Projectile&>(*node1)); player.destroy(); projectile.destroy(); mLife->decrement(); mLivesCount--; } } } }
void World::playerProjectileCollision() { NodeContainer mCollidableNodes; for (const auto& node1 : mPlayerBulletNodes) { if (node1->isDestroyed()) continue; mCollidableNodes.clear(); mQuadTreePrimary.getCloseObjects(node1->getBoundingRect(), mCollidableNodes); for (const auto& node2 : mCollidableNodes) { if (node2->isDestroyed()) continue; if (node2->getCategory() & Category::Shield) { auto& shield(static_cast<Shield&>(*node2)); auto& projectile(static_cast<Projectile&>(*node1)); if (!collision(shield, projectile)) continue; shield.onHit(projectile.getBoundingRect(), projectile.getWorldPosition(), projectile.getCategory()); projectile.destroy(); } else if (node2->getCategory() & Category::EnemyProjectile) { if (!collision(*node1, *node2)) continue; auto& playerProjectile(static_cast<Projectile&>(*node1)); auto& enemyProjectile(static_cast<Projectile&>(*node2)); playerProjectile.destroy(); enemyProjectile.destroy(); } else if (node2->getCategory() & Category::BossSpaceship) { if (!collision(*node1, *node2)) continue; auto& enemy(static_cast<Boss&>(*node2)); auto& projectile(static_cast<Projectile&>(*node1)); mScore->increment(100); enemy.destroy(); projectile.destroy(); } else if (node2->getCategory() & Category::EnemySpaceship) { if (!collision(*node1, *node2)) continue; auto& enemy(static_cast<Invader&>(*node2)); auto& projectile(static_cast<Projectile&>(*node1)); switch (enemy.getType()) { case Invader::Enemy1: mScore->increment(30); break; case Invader::Enemy2: mScore->increment(20); break; case Invader::Enemy3: mScore->increment(10); } mChangeSpeed = true; enemy.destroy(); projectile.destroy(); } } } }