www.pudn.com > sxdl.zip > cExplosiveDevice.cpp


#include "cExplosiveDevice.h" 
#include "cBoomBastic.h" 
#include "cFire.h" 
#include "bbUtil.h" 
#include "cParticle.h" 
 
cExplosiveDevice::cExplosiveDevice(int Power) 
{ 
	m_Power = Power; 
	m_HasAlreadyExploded = false; 
	 
	WillRenderLike(g_BoomBastic.EntitySprites[BOMB_SPRITE]); 
	Activate(); 
	 
	Family = EXPLOSIVEDEVICE_ID; 
} 
 
void cExplosiveDevice::Explode() 
{ 
	//Si l'explosif a deja explose, on ne le fait pas exploser 
	if (m_HasAlreadyExploded) 
		return; 
		 
	//Si l'explosif se trouve dans la map, on le fait exploser 
	int ExplosionX, ExplosionY; 
	if (g_BoomBastic.Tilemap->ConvertWorldToMap(Position, &ExplosionX, &ExplosionY)) 
	{ 
		//On joue un son d'explosion 
		g_BoomBastic.Sound.Play(EXPLODE_SOUND); 
		 
		//On cree une boule de feu a la place de l'explosif 
		new cFire(1.0f, ExplosionX, ExplosionY); 
		 
		//La tile ou etait l'explosif devient un cratere 
		g_BoomBastic.Tilemap->Map(ExplosionX, ExplosionY, MAP_CRATER); 
		 
		int i, j; 
		int ExplosionDirectionX, ExplosionDirectionY; 
		//On dessine des boules de feu dans les 4 directions (gauche, droite, haut et bas) 
		for (i = 0; i < 4; i++) 
		{ 
			//On exprime la direction en fonction de X et de Y 
			switch (i) 
			{ 
			default: 
			case 0: 
				ExplosionDirectionX = 0; 
				ExplosionDirectionY = 1; 
				break; 
				 
			case 1: 
				ExplosionDirectionX = -1; 
				ExplosionDirectionY = 0; 
				break; 
			 
			case 2: 
				ExplosionDirectionX = 1; 
				ExplosionDirectionY = 0; 
				break; 
				 
			case 3: 
				ExplosionDirectionX = 0; 
				ExplosionDirectionY = -1; 
				break; 
			} 
			 
			//On dessine m_Power boules de feu dans la direction courante 
			for (j = 1; j <= m_Power; j++) 
			{ 
				//Si la boule de feu n'est pas dans la map, on ne la dessine pas et on passe a la direction suivante 
				if (!g_BoomBastic.Tilemap->IsInTheMap(ExplosionX + j * ExplosionDirectionX, ExplosionY + j * ExplosionDirectionY)) 
					break; 
				 
				//Si la boule de feu est sur un bloc (maison ou palmier), on ne la dessine pas et on passe a la direction suivante 
				int LogicalTile = g_BoomBastic.Tilemap->LogicalMap(ExplosionX + j * ExplosionDirectionX, ExplosionY + j * ExplosionDirectionY); 
				if (LogicalTile == LMAP_BLOCK) 
					break; 
				 
				//Dans les autres cas, on dessine la boule de feu 
				new cFire(1.0f + j * 0.1f, ExplosionX + j * ExplosionDirectionX, ExplosionY + j * ExplosionDirectionY); 
				 
				//Si la boule de feu est sur un rocher, une bombe ou un bonus, on passe a la direction suivante 
				if (LogicalTile == LMAP_ROCK || LogicalTile == LMAP_BOMB || LogicalTile == LMAP_BONUS) 
					break;		 
			} 
		} 
		 
		//On cree une explosion avec 30 particules 
		for (i = 0; i < 30; i++) 
		{ 
			Vector3 ParticleVelocity = g_BoomBastic.Tools.randv() * 60.0f; 
			ParticleVelocity.z = 0.0f; 
			new cParticle(Position, ParticleVelocity, 2.0f, 0.0f, 14.0f, g_BoomBastic.Particles[EXPLO_PARTICLE]); 
		} 
	} 
	 
	LifeTime = 0.0f; 
	m_HasAlreadyExploded = true; 
} 
 
bool cExplosiveDevice::OnAnimate(float ElapsedTime, float AbsoluteTime) 
{ 
	int DeviceX, DeviceY; 
	if (g_BoomBastic.Tilemap->ConvertWorldToMap(Position, &DeviceX, &DeviceY)) 
	{ 
		//Si l'explosif est sur une tile en feu, on le fait exploser et il y aura donc une reaction en chaine entre les explosifs 
		if (g_BoomBastic.Tilemap->LogicalMap(DeviceX, DeviceY) == LMAP_FIRE) 
			Explode(); 
	} 
	return true; 
} 
 
void cExplosiveDevice::OnDying() 
{ 
	Explode(); 
}