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

📄 particlesystem.cpp

📁 这是一款游戏中的粒子系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		int c=0;//向心外力标记

		//计算外力类型数目
		for (int i=0;i<(int)(it->second->m_AffectorVector.size());i++)
		{ 
			CParticleAffector *affect=it->second->m_AffectorVector.at(i);
			if(affect->type==CParticleAffector::Axis)
				a++;
			if(affect->type==CParticleAffector::Box)
				b++;
			if(affect->type==CParticleAffector::Center)
				c++;
		}
		//标记外力类型个数以方便加载分析
		//轴向外力个数
		sprintf(value,"%d",a);
		Write(filename,section,"EmitAxisForceNum",value);
		//发射区域外力个数
		sprintf(value,"%d",b);
		Write(filename,section,"EmitBoxForceNum",value);
		//向心外力个数
		sprintf(value,"%d",c);
		Write(filename,section,"EmitCenterForceNum",value);

		//存储外力参数
		int aIndex=1;
		int bIndex=1;
		int cIndex=1;
		for (int i=0;i<(int)(it->second->m_AffectorVector.size());i++)
		{ 
			CParticleAffector *affect=it->second->m_AffectorVector.at(i);
			if(affect->type==CParticleAffector::Axis)
			{
				//按照三维坐标方式存储
               sprintf(property,"%s%d","Axis",aIndex++);
			   D3DXVECTOR3 vec=affect->GetParamVector(0);
			   sprintf(value,"%s%f%s%f%s%f%s","(",vec.x,",",vec.y,",",vec.z,")");
			   Write(filename,section,property,value);
			}
			if(affect->type==CParticleAffector::Box)
			{
				//按照顶点到顶点方式存储
				sprintf(property,"%s%d","Box",bIndex++);
				D3DXVECTOR3 vec0=affect->GetParamVector(0);
				D3DXVECTOR3 vec1=affect->GetParamVector(1);
				sprintf(value,"%s%f%s%f%s%f%s","(",vec0.x,",",vec0.y,",",vec0.z,")");
				sprintf(value,"%s%s",value,"->");
				sprintf(value,"%s%s%f%s%f%s%f%s",value,"(",vec1.x,",",vec1.y,",",vec1.z,")");
				Write(filename,section,property,value);
			}
			if(affect->type==CParticleAffector::Center)
			{
				//按照 (力量大小,近距离,远距离,衰减) 方式存储
				sprintf(property,"%s%d","Center",cIndex++);
				sprintf(value,"%s%f%s%f%s%f%s%f%s","(",affect->GetParamFloat(0),
					",",affect->GetParamFloat(1),",",affect->GetParamFloat(2),
					",",affect->GetParamFloat(3),")");
				Write(filename,section,property,value);
			}
		}

	}
	::MessageBox(NULL,"保存粒子配置文件成功","成功",MB_OK);
	return true;
}

bool CParticleSystem::InportConfigFile(char *filename)
{
	char *value=new char[FILESIZE];
	//检查配置文件标识符
	Read(filename,"FileType","Type",value);
	if(strcmp(value,"ParticleSystem")!=0)
	{
		::MessageBox(NULL,"配置文件错误","类型错误",MB_OK);
		return false;
	}
    //读取粒子池的个数
    Read(filename,"EmitNumber","EmitNum",value);
	int number=atoi(value);
	for(int i=0;i<number;i++){
		//注册粒子池

		char *section=new char[50];
		//设置读取段名
		sprintf(section,"%s%d","Emit",i+1);
		EmitParameter para;

		//读取粒子池名称
		Read(filename,section,"EmitName",value);
		para.name=value;

		//读取 粒子池大小
		Read(filename,section,"EmitPoolSize",value);
		para.maxnumber=atoi(value);

		//读取粒子池的发射频率
		Read(filename,section,"EmitPS",value);
		para.productPS=(long)(atoi(value));

		//读取粒子池的纹理
		Read(filename,section,"EmitTexture",value);
		para.texture=value;

		//读取粒子基本大小
		Read(filename,section,"EmitSize",value);
		para.size=(float)(atof(value));

		//读取粒子变量大小
		Read(filename,section,"EmitSizeVar",value);
		para.sizeVar=(float)(atof(value));

		//读取粒子基本颜色
		Read(filename,section,"EmitColorBase",value);
		para.color=(D3DCOLOR)(atoi(value));

		//读取粒子变量颜色
		Read(filename,section,"EmitColorVar",value);
		para.colorVar=(D3DCOLOR)(atoi(value));

		//读取粒子基本生命周期
		Read(filename,section,"EmitLife",value);
		para.life=(float)(atof(value));

		//读取粒子变量生命周期
		Read(filename,section,"EmitLifeVar",value);
		para.lifeVar=(float)(atof(value));

		//读取粒子池的相对位置X
		Read(filename,section,"EmitPosX",value);
		para.relativePos.x=(float)(atof(value));

		//读取粒子池的相对位置Y
		Read(filename,section,"EmitPosY",value);
		para.relativePos.y=(float)(atof(value));

		//读取粒子池的相对位置Z
		Read(filename,section,"EmitPosZ",value);
		para.relativePos.z=(float)(atof(value));

		//读取粒子池的发射数度(能表示大小和方向)
		//基本X
		Read(filename,section,"EmitDirX",value);
		para.speedDir.x=(float)(atof(value));

		//基本Y
		Read(filename,section,"EmitDirY",value);
		para.speedDir.y=(float)(atof(value));

		//基本Z
		Read(filename,section,"EmitDirZ",value);
		para.speedDir.z=(float)(atof(value));

		//变量X
		Read(filename,section,"EmitDirVarX",value);
		para.speedDirVar.x=(float)(atof(value));

		//变量Y
		Read(filename,section,"EmitDirVarY",value);
		para.speedDirVar.y=(float)(atof(value));

		//变量Z
		Read(filename,section,"EmitDirVarZ",value);
		para.speedDirVar.z=(float)(atof(value));

		//注册粒子池 
		CParticleEmitter* emit = new CParticleEmitter( m_pDevice,this , para.name ,
			            para.maxnumber , para.productPS , 0 ,  para.size ,  para.color);
		m_EmitterMap.insert( make_pair(para.name , emit) );
		m_ParameterVector.push_back(para);
		emit->Initialize();

		/////////////////////////读取效果文件内容////////////////////////////
		//轴向外力个数
		Read(filename,section,"EmitAxisForceNum",value);
		int a=atoi(value);

		//向心外力个数
		Read(filename,section,"EmitCenterForceNum",value);
		int c=atoi(value);

		//发射区域范围
		Read(filename,section,"EmitBoxForceNum",value);
		int b=atoi(value);

		//注册外力因子
		//向心外力影响子
		CParticleAffector *m_affect;
		for(int j=0;j<c;j++){
			m_affect= new CCenterForceLogic(emit);
			char *property=new char[50];
			sprintf(property,"%s%d","Center",j+1);
			//读取数据字符串
			Read(filename,section,property,value);

			//分离数据
            CString S_value=CString(value);
            int start=0;
			int end=0;
			start=S_value.Find('(',start);
			end=S_value.Find(',',start+1);
			float force=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(',',start+1);
			float nr=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(',',start+1);
			float fr=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(')',start+1);
			float cut=(float)(atof(S_value.Mid(start+1,end-start-1)));

			m_affect->SetParamFloat(0,force);
			m_affect->SetParamFloat(1,nr);
			m_affect->SetParamFloat(2,fr);
			m_affect->SetParamFloat(3,cut);
			emit->AddAffector(m_affect);
		}
		//轴向外力影响子
		for(int j=0;j<a;j++){
			m_affect= new CAxisForceLogic(emit);
			D3DXVECTOR3 vec;

			char *property=new char[50];
			sprintf(property,"%s%d","Axis",j+1);
			//读取数据字符串
			Read(filename,section,property,value);

			//分离数据
			CString S_value=CString(value);
			int start=0;
			int end=0;
			start=S_value.Find('(',start);
			end=S_value.Find(',',start+1);
			vec.x=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(',',start+1);
			vec.y=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(')',start+1);
			vec.z=(float)(atof(S_value.Mid(start+1,end-start-1)));

			m_affect->SetParamVector(0,vec);
			emit->AddAffector(m_affect);
		}
		//发射区域影响子
		for(int j=0;j<b;j++){
			D3DXVECTOR3 vec1;
			D3DXVECTOR3 vec2;

			D3DXVECTOR3 vec;

			char *property=new char[50];
			sprintf(property,"%s%d","Box",j+1);
			//读取数据字符串
			Read(filename,section,property,value);

			//分离数据
			CString S_value=CString(value);
			int start=0;
			int end=0;

			//第一个向量
			start=S_value.Find('(',start);
			end=S_value.Find(',',start+1);
			vec1.x=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(',',start+1);
			vec1.y=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(')',start+1);
			vec1.z=(float)(atof(S_value.Mid(start+1,end-start-1)));

			//第二个向量
			start=S_value.Find('(',start);
			end=S_value.Find(',',start+1);
			vec2.x=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(',',start+1);
			vec2.y=(float)(atof(S_value.Mid(start+1,end-start-1)));
			start=end;
			end=S_value.Find(')',start+1);
			vec2.z=(float)(atof(S_value.Mid(start+1,end-start-1)));

			m_affect= new CBoxCreator(emit);
			m_affect->SetParamVector(0,vec1);
			m_affect->SetParamVector(1,vec2);
			emit->AddAffector(m_affect);
		}
	}
	return true;
}

⌨️ 快捷键说明

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