📄 ch20p3_complexexplosion.cpp
字号:
m_Shockwave.Render();
m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
m_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
m_ParticleEmitter.Render();
m_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
}
char buf[256];
_snprintf(buf, 256, "Position: (%.2f, %.2f, %.2f)",
(float)m_Camera.GetPosition().x, (float)m_Camera.GetPosition().y,
(float)m_Camera.GetPosition().z);
m_pFontSmall->DrawText( 2, 0, D3DCOLOR_ARGB(255,255,255,0), buf );
m_pFontSmall->DrawText( 2, 20, D3DCOLOR_ARGB(255,255,0,0),
m_timObjectRebirth.IsRunning() ? "Kablammo!" : "Press B to blow up this poor object." );
// End the scene.
m_pd3dDevice->EndScene();
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
m_pFont->InitDeviceObjects( m_pd3dDevice );
m_pFontSmall->InitDeviceObjects( m_pd3dDevice );
m_SkyBox.SetSize(100.0f);
if( FAILED( m_pObject->Create(m_pd3dDevice, _T("Ch20p3_Object.x") ) ) )
return E_FAIL;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
m_InputManager.CreateDevices(m_hWnd, false, true);
// create explosion animation
m_pExploAnim = new CAnimSequence(m_pd3dDevice);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame01.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame02.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame03.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame04.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame05.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame06.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame07.dds", 0.03f);
m_pExploAnim->AddFrame("Ch20p3_Explosion_Frame08.dds", 0.03f);
for (int q=0; q < NUMSPRITES; q++) {
m_sprExplo[q].SetAnim(m_pExploAnim);
m_sprExplo[q].SetSize(15.0f);
}
m_SkyBox.RestoreDeviceObjects(m_pd3dDevice,
"Ch20p3_SkyBox_Top.bmp",
"Ch20p3_SkyBox_Bottom.bmp",
"Ch20p3_SkyBox_Front.bmp",
"Ch20p3_SkyBox_Back.bmp",
"Ch20p3_SkyBox_Left.bmp",
"Ch20p3_SkyBox_Right.bmp"
);
// initialize particle system
std::string strScript;
LoadFileIntoString("Ch20p3_ParticleScript.txt", strScript);
m_ParticleEmitter.RestoreDeviceObjects(m_pd3dDevice);
m_ParticleEmitter.Compile(strScript.c_str());
// vary shockwave thickness, speed, and lifetime to taste
m_Shockwave.RestoreDeviceObjects(m_pd3dDevice, "Ch20p3_Shockwave.png", 10.0f, 4.0f, 16, 6.0f, 1.0f);
m_Shockwave.Pos() = D3DXVECTOR3(0.0f, 4.0f, 0.0f);
m_pObject->RestoreDeviceObjects( m_pd3dDevice );
m_pFont->RestoreDeviceObjects();
m_pFontSmall->RestoreDeviceObjects();
m_Camera.SetPosition(D3DXVECTOR3(0.0f, 7.0f, -20.0f));
// Set the world matrix
D3DXMATRIX matWorld;
D3DXMatrixIdentity( &matWorld );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
// Set projection matrix
D3DXMATRIX matProj;
FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect, 0.1f, 100.0f );
m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
m_pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
// create a light for our Object
D3DLIGHT8 light;
light.Ambient.a = light.Ambient.g = light.Ambient.b = light.Ambient.r = 1.0;
light.Diffuse.a = light.Diffuse.g = light.Diffuse.b = light.Diffuse.r = 1.0;
light.Position = D3DXVECTOR3(0.0,5.0,2.0);
light.Type = D3DLIGHT_SPOT;
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE);
m_pd3dDevice->SetLight(0, &light);
m_pd3dDevice->LightEnable(0, true);
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
delete m_pExploAnim;
m_ParticleEmitter.InvalidateDeviceObjects();
m_Shockwave.InvalidateDeviceObjects();
m_InputManager.DestroyDevices();
m_pObject->InvalidateDeviceObjects();
m_pFont->InvalidateDeviceObjects();
m_pFontSmall->InvalidateDeviceObjects();
m_SkyBox.InvalidateDeviceObjects();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects()
// Desc: Called when the app is exiting, or the device is being changed,
// this function deletes any device dependent objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
m_pFont->DeleteDeviceObjects();
m_pFontSmall->DeleteDeviceObjects();
m_pObject->Destroy();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: FinalCleanup()
// Desc: Called before the app exits, this function gives the app the chance
// to cleanup after itself.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{
SAFE_DELETE( m_pFont );
SAFE_DELETE( m_pFontSmall );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: Called during device intialization, this code checks the device
// for some minimum set of capabilities
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior,
D3DFORMAT Format )
{
return S_OK;
}
void CMyD3DApplication::CreateExplosion(CSprite &spr,
float PosX, float PosY, float PosZ,
float RadiusX, float RadiusY, float RadiusZ,
float Size, float SizeDelta,
float Time, float TimeDelta)
{
spr.Pos() = D3DXVECTOR3(PosX, PosY, PosZ) +
RandomNumber(
D3DXVECTOR3(-RadiusX, -RadiusY, -RadiusZ),
D3DXVECTOR3(RadiusX, RadiusY, RadiusZ));
spr.SetSize(Size + RandomNumber(-SizeDelta, SizeDelta));
spr.Timer().BeginWithDelay(Time+RandomNumber(-TimeDelta, TimeDelta));
}
//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: Message proc function to handle key and menu input
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
if (uMsg == WM_KEYUP && (wParam == 'b' || wParam == 'B') &&
!m_timObjectRebirth.IsRunning()) {
// one big explosion in the middle
CreateExplosion(m_sprExplo[0],
0.0f, 4.0f, 0.0f, // position
0.0f, 0.0f, 0.0f, // radius
15.0f, 5.0f, // size
0.0f, 0.0f); // time
// several smaller explosions around it
for (int q=1; q < NUMSPRITES; q++) {
CreateExplosion(m_sprExplo[q],
0.0f, 4.0f, 0.0f, // position
1.0f, 1.0f, 1.0f, // radius
10.0f, 5.0f, // size
0.0f, 0.25f); // time
}
m_timObjectRebirth.Begin();
// start particle system
m_ParticleEmitter.SetPos(D3DXVECTOR3(0.0f, 4.0f, 0.0f));
m_ParticleEmitter.Stop();
m_ParticleEmitter.Start();
m_Shockwave.Stop();
m_Shockwave.Begin();
}
// Pass remaining messages to default handler
return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -