www.pudn.com > notWow.rar > Char.cpp
#include "Char.h"
#include "ModelMgr.h"
#include "Random.h"
#include "SceneMgr.h"
extern ScenesManager g_SceneMgr;
extern ModelsManager g_MdlMgr;
extern Random g_Random;
int Char::s_TimeFixed = 1000;
int Char::s_ShuffleDgreeFixed = 4;
bool ObjectPtr::operator < (const ObjectPtr& Oth) const
{
// int A1 = (g_MdlMgr.GetModel(Ptr->m_ModelID)->GetType() & MODEL_ATEST );
// int A2 = (g_MdlMgr.GetModel(Oth.Ptr->m_ModelID)->GetType() & MODEL_ATEST );
int T1 = (g_MdlMgr.GetModel(Ptr->m_ModelID)->GetType() & MODEL_TRANS );
int T2 = (g_MdlMgr.GetModel(Oth.Ptr->m_ModelID)->GetType() & MODEL_TRANS );
if( (T1 + T2) & MODEL_TRANS )
return (T1 == 0);
else
return Ptr->m_fViewZ < Oth.Ptr->m_fViewZ;
}
void WorldObject::Render(D3DXMATRIX* pViewProj,bool bFar)
{
if(!m_bRender)
return;
IModel* pModel = g_MdlMgr.GetModel(m_ModelID);
pModel->Move(m_fPosX,m_fPosY,m_fPosZ,m_Dir);
pModel->Update(pViewProj);
pModel->Render(m_fViewZ,bFar);
m_bRender = false;
}
void Char::Render(D3DXMATRIX* pViewProj)
{
//if(!m_bRender)
// return;
M2Model *pModel = (M2Model*)g_MdlMgr.GetModel(m_ModelID);
pModel->Move(m_fPosX,m_fPosY,m_fPosZ,m_Dir);
pModel->SetTexture(m_TexturesID);
pModel->SetDetails(m_Geosets);
pModel->SetAnimation(m_Anim,m_Time);
pModel->Update(pViewProj);
pModel->Render(m_fViewZ);
m_bRender = false;
}
void Item::Render(D3DXMATRIX* pViewProj)
{
}
D3DXMATRIX Char::GetMatrix()
{
D3DXMATRIX m;
return m;
}
bool Char::CalDir(int x,int z,int &dir)
{
if(abs(x + 0.5 - m_fPosX) < 0.01 )
{
if(abs(m_fPosZ - z - 0.5) < 0.01)
return true;
else if(m_fPosZ > z + 0.5)
dir = 90;
else
dir = 270;
}
else
{
float fTan = (m_fPosZ - z - 0.5) / (x + 0.5 - m_fPosX);
if(x + 0.5 - m_fPosX > 0)
dir = Math::Arctan(fTan);
else
dir = Math::Arctan(fTan) -180;
}
return (abs(dir - m_Dir) > 10);
}
int Char::CalDistSqr(int x,int z)
{
int dx = (int)m_fPosX - x;
int dz = (int)m_fPosZ - z;
return (dx * dx + dz * dz);
}
void Char::Idle()
{
m_StateQueue.clear();
m_State = CS_IDLE;
m_bActChange = true;
m_bStateOver = true;
m_pAimChar = NULL;
}
void Char::Turn(int x,int z)
{
State st;
if(!CalDir(x,z,st.DestDir))
return;
st.pAimChar = NULL;
st.DestX = x;
st.DestZ = z;
st.CharState = CS_TURN;
m_StateQueue.push_back(st);
}
void Char::Turn(ICharBase *pChar)
{
State st;
st.DestX = (int)pChar->m_fPosX;
st.DestZ = (int)pChar->m_fPosZ;
st.pAimChar = pChar;
st.CharState = CS_TURN;
m_StateQueue.push_back(st);
}
void Char::Walk(int x,int z)
{
State st;
CalDir(x,z,st.DestDir);
st.pAimChar = NULL;
st.DestX = x;
st.DestZ = z;
st.CharState = CS_WALK;
m_StateQueue.push_back(st);
}
void Char::Walk(ICharBase *pChar)
{
State st;
st.pAimChar = pChar;
st.CharState = CS_WALK;
m_StateQueue.push_back(st);
}
void Char::Run(int x,int z)
{
State st;
st.pAimChar = NULL;
st.DestX = x;
st.DestZ = z;
st.CharState = CS_RUN;
m_StateQueue.push_back(st);
}
void Char::Run(ICharBase *pChar)
{
State st;
st.pAimChar = pChar;
st.CharState = CS_RUN;
m_StateQueue.push_back(st);
}
void Char::Attack(ICharBase *pChar)
{
State st;
st.pAimChar = pChar;
st.CharState = CS_ATTACK;
m_StateQueue.push_back(st);
}
void Char::Talk(ICharBase *pChar)
{
}
void Char::SetBattle(bool Battle)
{
}
void Char::OnIdle(float fTime)
{
vector Anim;
M2Model *p = (M2Model*)g_MdlMgr.GetModel(m_ModelID);
if(m_bActChange)
{
m_Act = ACT_STAND;
Anim = p->GetAnimation(ACT_STAND);
//m_Anim = Anim[g_Random.RandInt(0,Anim.size()-1)];
m_Anim = Anim[0];
m_bActChange = false;
m_Time = 0;
}
else
{
m_Time += s_TimeFixed * fTime;
if(p->NewLoop(m_Anim,m_Time))
{
m_Time = 0;
m_Act = ACT_STAND;
Anim = p->GetAnimation(m_Act);
//m_Anim = Anim[g_Random.RandInt(0,Anim.size()-1)];
m_Anim = Anim[0];
}
}
m_bStateOver = true;
}
void Char::OnTurn(float fTime)
{
vector Anim;
M2Model *p = (M2Model*)g_MdlMgr.GetModel(m_ModelID);
int Turn;
int Delta;
// Turn to somebody
if(m_pAimChar != NULL)
{
// same direction -- stand
if(!CalDir((int)m_pAimChar->m_fPosX,(int)m_pAimChar->m_fPosZ,m_DestDir))
{
if(m_bActChange)
{
m_Act = ACT_STAND;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
m_bActChange = false;
m_Time = 0;
}
else
{
m_Time += s_TimeFixed * fTime;
if(p->NewLoop(m_Anim,m_Time))
{
m_Act = ACT_STAND;
m_Time = 0;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
}
}
return;
}
}
m_Dir = m_DestDir;
// end state
if(m_pAimChar == NULL)
m_bStateOver = true;
}
void Char::OnWalk(float fTime)
{
vector Anim;
M2Model *p = (M2Model*)g_MdlMgr.GetModel(m_ModelID);
if(m_pAimChar != NULL)
{
m_DestX = (int)m_pAimChar->m_fPosX;
m_DestZ = (int)m_pAimChar->m_fPosZ;
m_DestX += ( m_pAimChar->m_fPosX > m_fPosX ? -1 : 1 );
m_DestZ += ( m_pAimChar->m_fPosZ > m_fPosZ ? -1 : 1 );
// near by the target -- stand
if(abs(m_DestX + 0.5 - m_fPosX) < 0.1 && abs(m_fPosZ - m_DestZ - 0.5) < 0.1)
{
CalDir((int)m_pAimChar->m_fPosX,(int)m_pAimChar->m_fPosZ,m_DestDir);
m_Dir = m_DestDir;
m_fPosX = (int)m_fPosX + 0.5;
m_fPosZ = (int)m_fPosZ + 0.5;
if(m_bActChange || m_Act != ACT_STAND)
{
m_Act = ACT_STAND;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
m_bActChange = false;
m_Time = 0;
}
else
{
m_Time += s_TimeFixed * fTime;
if(p->NewLoop(m_Anim,m_Time))
{
m_Act = ACT_STAND;
m_Time = 0;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
}
}
return;
}
else
{
m_bActChange = (m_Act == ACT_STAND);
}
CalDir(m_DestX,m_DestZ,m_DestDir);
m_Dir = m_DestDir;
}
else
{
m_Dir = m_DestDir;
}
m_fPosX += Math::Cos(m_Dir) * m_fWalkSpeed * fTime;
m_fPosZ -= Math::Sin(m_Dir) * m_fWalkSpeed * fTime;
if(m_bActChange)
{
m_Time = 0;
m_Act = ACT_WALK;
Anim = p->GetAnimation(ACT_WALK);
m_Anim = Anim[0];
m_bActChange = false;
}
else
{
m_Time += s_TimeFixed * fTime;
}
if(m_pAimChar == NULL && abs(m_DestX + 0.5 - m_fPosX) < 0.1 && abs(m_fPosZ - m_DestZ - 0.5) < 0.1)
{
m_fPosZ = m_DestZ + 0.5;
m_fPosX = m_DestX + 0.5;
m_bStateOver = true;
}
}
void Char::OnRun(float fTime)
{
vector Anim;
M2Model *p = (M2Model*)g_MdlMgr.GetModel(m_ModelID);
if(m_pAimChar != NULL)
{
m_DestX = (int)m_pAimChar->m_fPosX;
m_DestZ = (int)m_pAimChar->m_fPosZ;
m_DestX += ( m_pAimChar->m_fPosX > m_fPosX ? -1 : 1 );
m_DestZ += ( m_pAimChar->m_fPosZ > m_fPosZ ? -1 : 1 );
// near by the target -- stand
if(abs(m_DestX + 0.5 - m_fPosX) < 0.1 && abs(m_fPosZ - m_DestZ - 0.5) < 0.1)
{
CalDir((int)m_pAimChar->m_fPosX,(int)m_pAimChar->m_fPosZ,m_DestDir);
m_Dir = m_DestDir;
m_fPosX = (int)m_fPosX + 0.5;
m_fPosZ = (int)m_fPosZ + 0.5;
if(m_bActChange || m_Act != ACT_STAND)
{
m_Act = ACT_STAND;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
m_bActChange = false;
m_Time = 0;
}
else
{
m_Time += s_TimeFixed * fTime;
if(p->NewLoop(m_Anim,m_Time))
{
m_Act = ACT_STAND;
m_Time = 0;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
}
}
return;
}
else
{
m_bActChange = (m_Act == ACT_STAND);
}
CalDir(m_DestX,m_DestZ,m_DestDir);
m_Dir = m_DestDir;
}
else
{
m_Dir = m_DestDir;
}
m_fPosX += Math::Cos(m_Dir) * m_fRunSpeed * fTime;
m_fPosZ -= Math::Sin(m_Dir) * m_fRunSpeed * fTime;
if(m_bActChange)
{
m_Time = 0;
m_Act = ACT_RUN;
Anim = p->GetAnimation(m_Act);
m_Anim = Anim[0];
m_bActChange = false;
}
else
{
m_Time += s_TimeFixed * fTime;
}
if(m_pAimChar == NULL && abs(m_DestX + 0.5 - m_fPosX) < 0.1 && abs(m_fPosZ - m_DestZ - 0.5) < 0.1)
{
m_fPosZ = m_DestZ + 0.5;
m_fPosX = m_DestX + 0.5;
m_bStateOver = true;
}
}
void Char::OnAttack(float fTime)
{
vector Anim;
M2Model *p = (M2Model*)g_MdlMgr.GetModel(m_ModelID);
m_DestX = (int)m_pAimChar->m_fPosX;
m_DestZ = (int)m_pAimChar->m_fPosZ;
// near by the target -- attack
if(CalDistSqr((int)m_pAimChar->m_fPosX,(int)m_pAimChar->m_fPosZ) < 1.5 )
{
CalDir((int)m_pAimChar->m_fPosX,(int)m_pAimChar->m_fPosZ,m_DestDir);
m_Dir = m_DestDir;
if(m_bActChange || m_Act != ACT_STAND)
{
m_Act = ACT_STAND;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
m_bActChange = false;
m_Time = 0;
}
else
{
m_Time += s_TimeFixed * fTime;
if(p->NewLoop(m_Anim,m_Time))
{
m_Act = ACT_STAND;
m_Time = 0;
Anim = p->GetAnimation(ACT_STAND);
m_Anim = Anim[0];
}
}
return;
}
else
{
m_bActChange = (m_Act == ACT_STAND);
}
CalDir(m_DestX,m_DestZ,m_DestDir);
m_Dir = m_DestDir;
m_fPosX += Math::Cos(m_Dir) * m_fRunSpeed * fTime;
m_fPosZ -= Math::Sin(m_Dir) * m_fRunSpeed * fTime;
if(m_bActChange)
{
m_Time = 0;
m_Act = ACT_RUN;
Anim = p->GetAnimation(m_Act);
m_Anim = Anim[0];
m_bActChange = false;
}
else
{
m_Time += s_TimeFixed * fTime;
}
if(m_pAimChar == NULL && abs(m_DestX + 0.5 - m_fPosX) < 0.1 && abs(m_fPosZ - m_DestZ - 0.5) < 0.1)
{
m_fPosZ = m_DestZ + 0.5;
m_fPosX = m_DestX + 0.5;
m_bStateOver = true;
}
}
void Char::OnTalk(float fTime)
{
}
void Char::Update(float fTime)
{
if(m_bStateOver )
{
if(m_StateQueue.empty())
{
m_State = CS_IDLE;
m_bActChange = true;
}
else
{
State st;
st = m_StateQueue.front();
m_StateQueue.pop_front();
m_State = st.CharState;
m_DestDir = st.DestDir;
m_DestX = st.DestX;
m_DestZ = st.DestZ;
m_pAimChar = st.pAimChar;
m_bActChange = true;
m_bStateOver = false;
}
}
if(m_State == CS_IDLE)
{
OnIdle(fTime);
}
else if(m_State == CS_TURN)
{
OnTurn(fTime);
}
else if(m_State == CS_WALK)
{
OnWalk(fTime);
}
else if(m_State == CS_RUN)
{
OnRun(fTime);
}
else if(m_State == CS_ATTACK)
{
OnAttack(fTime);
}
}