⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fountain.cpp

📁 一个功能简单的音乐喷泉
💻 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 + -