📄 ch21p1_machinegun.cpp
字号:
#include "Ch21p1_MachineGun.h"
#include "D3DUtil.h"
CMachineGun::CMachineGun()
{
}
CMachineGun::~CMachineGun()
{
}
HRESULT CMachineGun::RestoreDeviceObjects(LPDIRECT3DDEVICE8 pDev, const char *strMeshFilename)
{
HRESULT hr = S_OK;
hr = CGun::RestoreDeviceObjects(pDev, strMeshFilename);
if(FAILED(hr)) return(hr);
m_pAnim = new CAnimSequence(pDev);
m_pAnim->AddFrame("Ch21p1_MachineGunFlare.dds", 0.025f);
m_sprMuzzleFlare.SetAnim(m_pAnim);
return(S_OK);
}
void CMachineGun::InvalidateDeviceObjects()
{
CGun::InvalidateDeviceObjects();
SAFE_DELETE(m_pAnim);
}
void CMachineGun::Render(CCamera &camera)
{
if (!m_pd3dDevice) return;
// create a light
{
D3DLIGHT8 light; ZeroMemory(&light, sizeof(D3DLIGHT8));
// Machine gun looks white
D3DUtil_InitLight(light, D3DLIGHT_DIRECTIONAL, -10.0f, 20.0f, -20.0f);
light.Ambient.a = 1.0f;
light.Ambient.g = 0.1f;
light.Ambient.b = 0.1f;
light.Ambient.r = 0.1f;
light.Diffuse.a = 1.0f;
light.Diffuse.g = 0.3f;
light.Diffuse.b = 0.3f;
light.Diffuse.r = 0.3f;
light.Direction = D3DXVECTOR3(1.0f, -1.0f, 1.0f);
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE);
m_pd3dDevice->SetLight(0, &light);
m_pd3dDevice->LightEnable(0, true);
}
// if firing, render machinegun flare
if (m_Timer.IsRunning()) {
D3DXMATRIX matEmitterWorld, matInvView, matTrans, matRot, matGunTrans;
float fDet;
D3DXMatrixInverse(&matInvView, &fDet, &camera.GetViewMatrix());
D3DXMatrixTranslation(&matTrans, 0.0f, 0.0f, 2.8f);
D3DXMatrixRotationYawPitchRoll(&matRot, (float)PI, 0.0f, 0.0f);
D3DXMatrixTranslation(&matGunTrans, m_vPos.x, m_vPos.y, m_vPos.z);
matEmitterWorld = matRot * matGunTrans * matTrans * matInvView;
m_sprMuzzleFlare.Pos() = D3DXVECTOR3(
matEmitterWorld._41,
matEmitterWorld._42,
matEmitterWorld._43);
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE);
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_sprMuzzleFlare.Render(camera.GetViewMatrix());
}
// render gun model
{
D3DXMATRIX matWorld;
AssembleWorldMatrix(camera, matWorld,
m_Timer.IsRunning() ?
D3DXVECTOR3(0.0f, 0.0f, RandomNumber(0.0f, -0.5f)) :
D3DXVECTOR3(0.0f, 0.0f, 0.0f));
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE);
m_pMesh->Render(m_pd3dDevice);
}
}
void CMachineGun::Update(float fElapsedTime)
{
if (m_Timer.GetTime() > 0.05f) {
m_Timer.Stop();
}
}
void CMachineGun::Fire(CCamera &camera)
{
m_Timer.Start();
m_sprMuzzleFlare.Timer().Begin();
m_sprMuzzleFlare.SetSize(RandomNumber(1.0f, 3.0f));
m_sprMuzzleFlare.SetRotationRoll(RandomNumber(0.0f, 2.0f*(float)PI));
}
bool CMachineGun::CanFire()
{
return(!m_Timer.IsRunning());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -