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

📄 engineobject.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// EngineObject.cpp: implementation of the CEngineObject class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "EngineObject.h"
#include "GraphicEngine.h"

#include "../MHFile.h"

CAniInfoManager CEngineObject::m_staAniMgr;
extern VECTOR3 gHeroPos;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CEngineObject::CEngineObject()
{
	m_GXOHandle = NULL;
	m_CurMotionNum = -1;  
	m_bMotionPause = FALSE;
	m_BaseMotionNum = 1;
	m_AniInfo = NULL;
	m_bApplyHeight = FALSE;
	m_pObjectLinkTo = NULL;
}

CEngineObject::~CEngineObject()
{
	Release();
}

void CEngineObject::PreLoadObject(char* filename)
{
	g_pExecutive->PreLoadGXObject(filename);
}


BOOL CEngineObject::Init(char* filename,CObjectBase* pObject,BYTE EngineObjectType)
{
	m_NotProcessedAnimateKey = 0;
	
	if(m_GXOHandle == NULL)
		m_CurMotionNum = 1;

	Release();
	
	//m_CurMotionNum = -1;
	//m_bAnimationRoop = TRUE;
	m_bMotionPause = FALSE;	
	m_bEndMotion = FALSE;

	m_pObject = pObject;
	if(m_pObject)
		m_pObject->m_EngineObjectType = EngineObjectType;
	
	DWORD dwFlag = 0;
	if( EngineObjectType == eEngineObjectType_Effect )
		dwFlag = GXOBJECT_CREATE_TYPE_EFFECT;

	if(EngineObjectType == eEngineObjectType_Character)
		DIRECTORYMGR->SetLoadMode(eLM_Character);
	else if(EngineObjectType == eEngineObjectType_Monster)
		DIRECTORYMGR->SetLoadMode(eLM_Monster);
	else if(EngineObjectType == eEngineObjectType_Npc)
		DIRECTORYMGR->SetLoadMode(eLM_Npc);
	else if(EngineObjectType == eEngineObjectType_Effect)
		DIRECTORYMGR->SetLoadMode(eLM_Effect);
	else if(EngineObjectType == eEngineObjectType_Weapon)
		DIRECTORYMGR->SetLoadMode(eLM_Character);
	
	//////////////////////////////////////////////////////////////////////////
	// 烙矫 汲沥
	PreLoadObject(filename);
	//////////////////////////////////////////////////////////////////////////
	
	m_GXOHandle = g_pExecutive->CreateGXObject(filename,MHPlayerPROC,this,dwFlag);
	if(m_GXOHandle == NULL)
	{
		FILE* fp = fopen("MissedObjectList.txt","a+");
		if(fp)
		{
			fprintf(fp,"%s\n",filename);
			fclose(fp);
		}
		DIRECTORYMGR->SetLoadMode(eLM_Root);
		return FALSE;
	}
	
	if(EngineObjectType == eEngineObjectType_Effect)
		EnableShadow(FALSE);
	
	//yh2do test
	//g_pExecutive->EnableUpdateShading(m_GXOHandle);
	
	m_AniInfo = m_staAniMgr.GetAniInfoObj(filename,m_GXOHandle);

	DIRECTORYMGR->SetLoadMode(eLM_Root);
	
	//FILE* fp = fopen("
	if(m_CurMotionNum == -1)
		ChangeMotion(1);
	SetEngineToCurmotion();
	
	return TRUE;
}

void CEngineObject::Release()
{
	if(m_pObjectLinkTo)
	{
		m_pObjectLinkTo->m_LinkedObject.Remove(this);
		m_pObjectLinkTo = NULL;
	}
	PTRLISTSEARCHSTART(m_LinkedObject,CEngineObject*,pLinkChild)
		pLinkChild->LinkTo(NULL);
	PTRLISTSEARCHEND

	EndIllusionEffect();
	m_bApplyHeight = FALSE;
	RemoveAllAttachedWeapon();
	RemoveAllAttachedDress();
	if(m_GXOHandle)
	{
		AddGarbageObject(m_GXOHandle);
		Hide();
		m_GXOHandle = NULL;
	}
	if(m_AniInfo)
	{
		m_AniInfo = NULL;
	}
}

void CEngineObject::Animate(int animatekey)
{
	if(animatekey == 0)
		return;
	if(m_bMotionPause)
		return;
	if(m_AniInfo->GetMaxAniNum() == 0)
		return;

	//////////////////////////////////////////////////////////////////////////
	// 霸烙捞 蠢府搁 茄锅 吧矾 茄锅究 俊聪皋捞记阑 贸府茄促.
	if(IsGameSlow() == TRUE)
	{
		VECTOR3 thispos;
		int SkipAnimateCount;
		g_pExecutive->GXOGetPosition(m_GXOHandle,&thispos);
		float gx = thispos.x - gHeroPos.x;
		float gz = thispos.z - gHeroPos.z;
		float dist = gx*gx + gz*gz;
		if(dist < 490000)	// 700*700
			SkipAnimateCount = 0;
		else if(dist < 4000000)		// 2000*2000
			SkipAnimateCount = 3;
		else
			SkipAnimateCount = 7;
		if(m_NotProcessedAnimateKey < SkipAnimateCount)
		{
			m_NotProcessedAnimateKey += animatekey;
			return;
		}
	}
	if(m_NotProcessedAnimateKey != 0)
	{
		animatekey += m_NotProcessedAnimateKey;
		m_NotProcessedAnimateKey = 0;
	}
	//////////////////////////////////////////////////////////////////////////
		
	DWORD	dwMotionIndex = g_pExecutive->GXOGetCurrentMotionIndex(m_GXOHandle);
	DWORD	dwFrame = g_pExecutive->GXOGetCurrentFrame(m_GXOHandle);
	MOTION_DESC pMotionDesc;
	if(dwMotionIndex == 0)
		dwMotionIndex = 1;
	g_pExecutive->GXOGetMotionDesc(m_GXOHandle,&pMotionDesc,dwMotionIndex,0);

	DWORD CurFrame = dwFrame+animatekey;
	if(CurFrame > pMotionDesc.dwLastFrame || CurFrame > m_pCurAniInfo->EndFrame)
	{
		if(m_bAnimationRoop)
		{
			g_pExecutive->GXOSetCurrentFrame(m_GXOHandle, m_pCurAniInfo->StartFrame);
			m_bEndMotion = TRUE;
		}
		else
		{
			m_bEndMotion = TRUE;
			ChangeMotion(m_BaseMotionNum);
		}
	}
	else
	{
		g_pExecutive->GXOSetCurrentFrame(m_GXOHandle, CurFrame);
		m_bEndMotion = FALSE;
	}
	
}

void CEngineObject::SetEngineToCurmotion()
{
	if(m_GXOHandle == NULL)		return;

	m_pCurAniInfo = m_AniInfo->GetAniInfo(m_CurMotionNum);
	g_pExecutive->GXOSetCurrentMotionIndex(m_GXOHandle,m_pCurAniInfo->EngineMotionIndex);
	g_pExecutive->GXOSetCurrentFrame(m_GXOHandle, m_pCurAniInfo->StartFrame);
}

//////////////////////////////////////////////////////////////////////////
void CEngineObject::SetEngObjPosition(VECTOR3* pPos)
{
	if(m_GXOHandle == NULL)		return;
	
	
//	ASSERTMSG(pPos->x > -1000,"捞 皋技瘤 档 辣龋茄抛 楷遏阑... Set");
//	ASSERTMSG(pPos->z > -1000,"捞 皋技瘤 档 辣龋茄抛 楷遏阑... Set");

	VECTOR3 position;
	if(g_bFixHeight)
	{
		position.x = pPos->x;
		position.z = pPos->z;
		
		if(m_bApplyHeight)
			position.y = g_fFixHeight;
		else
			position.y = pPos->y;

		g_pExecutive->GXOSetPosition(m_GXOHandle,&position,FALSE);
	}
	else
		g_pExecutive->GXOSetPosition(m_GXOHandle,pPos,FALSE);

	if(m_LinkedObject.GetCount() != 0)
	{
		GetEngObjPosition(&position);
		PTRLISTSEARCHSTART(m_LinkedObject,CEngineObject*,pLinkChild)
			pLinkChild->SetEngObjPosition(&position);
		PTRLISTSEARCHEND
	}
}

void CEngineObject::SetEngObjAngle(float angleRad)
{
	if(m_GXOHandle == NULL)		return;

	static VECTOR3 axis = { 0,1,0};
	g_pExecutive->GXOSetDirection(m_GXOHandle,&axis,angleRad);
}

void CEngineObject::SetEngObjAngleX(float angleRad)
{
	if(m_GXOHandle == NULL)		return;

	static VECTOR3 axis = { 1,0,0};
	g_pExecutive->GXOSetDirection(m_GXOHandle,&axis,angleRad);
}
void CEngineObject::SetEngObjAngleZ(float angleRad)
{
	if(m_GXOHandle == NULL)		return;

	static VECTOR3 axis = { 0,0,1};
	g_pExecutive->GXOSetDirection(m_GXOHandle,&axis,angleRad);
}

void CEngineObject::RotateEngObj( float x, float y, float z )
{
	if(m_GXOHandle == NULL)		return;

	if( x != 0.0f ) SetEngObjAngleX( x );
	if( y != 0.0f ) SetEngObjAngle( y );
	if( z != 0.0f ) SetEngObjAngleZ( z );
}

void CEngineObject::RotateEngObj( VECTOR3 vRot )
{
	if(m_GXOHandle == NULL)
	{
		return;
	}

	if( vRot.x != 0.0f ) SetEngObjAngleX( vRot.x );
	if( vRot.y != 0.0f ) SetEngObjAngle( vRot.y );
	if( vRot.z != 0.0f ) SetEngObjAngleZ( vRot.z );
}

void CEngineObject::GetEngObjPosition(VECTOR3* pPos)
{
	if(m_GXOHandle == NULL)
	{
		pPos->x = pPos->y = pPos->z = 0;
		return;
	}

	g_pExecutive->GXOGetPosition(m_GXOHandle,pPos);
}

float CEngineObject::GetEngObjAngle()
{
	if(m_GXOHandle == NULL)		return 0;

	static VECTOR3 axis = { 0,1,0};
	float angle;
	g_pExecutive->GXOGetDirection(m_GXOHandle,&axis,&angle);
	return angle;
}

void CEngineObject::Show()
{
	if(m_GXOHandle == NULL)		return;

	if(m_CurMotionNum == -1)
	{
		ChangeMotion(1);
	}
	
	g_pExecutive->GXOSetCurrentFrame(m_GXOHandle, m_pCurAniInfo->StartFrame);
	m_bEndMotion = FALSE;
	g_pExecutive->EnableSchedule(m_GXOHandle);
	g_pExecutive->EnableRender(m_GXOHandle);
}

void CEngineObject::Hide()
{
	if(m_GXOHandle == NULL)		return;

	EndIllusionEffect();
	g_pExecutive->DisableSchedule(m_GXOHandle);
	g_pExecutive->DisableRender(m_GXOHandle);
}

void CEngineObject::HideWithScheduling()
{
	if(m_GXOHandle == NULL)		return;

	g_pExecutive->EnableSchedule(m_GXOHandle);
	g_pExecutive->DisableRender(m_GXOHandle);
}

void CEngineObject::ChangeBaseMotion(int BaseMotionNum)
{
	m_BaseMotionNum = BaseMotionNum;
}

void CEngineObject::ChangeMotion(int MotionNum,BOOL bRoop)
{
	if(m_GXOHandle == NULL)		return;

	if(m_CurMotionNum != MotionNum)
	{
		m_CurMotionNum = MotionNum;

		m_pCurAniInfo = m_AniInfo->GetAniInfo(m_CurMotionNum);
		g_pExecutive->GXOSetCurrentMotionIndex(m_GXOHandle,m_pCurAniInfo->EngineMotionIndex);
		g_pExecutive->GXOSetCurrentFrame(m_GXOHandle, m_pCurAniInfo->StartFrame);
		m_bMotionPause = FALSE;
	}
	m_bAnimationRoop = bRoop;
}

void CEngineObject::ChangeCustumMotion(int MotionNum,int StartFrame,int EndFrame,BOOL bRoop)
{
	if(m_GXOHandle == NULL)		return;

	m_CurMotionNum = MotionNum;

	m_CustumAniInfo.EngineMotionIndex = MotionNum;
	m_CustumAniInfo.StartFrame = StartFrame;
	m_CustumAniInfo.EndFrame = EndFrame;

	m_pCurAniInfo = &m_CustumAniInfo;
	
	g_pExecutive->GXOSetCurrentMotionIndex(m_GXOHandle,m_pCurAniInfo->EngineMotionIndex);
	g_pExecutive->GXOSetCurrentFrame(m_GXOHandle, m_pCurAniInfo->StartFrame);
	m_bMotionPause = FALSE;

	m_bAnimationRoop = bRoop;

⌨️ 快捷键说明

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