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; 
}