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

📄 lightningsegmentfx.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : LightningSegmentFX.cpp
//
// PURPOSE : Special FX class for lightning-like instant particle streams
//
// CREATED : 8/1/98
//
// ----------------------------------------------------------------------- //

#include "LightningSegmentFX.h"
#include "cpp_client_de.h"
#include "ClientUtilities.h"
#include "ClientServerShared.h"
#include "BloodClientShell.h"
#include "SFXMsgIds.h"

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLightningSegmentFX::Init
//
//	PURPOSE:	Init the segment
//
// ----------------------------------------------------------------------- //

DBOOL CLightningSegmentFX::Init(SFXCREATESTRUCT* psfxCreateStruct)
{
	if (!CBaseParticleSystemFX::Init(psfxCreateStruct)) return DFALSE;

	LSEGMENTCREATESTRUCT	*pLS = (LSEGMENTCREATESTRUCT*)psfxCreateStruct;

	VEC_COPY(m_vOffset, pLS->vOffset);
	VEC_COPY(m_vNextOffset, pLS->vNextOffset);
	VEC_COPY(m_vColor1, pLS->vColor);
	VEC_COPY(m_vColor2, pLS->vColor);
	m_fIncrement	= pLS->fIncrement;
	m_fAlpha		= pLS->fAlpha;
	m_fRadius		= pLS->fRadius;
	m_fDuration		= pLS->fDuration;
	m_fFadeTime		= pLS->fFadeTime;
	m_nNumParticles	= pLS->nNumParticles;
	m_hstrTexture	= pLS->hstrTexture;

	m_fGravity		= 0;

	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLightningSegmentFX::CreateObject()
//
//	PURPOSE:	Create the particle system
//
// ----------------------------------------------------------------------- //

DBOOL CLightningSegmentFX::CreateObject(CClientDE* pClientDE)
{
	if(!pClientDE) return DFALSE;

	if(m_hstrTexture)
		m_pTextureName = pClientDE->GetStringData(m_hstrTexture);
	else
		m_pTextureName	= "SpriteTextures\\Particles\\Particle1.dtx";

	int ret = CBaseParticleSystemFX::CreateObject(pClientDE);

	if(ret)
	{
		DFLOAT		r, g, b, a;
		DRotation	rRot;
		DVector		vDir, vU;

		VEC_SET(vU, 0.0f, 1.0f, 0.0f);
		VEC_SUB(vDir, m_vNextOffset, m_vOffset);
		m_pClientDE->AlignRotation(&rRot, &vDir, &vU);

		m_pClientDE->SetObjectPos(m_hObject, &m_vOffset);
		m_pClientDE->SetObjectRotation(m_hObject, &rRot);

		m_pClientDE->GetObjectColor(m_hObject, &r, &g, &b, &a);
		m_pClientDE->SetObjectColor(m_hObject, r, g, b, m_fAlpha);

		CreateParticles();
		m_fStartTime = m_pClientDE->GetTime();
	}

	return ret;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLightningSegmentFX::Update
//
//	PURPOSE:	Update the particles
//
// ----------------------------------------------------------------------- //

DBOOL CLightningSegmentFX::Update()
{
	if(!m_pClientDE) return DFALSE;

	DFLOAT		fTime = m_pClientDE->GetTime() - m_fStartTime;

	// Check to see if we should start fading the particles out
	if(m_fFadeTime && (fTime >= (m_fDuration - m_fFadeTime)))
	{
		DFLOAT		r, g, b, a;
		m_pClientDE->GetObjectColor(m_hObject, &r, &g, &b, &a);

		a = m_fAlpha * (1.0f - ((fTime - (m_fDuration - m_fFadeTime)) / m_fFadeTime));
		if(a < 0.0f)	a = 0.0f;

		m_pClientDE->SetObjectColor(m_hObject, r, g, b, a);
	}

	// Return TRUE to keep... FALSE to remove
	return	(fTime < m_fDuration);
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLightningSegmentFX::CreateParticles
//
//	PURPOSE:	Create the particles
//
// ----------------------------------------------------------------------- //

DBOOL CLightningSegmentFX::CreateParticles()
{
	DVector		tempPos, tempPosOffset, vel;
	VEC_SET(vel, 0.0f, 0.0f, 0.0f);
	VEC_SET(tempPosOffset, 0.0f, 0.0f, m_fIncrement);

	for(DDWORD i = 0; i < m_nNumParticles; i++)
	{
		m_pClientDE->AddParticle(m_hObject, &tempPos, &vel, &m_vColor1, m_fDuration);
		VEC_ADD(tempPos, tempPos, tempPosOffset);
	}

	return	DTRUE;
}

⌨️ 快捷键说明

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