www.pudn.com > 3D_Tank.rar > GameObject.cpp
#include "GameObject.h"
Tank::Tank()
{
m_vMoveDirection = D3DXVECTOR3(0, 0, 1);
m_pCamera = NULL;
m_fGunYaw = 0;
m_fGunPitch = 0;
m_bAttackMode = FALSE;
m_fFireColdTime = 0;
m_fChangeModeColdTime = 0;
}
Tank::~Tank()
{}
D3DXVECTOR3 & Tank::GetMoveDirection(D3DXVECTOR3 *direction)
{
*direction = m_vMoveDirection;
return m_vMoveDirection;
}
D3DXVECTOR3 & Tank::GetPosition(D3DXVECTOR3 *position)
{
*position = m_vPosition;
return m_vPosition;
}
float Tank::GetYaw()
{
return m_fYaw;
}
VOID Tank::SetPosition(float x, float y, float z)
{
m_vPosition = D3DXVECTOR3(x, y, z);
CameraUpdate();
}
VOID Tank::SetPitchRoll(float pitch, float roll)
{
m_fPitch = pitch;
m_fRoll = roll;
}
VOID Tank::SetCamera(CCamera *camera)
{
m_pCamera = camera;
}
VOID Tank::SetParticle(CParticleSystem *particle)
{
m_pParticle = particle;
}
VOID Tank::ChangeMode()
{
if (m_fChangeModeColdTime == 0)
{
m_bAttackMode = !m_bAttackMode;
m_fChangeModeColdTime = 0.5f;
}
}
VOID Tank::InitObject(const CComPtr &device)
{
HRESULT hr;
m_pDevice = device;
IDirect3DTexture9 *tex = 0;
hr =D3DXCreateTextureFromFile(m_pDevice.Get(), ".\\res\\Texture\\tank.jpg", &tex);
m_pTexture.Reset(tex);
ID3DXMesh *meshBody = 0;
ID3DXBuffer *mtrlBody = 0;
DWORD dwBodyMtrl = 0;
hr = D3DXLoadMeshFromX(".\\res\\Model\\tank_body.x", D3DXMESH_MANAGED, m_pDevice.Get(), 0,
&mtrlBody, 0, &dwBodyMtrl, &meshBody);
if (FAILED(hr))
{ HrError(hr);}
m_pBodyMesh.Reset(meshBody);
if (mtrlBody != 0 && dwBodyMtrl != 0)
{
D3DXMATERIAL *mtrl = (D3DXMATERIAL*)mtrlBody->GetBufferPointer();
for (DWORD dw = 0; dw < dwBodyMtrl; ++dw)
{
mtrl[dw].MatD3D.Ambient = mtrl[dw].MatD3D.Diffuse;
m_vecBodyMaterial.push_back(mtrl[dw].MatD3D);
}
}
mtrlBody->Release();
ID3DXMesh *meshConsole = 0;
ID3DXBuffer *mtrlConsole = 0;
DWORD dwConsoleMtrl = 0;
hr = D3DXLoadMeshFromX(".\\res\\Model\\tank_console.x", D3DXMESH_MANAGED, m_pDevice.Get(), 0,
&mtrlConsole,0, &dwConsoleMtrl, &meshConsole);
if (FAILED(hr))
{ HrError(hr);}
m_pConsoleMesh.Reset(meshConsole);
if (mtrlConsole != 0 && dwConsoleMtrl != 0)
{
D3DXMATERIAL * mtrl = (D3DXMATERIAL *)mtrlConsole->GetBufferPointer();
for (DWORD dw = 0; dw < dwConsoleMtrl; ++dw)
{
mtrl[dw].MatD3D.Ambient = mtrl[dw].MatD3D.Diffuse;
m_vecConsoleMaterial.push_back(mtrl[dw].MatD3D);
}
}
mtrlConsole->Release();
ID3DXMesh *meshGun = 0;
ID3DXBuffer *mtrlGun = 0;
DWORD dwGunMtrl = 0;
hr = D3DXLoadMeshFromX(".\\res\\Model\\tank_gun.x", D3DXMESH_MANAGED, m_pDevice.Get(), 0,
&mtrlGun, 0, &dwGunMtrl, &meshGun);
if (FAILED(hr))
{ HrError(hr);}
m_pGunMesh.Reset(meshGun);
if (mtrlGun != 0 && dwGunMtrl != 0)
{
D3DXMATERIAL * mtrl = (D3DXMATERIAL *)mtrlGun->GetBufferPointer();
for (DWORD dw = 0; dw < dwGunMtrl; ++dw)
{
mtrl[dw].MatD3D.Ambient = mtrl[dw].MatD3D.Diffuse;
m_vecGunMaterial.push_back(mtrl[dw].MatD3D);
}
}
mtrlGun->Release();
}
VOID Tank::PrepareBodyRenderState()
{
D3DXMATRIX matTranslation;
GenerateTranslationMatrix(&matTranslation, m_vPosition, m_fYaw - 90, m_fPitch, m_fRoll);
m_pDevice->SetTransform(D3DTS_WORLD, &matTranslation);
GenerateTranslationMatrix(&matTranslation, m_vPosition, m_fYaw, 0, 0);
D3DXVECTOR3 look, up, right;
GetThreeDirFromMatrix(&matTranslation, &right, &up, &look);
}
VOID Tank::Render()
{
PrepareBodyRenderState();
m_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
HRESULT hr = m_pDevice->SetTexture(0, m_pTexture.Get());
if (FAILED(hr))
{ HrError(hr);}
m_pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
for (UINT i = 0; i < m_vecBodyMaterial.size(); ++i)
{
m_pDevice->SetMaterial(&m_vecBodyMaterial[i]);
m_pBodyMesh->DrawSubset(i);
}
ResetRenderState();
PrepareConsoleRenderState();
for (UINT i = 0; i < m_vecConsoleMaterial.size(); ++i)
{
m_pDevice->SetMaterial(&m_vecConsoleMaterial[i]);
m_pConsoleMesh->DrawSubset(i);
}
ResetRenderState();
PrepareGunRenderState();
for (UINT i = 0; i < m_vecGunMaterial.size(); ++i)
{
m_pDevice->SetMaterial(&m_vecGunMaterial[i]);
m_pGunMesh->DrawSubset(i);
}
ResetRenderState();
}
VOID Tank::ResetRenderState()
{
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
m_pDevice->SetTransform(D3DTS_WORLD, &I);
}
VOID Tank::PrepareConsoleRenderState()
{
D3DXMATRIX matTranslation;
GenerateTranslationMatrix(&matTranslation, m_vPosition, m_fYaw + m_fGunYaw - 90, m_fPitch, m_fRoll);
m_pDevice->SetTransform(D3DTS_WORLD, &matTranslation);
}
VOID Tank::PrepareGunRenderState()
{
D3DXMATRIX matTranslation;
D3DXVECTOR3 pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
GenerateTranslationMatrix(&matTranslation, pos, m_fYaw + m_fGunYaw - 90, m_fPitch, m_fRoll);
D3DXVECTOR3 look, up, right;
GetThreeDirFromMatrix(&matTranslation, &right, &up, &look);
D3DXMATRIX matPitch;
D3DXMatrixRotationAxis(&matPitch, &look, D3DXToRadian(-m_fGunPitch));
D3DXVec3TransformNormal(&right, &right, &matPitch);
D3DXVec3TransformNormal(&up, &up, &matPitch);
GenerateMatrix(&matTranslation, right, up, look, m_vPosition);
m_pDevice->SetTransform(D3DTS_WORLD, &matTranslation);
}
VOID Tank::Walk(float length)
{
m_vPosition += m_vMoveDirection * length;
CameraUpdate();
}
VOID Tank::BodyYaw(float angle)
{
m_fYaw += angle;
D3DXMATRIX T;
D3DXVECTOR3 up(0, 1, 0);
D3DXMatrixRotationAxis(&T, &up, D3DXToRadian(angle));
D3DXVec3TransformNormal(&m_vMoveDirection, &m_vMoveDirection, &T);
}
VOID Tank::GunYaw(float angle)
{
m_fGunYaw += angle;
if (m_fGunYaw > 90)
{ m_fGunYaw = 90;}
if (m_fGunYaw < -90)
{ m_fGunYaw = -90;}
CameraUpdate();
}
VOID Tank::GunPitch(float angle)
{
m_fGunPitch += angle;
if (m_fGunPitch > 0)
{ m_fGunPitch = 0;}
if (m_fGunPitch < -30)
{ m_fGunPitch = -30;}
CameraUpdate();
}
VOID Tank::Fire()
{
if (m_fFireColdTime == 0)
{
D3DXMATRIX matTranslation;
D3DXVECTOR3 pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
GenerateTranslationMatrix(&matTranslation, pos, m_fYaw + m_fGunYaw, m_fPitch, m_fRoll);
D3DXVECTOR3 look, up, right;
GetThreeDirFromMatrix(&matTranslation, &right, &up, &look);
D3DXMATRIX matPitch;
D3DXMatrixRotationAxis(&matPitch, &right, D3DXToRadian(m_fGunPitch));
D3DXVec3TransformNormal(&look, &look, &matPitch);
D3DXVec3TransformNormal(&up, &up, &matPitch);
D3DXVECTOR3 vFireDir = m_vPosition + up * 2.5f + look * 10;
m_pParticle->SetOrigin(vFireDir);
m_pParticle->SetVelocity(look * 200);
m_pParticle->AddPartile();
m_fFireColdTime = 0.5f;
m_pSound->Play(".\\res\\Sound\\fire.wav");
}
}
VOID Tank::TimeElapse(float time)
{
if (m_fFireColdTime > 0)
{
m_fFireColdTime -= time;
if (m_fFireColdTime < 0)
{ m_fFireColdTime = 0;}
}
if (m_fChangeModeColdTime > 0)
{
m_fChangeModeColdTime -= time;
if (m_fChangeModeColdTime < 0)
{ m_fChangeModeColdTime = 0;}
}
}
VOID Tank::CameraUpdate()
{
if (m_pCamera != NULL && m_bAttackMode == TRUE)
{
D3DXMATRIX matTranslation;
D3DXVECTOR3 pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
GenerateTranslationMatrix(&matTranslation, pos, m_fYaw + m_fGunYaw, m_fPitch, m_fRoll);
D3DXVECTOR3 look, up, right;
GetThreeDirFromMatrix(&matTranslation, &right, &up, &look);
D3DXMATRIX matPitch;
D3DXMatrixRotationAxis(&matPitch, &right, D3DXToRadian(m_fGunPitch));
D3DXVec3TransformNormal(&look, &look, &matPitch);
D3DXVec3TransformNormal(&up, &up, &matPitch);
m_pCamera->SetDirection(look, up, right);
m_pCamera->SetPosition(m_vPosition + look * 5.0f + up * 4.0f);
}
if (m_pCamera != NULL && m_bAttackMode == FALSE)
{
D3DXMATRIX matTranslation;
GenerateTranslationMatrix(&matTranslation, m_vPosition, m_fYaw, 0, 0);
D3DXVECTOR3 look, up, right;
GetThreeDirFromMatrix(&matTranslation, &right, &up, &look);
up = D3DXVECTOR3(0, 1, 0);
D3DXVECTOR3 pos = m_vPosition - m_vMoveDirection * 10.0f + up * 5.0f;
m_pCamera->SetPosition(pos);
m_pCamera->SetDirection(look, up, right);
}
}
VOID Tank::SetSoundPlayer(CSoundSet *sound)
{
m_pSound = sound;
}