📄 particlesystem.cpp
字号:
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 + -