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

📄 particlesystem.cpp

📁 这是一款游戏中的粒子系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include ".\particlesystem.h"

#include "ParticleEmitter.h"

CParticleSystem::CParticleSystem(LPDIRECT3DDEVICE9 device)
{
	m_pDevice=device;
	m_look=m_up=D3DXVECTOR3(0,0,0);
	m_EmitterMap.clear();
	m_vecPosition = D3DXVECTOR3(0,0,0);
	m_renderRect.bottom=m_renderRect.left=m_renderRect.right=m_renderRect.top=0;
}


CParticleSystem::~CParticleSystem()
{
	Destroy();
}

void CParticleSystem::SetRenderRect(RECT rect){
	m_renderRect=rect;
}

RECT CParticleSystem::GetRenderRect(){
	return m_renderRect;
}

CParticleEmitter*	CParticleSystem::PushEmitter( const string& name , long maxparticle , long emit_ps , float spd , float size , D3DCOLOR clr )
{
	// 注册
	CParticleEmitter* emit = new CParticleEmitter( m_pDevice,this , name , maxparticle , emit_ps , spd , size , clr );
	
	m_EmitterMap.insert( make_pair(name , emit) );

	EmitParameter para;
	para.name=name;
	para.maxnumber=maxparticle;
	para.productPS=emit_ps;
    para.size=size;
	para.sizeVar=0;
	para.color=clr;
	para.colorVar=0;
    para.life=0;
	para.lifeVar=0;
	para.relativePos=D3DXVECTOR3(0,0,0);
	para.speedDir=D3DXVECTOR3(0,0,0);
	para.speedDirVar=D3DXVECTOR3(0,0,0);
	para.texture="";
	para.speed=0;
	m_ParameterVector.push_back(para);

	emit->Initialize();
	return emit;
}

CParticleEmitter*	CParticleSystem::GetEmitter( const string& name )
{
	EmitterMap::iterator it = m_EmitterMap.find( name );
	if ( it == m_EmitterMap.end() )
	{ 
		return NULL; 
	}
	return it->second;
}

long CParticleSystem::GetEmitterNumber()
{
	return (long)m_EmitterMap.size();
}

void CParticleSystem::RemoveEmitter( const string& name )
{
	EmitterMap::iterator it = m_EmitterMap.find( name );
	if ( it == m_EmitterMap.end() )
	{ 
		return;
	}

	SAFE_DELETE( it->second );
	m_EmitterMap.erase( it );
}

void CParticleSystem::RemoveEmitter( CParticleEmitter* emit )
{
	RemoveEmitter(emit->GetName());
}

void CParticleSystem::Initialize()
{
	EmitterMap::iterator it = m_EmitterMap.begin();
	for ( ; it != m_EmitterMap.end() ; ++it )
	{
		it->second->Initialize();
	}
}

void CParticleSystem::Update( float fElapsed )
{
	EmitterMap::iterator it = m_EmitterMap.begin();
	for ( ; it != m_EmitterMap.end() ; ++it )
	{
		it->second->Update( fElapsed );
	}
}

void CParticleSystem::SetEmitParameter(CParticleEmitter *emit,EmitParameter *parameter){
	emit->SetColor(parameter->color,parameter->colorVar);
	emit->SetEmitRate(parameter->productPS);
	emit->SetLifeSpan(parameter->life,parameter->lifeVar);
	emit->SetRelativePos(parameter->relativePos);
	emit->SetSize(parameter->size,parameter->sizeVar);
	emit->SetSpeed(parameter->speedDir,parameter->speedDirVar);
	emit->SetName(parameter->name);
	emit->SetTexture(parameter->texture._Myptr());
}

void CParticleSystem::Render(CCamera *camera)
{
	m_cameraDirection=camera->GetDirection();
	m_look=*(camera->GetLookat());
	m_up=*(camera->GetUp());
	EmitterMap::iterator it = m_EmitterMap.begin();

	int pos=0;

	for ( ; it != m_EmitterMap.end() ; ++it,++pos)
	{
        bool find=false;
		for (int i=0;i<(int)(m_ParameterVector.size())&&find==false;i++)
		{
			EmitParameter parame=m_ParameterVector.at(i);
			if(strcmp(parame.name._Myptr(),it->second->GetName()._Myptr())==0)
			{
				SetEmitParameter(it->second,&m_ParameterVector.at(i));
				it->second->Render(m_cameraDirection);
				find=true;
			}
		}
	}
}


void CParticleSystem::Destroy()
{
	EmitterMap::iterator it = m_EmitterMap.begin();
	for ( ; it != m_EmitterMap.end() ; ++it )
	{ SAFE_DELETE( it->second ); }

	m_EmitterMap.clear();
	SAFE_RELEASE(m_pDevice);
}

void CParticleSystem::SetActive( bool act )
{
	EmitterMap::iterator it = m_EmitterMap.begin();
	for ( ; it != m_EmitterMap.end() ; ++it )
	{
		it->second->SetActive( act );
	}
}

bool CParticleSystem::GetActive()
{
	bool act = false;
	EmitterMap::iterator it = m_EmitterMap.begin();
	for ( ; it != m_EmitterMap.end() ; ++it )
	{
		act |= it->second->GetActive();
	}
	return act;
}

void CParticleSystem::SetPosition( const D3DXVECTOR3& pos )
{
	// 各个子Emitter的Pos变化由他们自己去做 
	m_vecPosition = pos;
}

D3DXVECTOR3& CParticleSystem::GetPosition()
{
	return m_vecPosition;
}


void CParticleSystem::Read(char* filename,char* section,char* property,char *value){
	sprintf(value,"%s","");//清空记录
	GetPrivateProfileString(section,property,Error,
		value,FILESIZE,filename);
}

void CParticleSystem::Write(char *filename,char*section,char* property,char* value){
	int ret=WritePrivateProfileString(section,property,value,filename);
}

bool CParticleSystem::ExportConfigFile(char *filename)
{
	char* section=new char[FILESIZE];
	char* value=new char[FILESIZE];
    char* property=new char[FILESIZE];
	//配置文件标识符
	Write(filename,"FileType","Type","ParticleSystem");
	//写粒子池的个数
	sprintf(value,"%d",(int)(m_EmitterMap.size()));
	Write(filename,"EmitNumber","EmitNum",value);

	EmitterMap::iterator it = m_EmitterMap.begin();
	int pos=0;
	for ( ; it != m_EmitterMap.end() ; ++it,++pos)
	{
		//写特定粒子池的段名
		sprintf(section,"%s%d","Emit",pos+1);
		EmitParameter parame=m_ParameterVector.at(pos);

		//写粒子池的名字
		Write(filename,section,"EmitName",(parame.name)._Myptr());

		//粒子池的最大粒子数
		sprintf(value,"%d",parame.maxnumber);
        Write(filename,section,"EmitPoolSize",value);
        
		//粒子池的发射频率
		sprintf(value,"%d",parame.productPS);
		Write(filename,section,"EmitPS",value);

		//粒子池的纹理
		if(strlen(parame.texture._Myptr())<=0)
			Write(filename,section,"EmitTexture","NULL");
		else
            Write(filename,section,"EmitTexture",(parame.texture)._Myptr());
 
		//粒子池对发射中心的相对位置
		//X
		sprintf(value,"%f",parame.relativePos.x);
		Write(filename,section,"EmitPosX",value);
        //Y
		sprintf(value,"%f",parame.relativePos.y);
		Write(filename,section,"EmitPosY",value);
        //Z
		sprintf(value,"%f",parame.relativePos.z);
		Write(filename,section,"EmitPosZ",value);

		//粒子池的颜色属性
        //基本颜色
		sprintf(value,"%d",parame.color);
		Write(filename,section,"EmitColorBase",value);
		//变量颜色
		sprintf(value,"%d",parame.colorVar);
		Write(filename,section,"EmitColorVar",value);

		//粒子池的生命周期属性
		//基本生命
		sprintf(value,"%f",parame.life);
		Write(filename,section,"EmitLife",value);
        //变量生命
		sprintf(value,"%f",parame.lifeVar);
		Write(filename,section,"EmitLifeVar",value);

		//粒子池的大小属性
		//基本大小
		sprintf(value,"%f",parame.size);
		Write(filename,section,"EmitSize",value);
		//变量大小
		sprintf(value,"%f",parame.sizeVar);
		Write(filename,section,"EmitSizeVar",value);

		//粒子池对发射方向
		//X
		sprintf(value,"%f",parame.speedDir.x);
		Write(filename,section,"EmitDirX",value);
		//Y
		sprintf(value,"%f",parame.speedDir.y);
		Write(filename,section,"EmitDirY",value);
		//Z
		sprintf(value,"%f",parame.speedDir.z);
		Write(filename,section,"EmitDirZ",value);

		//粒子池对发射方向变量
		//X
		sprintf(value,"%f",parame.speedDirVar.x);
		Write(filename,section,"EmitDirVarX",value);
		//Y
		sprintf(value,"%f",parame.speedDirVar.y);
		Write(filename,section,"EmitDirVarY",value);
		//Z
		sprintf(value,"%f",parame.speedDirVar.z);
		Write(filename,section,"EmitDirVarZ",value);

		//粒子池的外力参数
		int a=0;//轴向外力标记
		int b=0;//区域影响标记

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -