📄 main.cpp
字号:
#include <D3DX8.h>
#include "D3DApp.h"
#include "D3DFont.h"
#include "D3DFile.h"
#include "D3DUtil.h"
#include "DXUtil.h"
#include "colmesh.h"
#define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
class CMyD3DApplication : public CD3DApplication
{
CCollidableMesh m_Mesh1;
CCollidableMesh m_Mesh2;
bool m_Collision;
CD3DFont* m_Font;
DWORD m_Last;
int m_NoCheck;
public:
CMyD3DApplication()
: m_Font(new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD )),
m_Last(0),
m_NoCheck(0)
{
m_strWindowTitle = _T("Simple Collision Test");
m_bUseDepthBuffer = TRUE;
}
virtual ~CMyD3DApplication()
{
delete m_Font;
}
protected:
virtual HRESULT OneTimeSceneInit()
{
return S_OK;
}
virtual HRESULT FrameMove()
{
D3DXVECTOR3 vFromPt = D3DXVECTOR3( 0.0f, 0.0f, -10.0f );
D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &vFromPt, &vLookatPt, &vUpVec );
m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
DWORD cur=GetTickCount();
float dt=(cur-m_Last)*0.001f;
if (m_Last==0) dt=0.02f;
m_Last=cur;
m_Mesh1.Advance(dt);
m_Mesh2.Advance(dt);
if (m_NoCheck>0) m_NoCheck--;
else
{
m_Collision=m_Mesh1.Collision(m_Mesh2);
if (m_Collision) { m_Mesh1.React(m_Mesh2); m_NoCheck=10; }
}
return S_OK;
}
virtual HRESULT InitDeviceObjects()
{
m_Font->InitDeviceObjects( m_pd3dDevice );
m_Mesh1.Create(m_pd3dDevice,_T("teapot.x"));
m_Mesh1.SetFVF( m_pd3dDevice, D3DFVF_VERTEX );
m_Mesh1.SetPosition(Vector3D(6.0f,0.0f,0.0f));
//m_Mesh1.SetSpeed(Vector3D(-1.0f,0.0f,0.0f));
m_Mesh1.SetMass(4.0f);
m_Mesh1.SetRotateSpeed(Vector3D(0.5f,-0.3f,0.1f));
m_Mesh2.Create(m_pd3dDevice,_T("teapot.x"));
m_Mesh2.SetFVF( m_pd3dDevice, D3DFVF_VERTEX );
m_Mesh2.SetPosition(Vector3D(0.0f,3.0f,0.0f));
m_Mesh2.SetSpeed(Vector3D(0.0f,-0.5f,0.0f));
m_Mesh2.SetMass(1.0f);
m_Mesh2.SetRotateSpeed(Vector3D(-0.2f,-0.1f,0.3f));
return S_OK;
}
virtual HRESULT RestoreDeviceObjects()
{
m_Mesh1.RestoreDeviceObjects(m_pd3dDevice);
m_Mesh2.RestoreDeviceObjects(m_pd3dDevice);
m_Font->RestoreDeviceObjects();
// Set miscellaneous render states
m_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, FALSE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE );
m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00444444 );
// Set the world matrix
D3DXMATRIX matIdentity;
D3DXMatrixIdentity( &matIdentity );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matIdentity );
// Set the projection matrix
D3DXMATRIX matProj;
FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect, 1.0f, 100.0f );
m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
// Setup a material
D3DMATERIAL8 mtrl;
D3DUtil_InitMaterial( mtrl, 1.0f, 1.0f, 1.0f, 1.0f );
m_pd3dDevice->SetMaterial( &mtrl );
// Set up lighting states
D3DLIGHT8 light;
D3DUtil_InitLight( light, D3DLIGHT_DIRECTIONAL, 0.1f, -1.0f, 0.1f );
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
return S_OK;
}
virtual HRESULT InvalidateDeviceObjects()
{
m_Font->InvalidateDeviceObjects();
m_Mesh1.InvalidateDeviceObjects();
m_Mesh2.InvalidateDeviceObjects();
return S_OK;
}
virtual HRESULT DeleteDeviceObjects()
{
m_Font->DeleteDeviceObjects();
m_Mesh1.Destroy();
m_Mesh2.Destroy();
return S_OK;
}
virtual HRESULT ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior,
D3DFORMAT Format )
{
if( dwBehavior & D3DCREATE_PUREDEVICE )
return E_FAIL; // GetTransform doesn't work on PUREDEVICE
// If this is a TnL device, make sure it supports directional lights
if( (dwBehavior & D3DCREATE_HARDWARE_VERTEXPROCESSING ) ||
(dwBehavior & D3DCREATE_MIXED_VERTEXPROCESSING ) )
{
if( !(pCaps->VertexProcessingCaps & D3DVTXPCAPS_DIRECTIONALLIGHTS ) )
return E_FAIL;
}
return S_OK;
}
virtual HRESULT Render()
{
m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
0x00000000, 1.0f, 0L );
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
m_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
m_Mesh1.Render(m_pd3dDevice);
m_Mesh2.Render(m_pd3dDevice);
if (m_Collision) m_Font->DrawText(10,10,0xFFFFFFFF,"!!! Collision !!!");
m_Font->DrawText(10,10,0xFFFFFFFF,"Use Arrows and Shift");
m_pd3dDevice->EndScene();
}
return S_OK;
}
public:
virtual LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if (uMsg==WM_KEYDOWN)
{
float speed=1.0f;
if ((GetKeyState(VK_RSHIFT) & 0x8000) != 0) speed=3.0f;
if ((GetKeyState(VK_LSHIFT) & 0x8000) != 0) speed=3.0f;
Vector3D v=m_Mesh1.GetSpeed();
switch (wParam)
{
case VK_LEFT: v.x=-speed; break;
case VK_RIGHT: v.x= speed; break;
case VK_UP: v.y= speed; break;
case VK_DOWN: v.y=-speed; break;
}
m_Mesh1.SetSpeed(v);
}
if (uMsg==WM_KEYUP)
{
Vector3D v=m_Mesh1.GetSpeed();
switch (wParam)
{
case VK_LEFT: v.x=0.0f; break;
case VK_RIGHT: v.x=0.0f; break;
case VK_UP: v.y=0.0f; break;
case VK_DOWN: v.y=0.0f; break;
}
m_Mesh1.SetSpeed(v);
}
return CD3DApplication::MsgProc(hWnd,uMsg,wParam,lParam);
}
};
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
CMyD3DApplication d3dApp;
if( FAILED( d3dApp.Create( hInst ) ) )
return 0;
return d3dApp.Run();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -