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

📄 main.cpp

📁 Beginning Direct3D Game Programming源代码Part3chapter12
💻 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 + -