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

📄 particlesystem.cpp

📁 Blood 2全套源码
💻 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 + -