📄 3drole.cpp
字号:
}
}
//------------------------------------------------------
BOOL C3DRole::SetVariable(int nVariableType, DWORD dwData)
{
switch(nVariableType)
{
case _VAR_LOOK:
this->SetLook((int)dwData);
return true;
case _VAR_HAIR:
this->SetHair((int)dwData);
return true;
case _VAR_TRANSFORM:
this->Transform((int)dwData);
return true;
case _VAR_ARMOR:
this->SetArmor(dwData);
return true;
case _VAR_ARMET:
this->SetArmet(dwData);
return true;
case _VAR_MANTLE:
this->SetMantle(dwData);
return true;
case _VAR_RWEAPON:
return this->SetRWeapon(dwData);
case _VAR_LWEAPON:
return this->SetLWeapon(dwData);
case _VAR_MOUNT:
this->SetMount(dwData);
return true;
case _VAR_FRAME:
this->SetFrame(dwData);
return true;
case _VAR_ROTATEX:
this->SetRotateX(dwData);
return true;
case _VAR_HEAD:
this->SetHead(dwData);
return true;
case _VAR_STATUS:
this->SetPlayerStatus(dwData);
return true;
}
return false;
}
//------------------------------------------------------
DWORD C3DRole::GetVariable(int nVariableType)
{
switch(nVariableType)
{
case _VAR_RWEAPON_ID:
if(!m_pRWeapon)
return ID_NONE;
return m_pRWeapon->GetTypeID();
case _VAR_WEAPON_ACTION_DATA:
return this->GetWeaponActionData();
case _VAR_LOOKCLONE:
return m_nLookClone;
case _VAR_ACTION_DATA:
return this->GetActionData();
}
return 0;
}
//------------------------------------------------------
DWORD C3DRole::GetActionData (void)
{
return (this->GetMountActionData() *1000000000 +
m_nLook *1000000 +
this->GetWeaponActionData()*1000 +
m_nActionType);
}
//------------------------------------------------------
int C3DRole::SetAction(int nActionType, BOOL bResetMotion, BOOL bPlaySound, int nWorldX, int nWorldY, BOOL bSetEffect, DWORD dwTerrain)
{
if(!m_pArmor)
return 10;
m_nActionType = nActionType;
// body motion
if (bResetMotion || !m_pMotionArmor)
{
OBJID idBodyMotion = this->GetMountActionData() *1000000000 +
m_nLook *1000000 +
this->GetWeaponActionData()*1000 +
nActionType;
m_pMotionArmor = g_objGameDataSet.Get3DMotion(idBodyMotion);
if (!m_pMotionArmor)
{
::LogMsg("Error: motion(%u) can't found.", idBodyMotion);
// load default motion if error
OBJID idDefaultMotion = m_nLook *1000000 + nActionType;
m_pMotionArmor = g_objGameDataSet.Get3DMotion(idDefaultMotion);
if (!m_pMotionArmor)
{
idDefaultMotion = m_nLook*1000000 + 100; //standby
m_pMotionArmor = g_objGameDataSet.Get3DMotion(idDefaultMotion);
if (!m_pMotionArmor)
{
const OBJID idActionError = 500000;
::ErrorOut(g_objGameDataSet.GetStr(idActionError), idBodyMotion, idDefaultMotion);
return 0;
}
}
else
return m_pMotionArmor->GetFrameAmount();
}
}
if (m_pArmor)
{
if (bSetEffect)
m_pArmor->Set3DEffect(m_nLook, nActionType, m_pArmor->GetTypeID()%1000, m_pEffect, "v_body");
m_pArmor->SetMotion(m_pMotionArmor);
if(m_pHead)
m_pHead->SetMotion(m_pMotionArmor);
}
// Mount motion
if (m_pMount)
{
if (bSetEffect)
m_pMount->Set3DEffect(m_nLook, nActionType, m_pMount->GetTypeID()%1000, m_pEffect, "v_pet");
if (bResetMotion || !m_pMotionMount)
m_pMotionMount = g_objGameDataSet.Get3DMountMotion(m_pMount->GetTypeID()%1000/100*1000 + nActionType);
if(bResetMotion || m_pMotionMount)
m_pMount->SetMotion(m_pMotionMount);
/*
char szMountMotionIndex[64];
sprintf(szMountMotionIndex, "%s.%s", m_pMount->GetMountActionName(), g_obj3DRoleData.GetActionName(nActionType));
pMotion = g_obj3DRoleData.GetGameMotion(szMountMotionIndex);
MYASSERT(pMotion);
m_pMount->SetMotion(pMotion);
*/
}
// Armet motion
if (m_pArmet)
{
if (bSetEffect)
m_pArmet->Set3DEffect(m_nLook, nActionType, m_pArmet->GetTypeID()%1000, m_pEffect, "v_head");
m_pArmet->SetMotion(m_pMotionArmor);
}
// clone armor
if(m_pArmorClone)
return this->SetCloneAction(nActionType, bPlaySound, nWorldX, nWorldY, bSetEffect);
if(m_pRWeapon)
{
if (bSetEffect)
{
if (this->TestPlayerStatus(PLAYERTATUS_ATTACK))
{
m_pRWeapon->Clear3DEffect((char*)g_obj3DRoleData.GetRolePart3DEffect(m_nLook, nActionType, (m_pRWeapon->GetTypeID()%1000000)/1000, m_pRWeapon->GetTypeID()%1000));
OBJID idType = m_pRWeapon->GetTypeID();
int nSort = (idType%10000000)/100000;
if (nSort == 4) //ITEMSORT_WEAPON_SINGLE_HAND;
{
int nType = idType/10000;
switch(nType)
{
case 41:
case 42:
m_pRWeapon->AddEffect("Xattack04+v_r_weapon", true);
break;
case 44:
m_pRWeapon->AddEffect("Xattack01+v_r_weapon", true);
break;
case 49:
m_pRWeapon->AddEffect("Xattack03+v_r_weapon", true);
break;
default:
break;
}
}
}
else
{
m_pRWeapon->Clear3DEffect("Xattack04+v_r_weapon");
m_pRWeapon->Clear3DEffect("Xattack01+v_r_weapon");
m_pRWeapon->Clear3DEffect("Xattack03+v_r_weapon");
m_pRWeapon->Set3DEffect(m_nLook, nActionType, m_pRWeapon->GetTypeID()%1000, m_pEffect, "v_r_weapon");
}
}
}
// player sound
if (bPlaySound)
{
const char* pszSound = g_obj3DRoleData.GetActionSound(dwTerrain, m_nLook, this->GetWeaponActionData(), nActionType);
if (pszSound)
{
try {
// player sound here
const int nRange = 3000;
::DXPlaySound ((char*)pszSound, nWorldX, nWorldY, nRange);
}catch(...)
{
::LogMsg("dxplayersound play action sound:%s", pszSound);
}
}
}
return m_pMotionArmor->GetFrameAmount();
}
//------------------------------------------------------
void C3DRole::SetPos ( int nX, int nY, int nHeight, int nRotate, float fScale )
{
m_nPosX = nX;
m_nPosY = nY;
m_nRotateZ = nRotate;
m_fScale = fScale;
m_nPosH = nHeight*2;
}
//------------------------------------------------------
void C3DRole::SetLightOffset( int type, float x, float y, float z, float a, float r, float g, float b )
{
m_nShadowType = type;
m_LightOffset.x = x;
m_LightOffset.y = -y;
m_LightOffset.z = -z;
m_a = a;
m_r = r;
m_g = g;
m_b = b;
}
//------------------------------------------------------
void C3DRole::SetRGBA ( float alpha, float red, float green, float blue )
{
if(m_pArmor)
m_pArmor->SetARGB(alpha, red, green, blue);
if(m_pLWeapon)
m_pLWeapon->SetARGB(alpha, red, green, blue);
if(m_pRWeapon)
m_pRWeapon->SetARGB(alpha, red, green, blue);
if(m_pMount)
m_pMount->SetARGB(alpha, red, green, blue);
if(m_pArmet)
m_pArmet->SetARGB(alpha, red, green, blue);
if(m_pArmorClone)
m_pArmorClone->SetARGB(alpha, red, green, blue);
if(m_pMantle)
m_pMantle->SetARGB(alpha, red, green, blue);
}
//------------------------------------------------------
void C3DRole::SetPlayerStatus(__int64 dwStatus)
{
m_dwPlayerStatus = dwStatus;
}
//------------------------------------------------------
BOOL C3DRole::TestPlayerStatus(__int64 dwStatus)
{
return ((m_dwPlayerStatus&dwStatus) == dwStatus);
}
//------------------------------------------------------
BOOL C3DRole::HitTest ( int nHitScreenX, int nHitScreenY, int nMapX, int nMapY )
{
float br = D3DXToRadian ( ( float )( m_nRotateZ % 45 ) );
D3DXMATRIXA16 matrix;
D3DXMatrixIdentity ( &matrix );
Common_Rotate ( &matrix, 0, 0, br );
//Common_Rotate ( &matrix, D3DXToRadian ( -45 ), 0, 0 );
Common_Scale ( &matrix, m_fScale - m_fScale * 0.2f, m_fScale - m_fScale * 0.2f, m_fScale - m_fScale * 0.3f );
Common_Translate ( &matrix, m_nPosX, 0, m_nPosY );
D3DXVECTOR3 min, max;
m_pArmor->TransformCoord(&min, &max, &matrix);
float temp;
if ( min.x > max.x )
{
temp = min.x;
min.x = max.x;
max.x = temp;
}
if ( min.y > max.y )
{
temp = min.y;
min.y = max.y;
max.y = temp;
}
if ( min.z > max.z )
{
temp = min.z;
min.z = max.z;
max.z = temp;
}
D3DXVECTOR3 from, to, dir;
from.x = nMapX + _SCR_WIDTH/2; from.y = -1000; from.z = nMapY + _SCR_HEIGHT/2;
to.x = nHitScreenX + nMapX; to.y = 0; to.z = nHitScreenY + nMapY;
dir = to - from;
D3DXVec3Normalize ( &dir, &dir );
return D3DXBoxBoundProbe ( &min, &max, &from, &dir );
/*
float temp;
if ( m_min.x > m_max.x )
{
temp = m_min.x;
m_min.x = m_max.x;
m_max.x = temp;
}
if ( m_min.y > m_max.y )
{
temp = m_min.y;
m_min.y = m_max.y;
m_max.y = temp;
}
if ( m_min.z > m_max.z )
{
temp = m_min.z;
m_min.z = m_max.z;
m_max.z = temp;
}
RECT rect;
rect.left = int(m_min.x-nMapX);
rect.right = int(m_max.x-nMapX);
rect.top = int(m_min.z-nMapY);
rect.bottom = int(m_max.z-nMapY);
if(rect.bottom - rect.top < 70)
{
rect.bottom += 35;
rect.top -= 35;
}
if(rect.right - rect.left < 70)
{
rect.right += 35;
rect.left -= 35;
}
// CMyBitmap::ShowRect(rect.left, rect.top, rect.right, rect.bottom, 0xffffffff);
if(nHitScreenX >= rect.left && nHitScreenY >= rect.top &&
nHitScreenX <= rect.right && nHitScreenY <= rect.bottom)
return true;
return false;
// return D3DXBoxBoundProbe ( &m_min, &m_max, &from, &dir );
*/
}
//------------------------------------------------------
BOOL C3DRole::Draw ( int nMapX, int nMapY )
{
#ifdef _ANALYSIS_ON
DWORD dwAnalysisTime = ::TimeGet();
#endif
if (CMyBitmap::s_nShowMode != modeMesh)
C3DObj::Prepare();
D3DXMATRIXA16 matrix;
D3DXMatrixIdentity ( &matrix );
Common_Translate ( &matrix, 0, 0, m_nPosH );
Common_Rotate ( &matrix, 0, 0, D3DXToRadian ( ( float )m_nRotateZ ) );
Common_Rotate ( &matrix, D3DXToRadian ( m_nRotateX ), 0, 0 );
Common_Scale ( &matrix, m_fScale, m_fScale, m_fScale );
Common_Translate ( &matrix, m_nPosX, 0, m_nPosY );
// 如果有复制体,只画复制体
if(m_pArmorClone)
{
m_pArmorClone->SetTexture();
m_pArmorClone->MuliplyPhy(&matrix);
m_pArmorClone->TransformCoord(&m_min, &m_max, &matrix);
m_pArmorClone->Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
m_pArmorClone->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
else
{
if (m_pHead)
{
// 头盔跟随 共享骨骼
m_pHead->SetTexture();
m_pHead->MuliplyPhy(&matrix);
m_pHead->Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
m_pHead->DrawAlpha(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH);
m_pHead->ClearMatrix();
}
if (m_pArmet)
{
// 头盔跟随
m_pArmet->SetTexture();
m_pArmet->MuliplyPhy(&matrix);
//m_pArmet->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_armet"));
m_pArmet->Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
m_pArmet->DrawAlpha(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH);
m_pArmet->ClearMatrix();
}
// 先画身体
if (m_pArmor)
{
m_pArmor->SetTexture();
m_pArmor->MuliplyPhy(&matrix);
m_pArmor->TransformCoord(&m_min, &m_max, &matrix);
m_pArmor->Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
m_pArmor->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH);
CMyPos posBg;
posBg.x = m_nPosX;
posBg.y = m_nPosY;
/* if (m_pArmet)
{
// 头盔跟随
m_pArmet->SetTexture();
m_pArmet->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_armet"));
m_pArmet->Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
m_pArmet->DrawAlpha(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH);
//m_pArmet->ClearMatrix();
}*/
if (m_pRWeapon)
{
// 武器跟随 v_r_weapon
m_pRWeapon->SetTexture();
if ((m_pRWeapon->GetTypeID()/1000)%1000 == 500)
m_pRWeapon->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_l_weapon"));
else
m_pRWeapon->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_r_weapon"));
m_pRWeapon->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
m_pRWeapon->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
if (m_pMount)
{
m_pMount->SetTexture();
if ((m_pMount->GetTypeID()/1000)%1000 == 500)
m_pMount->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_pet"));
else
m_pMount->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_pet"));
m_pMount->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
m_pMount->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
if(m_pEffect)
m_pEffect->Show(this, posBg);
m_pArmor->ClearMatrix();
}
/* if (m_pArmet)
{
// 头盔跟随 共享骨骼
m_pArmet->SetTexture();
m_pArmet->MuliplyPhy(&matrix);
m_pArmet->Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
m_pArmet->DrawAlpha(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH);
m_pArmet->ClearMatrix();
}*/
}
/*
// 画武器
if (m_pLWeapon )
{
// 武器跟随 v_l_weapon
m_pLWeapon->SetTexture();
if(m_pLWeapon->GetTypeID()/10000 == 105)
{
m_pLWeapon->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_r_weapon"));// v_l_shield v_l_weapon
if(m_nActionType == _ACTION_ATTACK0 ||
m_nActionType == _ACTION_ATTACK1 ||
m_nActionType == _ACTION_ATTACK2 ||
m_nActionType == _ACTION_FLY_ATTACK ||
m_nActionType == _ACTION_FLY_ATTACK ||
m_nActionType == _ACTION_FAST_SHOOT)
{
m_pLWeapon->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
m_pLWeapon->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
}
else
{
m_pLWeapon->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_l_weapon"));// v_l_shield v_l_weapon
m_pLWeapon->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
m_pLWeapon->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
}
if (m_pRWeapon)
{
// 武器跟随 v_r_weapon
m_pRWeapon->SetTexture();
if ((m_pRWeapon->GetTypeID()/1000)%1000 == 500)
m_pRWeapon->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_l_weapon"));
else
m_pRWeapon->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_r_weapon"));
m_pRWeapon->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
m_pRWeapon->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
if(m_pMantle)
{
// 披风跟随Back
m_pMantle->SetTexture();
m_pMantle->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_back"));
m_pMantle->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
}
if (m_pMount)
{
// 坐骑跟随 v_pet
m_pMount->SetTexture();
m_pMount->SetVirtualMotion(m_pArmor->GetVirtualMotion("v_pet"));
m_pMount->Draw ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b );
}
}
// 如果有复制体,只画复制体alpha
if(m_pArmorClone)
{
//m_pArmorClone->SetTexture();
m_pArmorClone->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
else
{
if (m_pMantle)
{
//m_pArmet->SetTexture();
m_pMantle->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
if (m_pMount)
{
//m_pMount->SetTexture();
m_pMount->DrawAlpha ( m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH );
}
}*/
#ifdef _ANALYSIS_ON
DWORD dwTimePass = ::TimeGet() - dwAnalysisTime;
g_dw3DRoleDrawTime += dwTimePass;
g_dw3DRoleDrawAmount ++;
g_dw3DRoleDrawTimeFrame += dwTimePass;
g_dw3DRoleDrawAmountFrame ++;
if(dwTimePass > g_dw3DRoleDrawTimeMax)
g_dw3DRoleDrawTimeMax = dwTimePass;
#endif
return true;
}
//------------------------------------------------------
IRoleView* C3DRole::CreateNewView()
{
C3DRole* p3DRole = new C3DRole;
MYASSERT(p3DRole);
return p3DRole;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -