📄 engineobject.cpp
字号:
// 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 + -