-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathExplosionEmitter.cpp
82 lines (75 loc) · 2.64 KB
/
ExplosionEmitter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "ExplosionEmitter.h"
#include "Run3SoundRuntime.h"
ExplosionEmitter::ExplosionEmitter()
{
startemit=false;
mDispose=false;
}
ExplosionEmitter::~ExplosionEmitter()
{
}
void ExplosionEmitter::init()
{
SceneManager* mSceneMgr = global::getSingleton().getSceneManager();
//bSys=mSceneMgr->createParticleSystem("ExplosionEmit", "explosion01");
bNode=mSceneMgr->getRootSceneNode()->createChildSceneNode();
bSys=mSceneMgr->createParticleSystem(bNode->getName(), "explosion01");
bNode->attachObject(bSys);
bSys->setVisible(false);
}
void ExplosionEmitter::emitExplosion(Vector3 pos,Vector3 size)
{
bNode->setPosition(pos);
bNode->setScale(size);
bSys->setVisible(true);
startemit=true;
timePos=bSys->getEmitter(0)->getMaxDuration()+bSys->getEmitter(0)->getMaxTimeToLive();
Run3SoundRuntime::getSingleton().emitSound("run3/sounds/exp1.wav",timePos,false,pos,size.x*100,size.x*100);
global::getSingleton().mBw->blast(pos,size*100,size.x*40);
}
void ExplosionEmitter::emitExplosion(Vector3 pos,Vector3 size,String explosionSound)
{
bNode->setPosition(pos);
bNode->setScale(size);
bSys->setVisible(true);
startemit=true;
timePos=bSys->getEmitter(0)->getMaxDuration()+bSys->getEmitter(0)->getMaxTimeToLive();
Run3SoundRuntime::getSingleton().emitSound(explosionSound,timePos,false,pos,size.x*100,size.x*100);
global::getSingleton().mBw->blast(pos,size*100,size.x*40);
}
void ExplosionEmitter::init(String particle_file)
{
SceneManager* mSceneMgr = global::getSingleton().getSceneManager();
//bSys=mSceneMgr->createParticleSystem("ExplosionEmit", "explosion01");
bNode=mSceneMgr->getRootSceneNode()->createChildSceneNode();
bSys=mSceneMgr->createParticleSystem(bNode->getName(), particle_file);
bNode->attachObject(bSys);
bSys->setVisible(false);
}
void ExplosionEmitter::upd(const Ogre::FrameEvent &evt)
{
if (startemit)
{
Real tShift = TIME_SHIFT;
timePos-=evt.timeSinceLastFrame*tShift;
if (tShift<1.0f)
{
bSys->getEmitter(0)->setEmissionRate(bSys->getEmitter(0)->getEmissionRate()*tShift);
bSys->getEmitter(0)->setTimeToLive(bSys->getEmitter(0)->getTimeToLive()*(2-tShift));
bSys->getEmitter(0)->setParticleVelocity(bSys->getEmitter(0)->getParticleVelocity()*tShift);
bSys->getEmitter(0)->setDuration(bSys->getEmitter(0)->getDuration()*(2-tShift));
}
if (tShift>1.0f)
{
bSys->getEmitter(0)->setEmissionRate(bSys->getEmitter(0)->getEmissionRate()*tShift);
bSys->getEmitter(0)->setTimeToLive(bSys->getEmitter(0)->getTimeToLive()/tShift);
bSys->getEmitter(0)->setParticleVelocity(bSys->getEmitter(0)->getParticleVelocity()*tShift);
bSys->getEmitter(0)->setDuration(bSys->getEmitter(0)->getDuration()/tShift);
}
if (timePos<0)
{
bSys->setVisible(false);
destroyEmitter();
}
}
}