Ejemplo n.º 1
0
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--;
			}
		}
	}
}
Ejemplo n.º 2
0
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();
			}
		}
	}
}