📄 particlesystem.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : ParticleSystem.cpp
//
// PURPOSE : ParticleSystem - Implementation
//
// CREATED : 10/23/97
//
// ----------------------------------------------------------------------- //
#include "ParticleSystem.h"
#include "cpp_server_de.h"
#include "SFXMsgIds.h"
BEGIN_CLASS(ParticleSystem)
ADD_BOOLPROP(Static, 1)
ADD_LONGINTPROP(ParticleFlags, 0)
ADD_REALPROP(BurstWait, 0.0f)
ADD_REALPROP(ParticlesPerSecond, 0.0f)
ADD_REALPROP_FLAG(EmissionRadius, 0.0f,PF_RADIUS)
ADD_REALPROP(MinimumVelocity, 0.0f)
ADD_REALPROP(MaximumVelocity, 0.0f)
ADD_REALPROP(VelocityOffset, 0.0f)
ADD_REALPROP(ParticleLifetime, 5.0f)
ADD_REALPROP(ParticleRadius, 1000.0f)
ADD_REALPROP(Gravity, -500.0f)
ADD_REALPROP(RotationVelocity, 0.0f)
ADD_STRINGPROP(TextureName, "SpecialFX\\ParticleTextures\\particle.dtx")
ADD_COLORPROP(Color1, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(Color2, 255.0f, 0.0f, 0.0f)
END_CLASS_DEFAULT_FLAGS(ParticleSystem, CClientSFX, NULL, NULL, CF_ALWAYSLOAD)
// ----------------------------------------------------------------------- //
//
// ROUTINE: ParticleSystem::ParticleSystem
//
// PURPOSE: Initialize
//
// ----------------------------------------------------------------------- //
ParticleSystem::ParticleSystem() : CClientSFX()
{
m_dwFlags = 0;
m_fBurstWait = 0.0f;
m_fParticlesPerSecond = 0.0f;
m_fEmissionRadius = 0.0f;
m_fMinimumVelocity = 0.0f;
m_fMaximumVelocity = 0.0f;
m_fVelocityOffset = 0.0f;
m_fParticleLifetime = 0.0f;
m_fRadius = 1000.0f;
m_fGravity = -500.0f;
m_fRotationVelocity = 0.0f;
m_hstrTextureName = DNULL;
m_bStatic = DTRUE;
VEC_INIT(m_vColor1);
VEC_INIT(m_vColor2);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ParticleSystem::ParticleSystem
//
// PURPOSE: Destructor
//
// ----------------------------------------------------------------------- //
ParticleSystem::~ParticleSystem()
{
if (m_hstrTextureName)
{
g_pServerDE->FreeString(m_hstrTextureName);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ParticleSystem::EngineMessageFn
//
// PURPOSE: Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD ParticleSystem::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
switch(messageID)
{
case MID_PRECREATE:
{
if (fData == 1.0f || fData == 2.0f)
{
ReadProp((ObjectCreateStruct *)pData);
}
break;
}
case MID_INITIALUPDATE:
{
InitialUpdate((DVector *)pData);
break;
}
case MID_UPDATE:
{
CServerDE* pServerDE = GetServerDE();
if (pServerDE)
{
pServerDE->RemoveObject(m_hObject);
}
break;
}
default : break;
}
return CClientSFX::EngineMessageFn(messageID, pData, fData);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ParticleSystem::ReadProp
//
// PURPOSE: Set property value
//
// ----------------------------------------------------------------------- //
DBOOL ParticleSystem::ReadProp(ObjectCreateStruct *)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return DFALSE;
GenericProp genProp;
if (g_pServerDE->GetPropGeneric("Static", &genProp) == DE_OK)
m_bStatic = genProp.m_Bool;
if (g_pServerDE->GetPropGeneric("ParticleFlags", &genProp) == DE_OK)
m_dwFlags = genProp.m_Long;
if (g_pServerDE->GetPropGeneric("BurstWait", &genProp) == DE_OK)
m_fBurstWait = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("ParticlesPerSecond", &genProp) == DE_OK)
m_fParticlesPerSecond = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("EmissionRadius", &genProp) == DE_OK)
m_fEmissionRadius = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("MinimumVelocity", &genProp) == DE_OK)
m_fMinimumVelocity = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("MaximumVelocity", &genProp) == DE_OK)
m_fMaximumVelocity = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("VelocityOffset", &genProp) == DE_OK)
m_fVelocityOffset = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("ParticleLifetime", &genProp) == DE_OK)
m_fParticleLifetime = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("Color1", &genProp) == DE_OK)
VEC_COPY(m_vColor1, genProp.m_Color);
if (g_pServerDE->GetPropGeneric("Color2", &genProp) == DE_OK)
VEC_COPY(m_vColor2, genProp.m_Color);
if (g_pServerDE->GetPropGeneric("ParticleRadius", &genProp) == DE_OK)
m_fRadius = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("Gravity", &genProp) == DE_OK)
m_fGravity = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("RotationVelocity", &genProp) == DE_OK)
m_fRotationVelocity = genProp.m_Float;
if (g_pServerDE->GetPropGeneric("TextureName", &genProp) == DE_OK)
{
if (genProp.m_String[0]) m_hstrTextureName = pServerDE->CreateString(genProp.m_String);
}
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ParticleSystem::InitialUpdate
//
// PURPOSE: Handle initial Update
//
// ----------------------------------------------------------------------- //
void ParticleSystem::InitialUpdate(DVector *pMovement)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
// Tell the clients about the ParticleSystem, and remove thyself...
HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
// pServerDE->WriteToMessageByte(hMessage, SFX_PARTICLESYSTEM_ID | (( m_bStatic ) ? SFX_STATIC : 0 ));
pServerDE->WriteToMessageByte(hMessage, SFX_PARTICLESYSTEM_ID);
//pServerDE->WriteToMessageByte(hMessage, m_bStatic);
pServerDE->WriteToMessageVector(hMessage, &m_vColor1);
pServerDE->WriteToMessageVector(hMessage, &m_vColor2);
pServerDE->WriteToMessageFloat(hMessage, (DFLOAT)m_dwFlags);
pServerDE->WriteToMessageFloat(hMessage, m_fBurstWait);
pServerDE->WriteToMessageFloat(hMessage, m_fParticlesPerSecond);
pServerDE->WriteToMessageFloat(hMessage, m_fEmissionRadius);
pServerDE->WriteToMessageFloat(hMessage, m_fMinimumVelocity);
pServerDE->WriteToMessageFloat(hMessage, m_fMaximumVelocity);
pServerDE->WriteToMessageFloat(hMessage, m_fVelocityOffset);
pServerDE->WriteToMessageFloat(hMessage, m_fParticleLifetime);
pServerDE->WriteToMessageFloat(hMessage, m_fRadius);
pServerDE->WriteToMessageFloat(hMessage, m_fGravity);
pServerDE->WriteToMessageFloat(hMessage, m_fRotationVelocity);
pServerDE->WriteToMessageHString(hMessage, m_hstrTextureName);
pServerDE->EndMessage(hMessage);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -