⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch21p1_machinegun.cpp

📁 游戏开发特殊技巧-special.effects.game.programming
💻 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 + -