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