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

📄 tracerfx.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : TracerFX.cpp
//
// PURPOSE : Tracer special FX - Implementation
//
// CREATED : 1/21/97
//
// ----------------------------------------------------------------------- //

#include "TracerFX.h"
#include "cpp_client_de.h"
#include "ClientUtilities.h"

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTracerFX::Init
//
//	PURPOSE:	Init the tracer fx
//
// ----------------------------------------------------------------------- //

DBOOL CTracerFX::Init(SFXCREATESTRUCT* psfxCreateStruct)
{
	if (!CBaseLineSystemFX::Init(psfxCreateStruct)) return DFALSE;

	TRACERCREATESTRUCT* pCL = (TRACERCREATESTRUCT*)psfxCreateStruct;
	VEC_COPY(m_vVel, pCL->vVel);
	VEC_COPY(m_vStartColor, pCL->vStartColor);
	VEC_COPY(m_vEndColor, pCL->vEndColor);
	VEC_COPY(m_vStartPos, pCL->vStartPos);

	if (m_hServerObject)
		m_pClientDE->GetObjectRotation(m_hServerObject, &m_rRotation);
	else
		ROT_COPY(m_rRotation, pCL->rRot);
	m_fStartAlpha = pCL->fStartAlpha;
	m_fEndAlpha	  = pCL->fEndAlpha;

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTracerFX::Update
//
//	PURPOSE:	Update the tracer
//
// ----------------------------------------------------------------------- //

DBOOL CTracerFX::Update()
{
	if(!m_hObject || !m_pClientDE) return DFALSE;

	DFLOAT fTime = m_pClientDE->GetTime();

	if (m_bFirstUpdate)
	{
		DFLOAT fTracerLength = 50.0f;

		m_bFirstUpdate	= DFALSE;
		m_fStartTime	= fTime;

		// Set the rotation/position based on server object...

		DVector vPos, vCastPos;

		DVector vTemp, vU, vR, vF;
		m_pClientDE->GetRotationVectors(&m_rRotation, &vU, &vR, &vF);
		VEC_NORM(vF);

		// Make sure we cast a ray out side of the player's box...

		VEC_MULSCALAR(vTemp, vF, 50.0f);
		VEC_ADD(vCastPos, m_vStartPos, vTemp);

		// Cast a ray to find the ending point...

		ClientIntersectQuery iQuery;
		ClientIntersectInfo  iInfo;
	
		VEC_COPY(iQuery.m_From, vCastPos);
		VEC_COPY(iQuery.m_Direction, vF);

		DFLOAT fDistance = 5000.0f;  // Far, far, away...

		if (m_pClientDE->CastRay(&iQuery, &iInfo))
		{		
			// Calculate the distance to the world

			VEC_SUB(vPos, iInfo.m_Point, m_vStartPos);
			fDistance = VEC_MAG(vPos) - fTracerLength;

			if (fDistance < fTracerLength)
			{
				return DFALSE;
			}
		}
		else
		{
			return DFALSE;
		}
		

		// Set the starting position...
	
		DFLOAT fOffset = GetRandom(0.0f, fDistance);

		VEC_MULSCALAR(vTemp, vF, fTracerLength + fOffset);
		VEC_ADD(vPos, vCastPos, vTemp);
		m_pClientDE->SetObjectPos(m_hObject, &vPos);

		m_fDuration = .1f;

		DVector vStartPoint, vEndPoint;
		VEC_SET(vStartPoint, 0.0f, 0.0f, -fTracerLength);  // Z is straight ahead
		VEC_SET(vEndPoint, 0.0f, 0.0f, fTracerLength);  

		DELine line;

		VEC_COPY(line.m_Points[0].m_Pos, vStartPoint);
		line.m_Points[0].r = m_vStartColor.x;
		line.m_Points[0].g = m_vStartColor.y;
		line.m_Points[0].b = m_vStartColor.z;
		line.m_Points[0].a = m_fStartAlpha;

		VEC_COPY(line.m_Points[1].m_Pos, vEndPoint);
		line.m_Points[1].r = m_vEndColor.x;
		line.m_Points[1].g = m_vEndColor.y;
		line.m_Points[1].b = m_vEndColor.z;
		line.m_Points[1].a = m_fEndAlpha;

		m_pClientDE->AddLine(m_hObject, &line);

		fOffset = .05f;

		line.m_Points[0].m_Pos.x += fOffset;
		line.m_Points[0].r = m_vStartColor.x;
		line.m_Points[0].g = m_vStartColor.y;
		line.m_Points[0].b = m_vStartColor.z;
		line.m_Points[0].a = m_fStartAlpha;

		line.m_Points[1].m_Pos.x += fOffset;
		line.m_Points[1].r = m_vEndColor.x;
		line.m_Points[1].g = m_vEndColor.y;
		line.m_Points[1].b = m_vEndColor.z;
		line.m_Points[1].a = m_fEndAlpha;

		m_pClientDE->AddLine(m_hObject, &line);

		line.m_Points[0].m_Pos.x -= 2.0f*fOffset;
		line.m_Points[0].r = m_vStartColor.x;
		line.m_Points[0].g = m_vStartColor.y;
		line.m_Points[0].b = m_vStartColor.z;
		line.m_Points[0].a = m_fStartAlpha;

		line.m_Points[1].m_Pos.x -= 2.0f*fOffset;
		line.m_Points[1].r = m_vEndColor.x;
		line.m_Points[1].g = m_vEndColor.y;
		line.m_Points[1].b = m_vEndColor.z;
		line.m_Points[1].a = m_fEndAlpha;

		m_pClientDE->AddLine(m_hObject, &line);
	}
	else if (fTime > m_fStartTime + m_fDuration)
	{
		return DFALSE;
	}

	return DTRUE;
}

⌨️ 快捷键说明

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