📄 fountain.cpp
字号:
#include <irrlicht.h>
#include <IParticleBoxEmitter.h>
#include "fountain.h"
using namespace irr;
using namespace irr::core;
using namespace irr::scene;
using namespace irr::video;
extern float *spectrum;
Fountain::Fountain(int i,IVideoDriver *driver,ISceneManager *smgr)
{
int j;
for(j=0;j<8;j++){
// 创建一个喷嘴
IParticleSystemSceneNode* nozzle = smgr->addParticleSystemSceneNode(
false, // 表示不使用默认的点式粒子发射器
NULL, // 父节点
-1, // 节点ID
vector3df(-250+70*i,60,40), // 位置
vector3df(0,0,0), // 旋转
vector3df(2,2,2) // 缩放
);
// 设置粒子大小
nozzle->setParticleSize(dimension2d<f32>(5.0f, 5.0f));
nozzles[j]=nozzle;
// 盒式粒子发射器
IParticleBoxEmitter *nozzle_emitter = nozzle->createBoxEmitter(
aabbox3d<f32>(0,-40,0,0.5,1,0.5), // 约束盒
vector3df(0.1f*sin((j+1)*3.1415926/4),0.5f,0.1f*cos((j+1)*3.1415926/4)), // 方向
200, // 每秒最少产生的粒子数
300,// 每秒最多产生的粒子数
SColor(0,255,255,255), // 颜色的最小值
SColor(0,255,255,255), // 颜色的最大值
// 粒子发射器所产生的颜色是通过两者之间插值随机产生的
80, // 最短粒子生存的毫秒数
1000, // 最长的粒子生存的毫秒数
0
);
nozzle->setEmitter(nozzle_emitter);
nozzle_emitter->drop();
// 增加一个淡出影响器
IParticleAffector* fader = nozzle->createFadeOutParticleAffector();
nozzle->addAffector(fader);
fader->drop();
// 增加重力
IParticleAffector* gravity = nozzle->createGravityAffector(vector3df(0.0f,-2.0f,0.0f));
nozzle->addAffector(gravity);
gravity->drop();
// 设置一个材质
nozzle->setMaterialFlag(EMF_LIGHTING, false);
nozzle->setMaterialTexture(0, driver->getTexture("media/drop.png"));
nozzle->setMaterialType(EMT_TRANSPARENT_VERTEX_ALPHA);
//smgr->addSphereSceneNode(5.0f,16,nozzle);
}
}
void Fountain::setColor(SColor color){
int i;
for(i=0;i<8;i++){
IParticleEmitter* nozzle_emitter = nozzles[i]->createBoxEmitter(
aabbox3d<f32>(0,-40,0,0.5,1,0.5), // 约束盒
vector3df(0.1f*sin((i+1)*3.1415926/4),0.5f,0.1f*cos((i+1)*3.1415926/4)), // 方向
90, // 每秒最少产生的粒子数
300,// 每秒最多产生的粒子数
color, // 颜色的最小值
SColor(0,128,128,128), // 颜色的最大值
// 粒子发射器所产生的颜色是通过两者之间插值随机产生的
80, // 最短粒子生存的毫秒数
1000, // 最长的粒子生存的毫秒数
0
);
nozzles[i]->setEmitter(nozzle_emitter);
nozzle_emitter->drop();
}
}
void Fountain::setHeight(float height)
{
int i;
for(i=0;i<8;i++){
IParticleEmitter* nozzle_emitter = nozzles[i]->createBoxEmitter(
aabbox3d<f32>(0,-40,0,0.5,1,0.5), // 约束盒
vector3df(0.1f*sin((i+1)*3.1415926/4),height,0.1f*cos((i+1)*3.1415926/4)), // 方向
90, // 每秒最少产生的粒子数
300,// 每秒最多产生的粒子数
SColor(0,255,255,255),
SColor(0,255,255,255), // 颜色的最大值
// 粒子发射器所产生的颜色是通过两者之间插值随机产生的
80, // 最短粒子生存的毫秒数
1000, // 最长的粒子生存的毫秒数
0
);
nozzles[i]->setEmitter(nozzle_emitter);
nozzle_emitter->drop();
}
}
FountainSystem::FountainSystem(IVideoDriver *driver,ISceneManager *smgr){
int i;
for(i=0;i<10;i++)
fountains[i]=new Fountain(i,driver,smgr);
// 创建十个喷泉
selected=NULL;
}
bool FountainSystem::OnEvent(const SEvent &event){
return false;
}
void FountainSystem::showSpectrum(){
setHeight(spectrum[0]*10.0f);
}
void FountainSystem::setHeight(float height){
if(selected){
selected->setHeight(height);
}else{
int i;
for(i=0;i<10;i++)
fountains[i]->setHeight(height);
}
}
void FountainSystem::setColor(int r,int g,int b){
if(selected){
selected->setColor(SColor(0,r,g,b));
}else{
int i;
for(i=0;i<10;i++)
fountains[i]->setColor(SColor(0,r,g,b));
}
}
FountainSystem::~FountainSystem(){
int i;
for(i=0;i<10;i++)
delete fountains[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -