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

📄 impacts.cpp

📁 Blood 2全套源码
💻 CPP
字号:
//----------------------------------------------------------
//
// MODULE  : IMPACTS.CPP
//
// PURPOSE : defines classes for little impacts upon walls etc
//
// CREATED : 9/25/97
//
//----------------------------------------------------------

// Includes....
#include <stdio.h>
#include <string.h>
#include <mbstring.h>
#include "serverobj_de.h"
#include "Impacts.h"
#include "cpp_server_de.h"


BEGIN_CLASS(CImpact)
END_CLASS_DEFAULT_FLAGS(CImpact, BaseClass, NULL, NULL, CF_HIDDEN)


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::CImpact
//
//	PURPOSE:	Initialize
//
// ----------------------------------------------------------------------- //

CImpact::CImpact() : BaseClass(OT_SPRITE)
{
	m_bPlaySound	= DTRUE;
	m_bUpdateScale	= DTRUE;
	m_bFirstUpdate	= DTRUE;

	VEC_INIT(m_vScaleMin);
	VEC_INIT(m_vScaleMax);
	VEC_SET(m_vScale, 0.1f, 0.1f, 0.0f);

	m_fDuration		= 0.3f;
	m_fStartTime	= 0.0f;

	m_hSoundName	= DNULL;
	m_fSoundVol		= 200;
	m_bRotateable	= DFALSE;
	m_bFade			= DFALSE;

	red = green = blue = alpha = 0.0f;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::~CImpact
//
//	PURPOSE:	Destructor
//
// ----------------------------------------------------------------------- //

CImpact::~CImpact()
{
	if (m_hSoundName)
	{
		CServerDE* pServerDE = BaseClass::GetServerDE();
		if (!pServerDE) return;
		
		pServerDE->FreeString(m_hSoundName);
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::EngineMessageFn
//
//	PURPOSE:	Handle engine messages
//
// ----------------------------------------------------------------------- //

DDWORD CImpact::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT lData)
{
	switch(messageID)
	{
		case MID_UPDATE:
		{
			if (!Update((DVector *)pData))
			{
				CServerDE* pServerDE = BaseClass::GetServerDE();
				if (!pServerDE) return 0;

				pServerDE->RemoveObject(m_hObject);
			}
			break;
		}

		case MID_PRECREATE:
		{
			ObjectCreateStruct* pStruct = (ObjectCreateStruct*)pData;
			if (pStruct)
			{
				pStruct->m_SkinName[0] = '\0';
				pStruct->m_NextUpdate = 0.1f;
				VEC_COPY(pStruct->m_Scale, m_vScale)

				if (pStruct->m_Filename[0] == '\0')
				{
					_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)"sprites\\pinpuncherimpact.spr");
				}
			}			
			break;
		}

		case MID_INITIALUPDATE:
		{
			InitialUpdate((DVector *)pData);
			break;
		}

		default : break;
	}


	return BaseClass::EngineMessageFn(messageID, pData, lData);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::Setup
//
//	PURPOSE:	Set up a impact with the information needed
//
// ----------------------------------------------------------------------- //

void CImpact::Setup(DVector vNormal, DVector vScaleMin, DVector vScaleMax, char* pSound,
					DFLOAT fSoundVol, DFLOAT fDuration, DBOOL bRotateable, DBOOL bFade)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !m_hObject) return;

	VEC_COPY(m_vScaleMin, vScaleMin);
	VEC_COPY(m_vScaleMax, vScaleMax);

	if (m_vScaleMin.x == m_vScaleMax.x && m_vScaleMin.y == m_vScaleMax.y)
		m_bUpdateScale = DFALSE;

	if (pSound)
		m_hSoundName = pServerDE->CreateString(pSound);

	m_fSoundVol		= fSoundVol;
	m_fDuration		= fDuration;
	m_bRotateable	= bRotateable;
	m_bFade			= bFade;

	pServerDE->GetObjectColor(m_hObject, &red, &green, &blue, &alpha);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::UpdateScale
//
//	PURPOSE:	Update sprite scaling
//
// ----------------------------------------------------------------------- //

void CImpact::UpdateScale()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !m_hObject) return;

	DFLOAT fDeltaTime = pServerDE->GetTime() - m_fStartTime;
	if (m_fDuration <= 0) return;

	DVector vRange;
	VEC_SUB(vRange, m_vScaleMax, m_vScaleMin);

	m_vScale.x = m_vScaleMin.x + (fDeltaTime * vRange.x / m_fDuration);
	m_vScale.y = m_vScaleMin.y + (fDeltaTime * vRange.y / m_fDuration);
	m_vScale.z = m_vScaleMin.z + (fDeltaTime * vRange.z / m_fDuration);

	if (m_vScale.x > m_vScaleMax.x) m_vScale.x = m_vScaleMax.x;
	if (m_vScale.y > m_vScaleMax.y) m_vScale.y = m_vScaleMax.y;
	if (m_vScale.z > m_vScaleMax.z) m_vScale.z = m_vScaleMax.z;

	pServerDE->ScaleObject(m_hObject, &m_vScale);

	if(m_bFade)
	{
		float	newAlpha = alpha - (fDeltaTime * alpha / m_fDuration);
		if(newAlpha < 0.0f)		newAlpha = 0.0f;
		pServerDE->SetObjectColor(m_hObject, red, green, blue, newAlpha);
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::InitialUpdate
//
//	PURPOSE:	Do initial updating
//
// ----------------------------------------------------------------------- //

DBOOL CImpact::InitialUpdate(DVector*)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !m_hObject) return DFALSE;

	pServerDE->SetNextUpdate(m_hObject, (DFLOAT)0.1);

	if (m_bRotateable)
		pServerDE->SetObjectFlags(m_hObject, FLAG_VISIBLE | FLAG_ROTATEABLESPRITE);
	else
		pServerDE->SetObjectFlags(m_hObject, FLAG_VISIBLE);

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::FirstUpdate
//
//	PURPOSE:	Do First updating
//
// ----------------------------------------------------------------------- //

void CImpact::FirstUpdate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	m_fStartTime = pServerDE->GetTime();

	if(m_hSoundName)
	{
		char* pSoundFile = pServerDE->GetStringData(m_hSoundName);

		DVector vPos;
		pServerDE->GetObjectPos(m_hObject, &vPos);
//		PlaySoundFromPos(&vPos, pSoundFile, m_fSoundVol, SOUNDTYPE_MISC, SOUNDPRIORITY_HIGH );
	}

	pServerDE->ScaleObject(m_hObject, &m_vScaleMin);

	if (m_bUpdateScale)
		VEC_COPY(m_vScale, m_vScaleMin);
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CImpact::Update
//
//	PURPOSE:	Update the impact
//
// ----------------------------------------------------------------------- //

DBOOL CImpact::Update(DVector* pMovement)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if(!pServerDE || !m_hObject) return DFALSE;

	pServerDE->SetNextUpdate(m_hObject, (DFLOAT)0.1);

	if(m_bFirstUpdate)
	{
		FirstUpdate();
		m_bFirstUpdate = DFALSE;
	}

	if(m_bUpdateScale) 
		UpdateScale();

	if(m_fDuration <= 0.0f)
		return DTRUE;
	else
		return (pServerDE->GetTime() < m_fStartTime + m_fDuration);
}





void impactric_PostPropRead(CImpactRicochet *pObj, ObjectCreateStruct *pStruct)
{
	pStruct->m_ObjectType = OT_SPRITE;
//	pStruct->m_SkinName[0] = '\0';
	pStruct->m_Flags = FLAG_VISIBLE;
	pStruct->m_NextUpdate = 0.1f;

	VEC_INIT(pObj->m_normal)
	
	pObj->m_bFirstUpdate = DTRUE;
	pObj->m_bPlaySound   = DTRUE;
	pObj->m_duration = (8.0f/15.0f);

//	_mbscpy((unsigned char*)pObj->m_strSound, (const unsigned char*)"Sounds\\ricocht2.wav");
}


DBOOL impactric_InitialUpdate(CImpactRicochet *pImpact, DVector *pMovement)
{
	HOBJECT hObj = ((BaseClass*)pImpact)->m_hObject;
	DVector scale;

	VEC_SET(scale, 0.250f, 0.250f, 0.250f)
	g_pServerDE->ScaleObject(hObj, &scale);

	pImpact->m_StartTime = g_pServerDE->GetTime();
	g_pServerDE->SetNextUpdate(hObj, .1f);
//	DVector vel;
//	VEC_SET(vel, 0.0f, 15.0f, 0.0f)
//	g_pServerDE->SetVelocity(hObj, &vel);

	if (pImpact->m_bPlaySound)
    {
//        PlaySoundInfo theSoundInfo;
//
//	    theSoundInfo.m_dwFlags = PLAYSOUND_LOCAL;
//        _mbscpy((unsigned char*)theSoundInfo.m_szSoundName, (const unsigned char*)pImpact->m_strSound);
//	    theSoundInfo.m_hObject = hObj;
//    	theSoundInfo.m_fRadius = 400;
//	    theSoundInfo.m_nVolume = 100;
//    
//        g_pServerDE->PlaySound(&theSoundInfo);
//		g_pServerDE->PlaySound3D(hObj, pImpact->m_strSound, 400, 0, 0, 0);

    }
    
	return DTRUE;
}


DBOOL impactric_Update(CImpactRicochet *pImpact, DVector *pMovement)
{
	HOBJECT hObj = ((BaseClass*)pImpact)->m_hObject;

	g_pServerDE->SetNextUpdate(((BaseClass*)pImpact)->m_hObject, .1f);
	return ((g_pServerDE->GetTime() - pImpact->m_StartTime) < pImpact->m_duration);
}


DDWORD impactric_EngineMessageFn(CImpactRicochet *pObj, DDWORD messageID, void *pData, float lData)
{
	DDWORD bResult = 1;
	switch (messageID)
	{
		case MID_PRECREATE:
			impactric_PostPropRead(pObj, (ObjectCreateStruct*)pData);
			break;

		case MID_INITIALUPDATE:
			bResult = impactric_InitialUpdate(pObj, (DVector*)pData);
			break;

		case MID_UPDATE:
			bResult = impactric_Update(pObj, (DVector*)pData);
			break;
	}

	if (bResult)
		return bc_EngineMessageFn((BaseClass*)pObj, messageID, pData, lData);
	else
		g_pServerDE->RemoveObject(((BaseClass*)pObj)->m_hObject);
	return bResult;
}

DDWORD impactric_ObjectMessageFn(CImpactRicochet *pObj, HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
	return bc_ObjectMessageFn((BaseClass*)pObj, hSender, messageID, hRead);
}



BEGIN_CLASS(CImpactRicochet)
END_CLASS_DEFAULT_FLAGS(CImpactRicochet, BaseClass, impactric_EngineMessageFn, impactric_ObjectMessageFn, CF_HIDDEN)

⌨️ 快捷键说明

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