首页 > 代码库 > 简单封装 Delphi 的 DirectX类

简单封装 Delphi 的 DirectX类

[delphi] view plain copy
 
  1. var  
  2.   CreatorRenderer  : TCreatorRenderer;  
  3.   Form1: TForm1;  

窗体代码:

[delphi] view plain copy
 
  1. {$R *.dfm}  
  2.   
  3. procedure TForm1.FormCreate(Sender: TObject);  
  4. begin  
  5.   // 创建  
  6.   CreatorRenderer := TCreatorRenderer.Create();  
  7.   CreatorRenderer.CreateDevice(self.Handle,self.Width,Self.Height ,true);  
  8.   
  9.   // 开启定时器  
  10.   Timer1.Enabled := True;  
  11. end;  
  12.   
  13. procedure TForm1.FormDestroy(Sender: TObject);  
  14. begin  
  15.   CreatorRenderer.Free;  
  16. end;  
  17.   
  18. procedure TForm1.Timer1Timer(Sender: TObject);  
  19. begin  
  20.   CreatorRenderer.BeginRender();  
  21.   CreatorRenderer.EndRender();  
  22. end;  


 

// 下面是封装的渲染器类

 

[delphi] view plain copy
 
  1. // 渲染器类  
  2. // warrially  
  3. unit xCreatorRenderer;  
  4.   
  5. interface  
  6.   uses Direct3D9, D3DX9, Windows;  
  7. type  
  8.   TCreatorRenderer = class(TObject)  
  9.     private  
  10.       // D3D基本参数  
  11.       m_d3dpp   : D3DPRESENT_PARAMETERS;  
  12.   
  13.     private class var  
  14.       m_pDevice : IDirect3DDevice9;   //设备  
  15.       m_pSprite : ID3DXSprite;        //精灵  
  16.   
  17.     public  
  18.       constructor Create;  
  19.       destructor Destroy; override;  
  20.     public  
  21.       // 创建设备 (容器句柄, 宽, 高, 是否窗口化)  
  22.       function CreateDevice(hWnd:HWND ; nWidth : Integer ; nHeight : Integer ; bWindowed : Boolean):Boolean;  
  23.       // 开始渲染  
  24.       procedure BeginRender();  
  25.       // 结束渲染  
  26.       procedure EndRender();  
  27.       // 开始精灵渲染  
  28.       procedure BeginRenderSprite();  
  29.       // 结束精灵渲染  
  30.       procedure EndRenderSprite();  
  31.   
  32.       // 获取设备指针  
  33.       class function GetDevice():IDirect3DDevice9;  
  34.       // 获取精灵指针  
  35.       class function GetSprite():ID3DXSprite;  
  36.   end;  
  37. implementation  
  38.   
  39. { TCreatorRenderer }  
  40. // 开始渲染  
  41. procedure TCreatorRenderer.BeginRender;  
  42. begin  
  43.   m_pDevice.Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER, 0, 1.0, 0);  
  44.   m_pDevice.BeginScene();  
  45. end;  
  46.   
  47. procedure TCreatorRenderer.BeginRenderSprite;  
  48. begin  
  49.   m_pSprite._Begin(D3DXSPRITE_ALPHABLEND);  
  50. end;  
  51.   
  52. constructor TCreatorRenderer.Create;  
  53. begin  
  54.   
  55. end;  
  56.   
  57. function TCreatorRenderer.CreateDevice(hWnd: HWND; nWidth, nHeight: Integer;  
  58.   bWindowed: Boolean): Boolean;  
  59. var  
  60.   pD3d9   : IDirect3D9;  
  61.   myhResult : HResult ;  
  62. begin  
  63.   pD3d9 := Direct3DCreate9(D3D_SDK_VERSION);  
  64.   if (pD3d9 = nil) then  
  65.   begin  
  66.     OutputDebugString(‘Direct3D create failed.‘);  
  67.     Result := False;  
  68.     Exit;  
  69.   end;  
  70.   
  71.   m_d3dpp.BackBufferWidth            := nWidth;  
  72.   m_d3dpp.BackBufferHeight           := nHeight;  
  73.   m_d3dpp.BackBufferFormat           := D3DFMT_A8R8G8B8;  
  74.   m_d3dpp.BackBufferCount            := 1;  
  75.   m_d3dpp.MultiSampleType            := D3DMULTISAMPLE_NONMASKABLE;  
  76.   m_d3dpp.MultiSampleQuality         := 0;  
  77.   m_d3dpp.SwapEffect                 := D3DSWAPEFFECT_DISCARD;  
  78.   m_d3dpp.hDeviceWindow              := hWnd;  
  79.   m_d3dpp.Windowed                   := bWindowed;  
  80.   m_d3dpp.EnableAutoDepthStencil     := true;  
  81.   m_d3dpp.AutoDepthStencilFormat     := D3DFMT_D24S8;  
  82.   m_d3dpp.Flags                      := 0;  
  83.   m_d3dpp.FullScreen_RefreshRateInHz := D3DPRESENT_RATE_DEFAULT;  
  84.   m_d3dpp.PresentationInterval       := D3DPRESENT_INTERVAL_IMMEDIATE;  
  85.   
  86.   myhResult := pD3d9.CreateDevice( D3DADAPTER_DEFAULT,  
  87.                                    D3DDEVTYPE_HAL,  
  88.                                    hWnd,  
  89.                                    D3DCREATE_HARDWARE_VERTEXPROCESSING,  
  90.                                    @m_d3dpp,  
  91.                                    m_pDevice);  
  92.   
  93.   if (FAILED(myhResult))  then  
  94.     begin  
  95.             OutputDebugString(‘D3D device create failed.‘);  
  96.             Result := false;  
  97.       Exit;  
  98.     end;  
  99.   
  100.   myhResult := D3DXCreateSprite(m_pDevice, m_pSprite);  
  101.   if (FAILED(myhResult))  then  
  102.     begin  
  103.             OutputDebugString(‘D3D sprite create failed.‘);  
  104.             Result := false;  
  105.       Exit;  
  106.     end;  
  107.   
  108.   OutputDebugString(‘Renderer create succeed.‘);  
  109.   Result := True;  
  110.   
  111.   
  112. end;  
  113.   
  114. destructor TCreatorRenderer.Destroy;  
  115. begin  
  116.   
  117.   inherited;  
  118. end;  
  119.   
  120. procedure TCreatorRenderer.EndRender;  
  121. begin  
  122.     m_pDevice.EndScene();  
  123.   m_pDevice.Present(nil, nil, 0, nil);  
  124. end;  
  125.   
  126. procedure TCreatorRenderer.EndRenderSprite;  
  127. begin  
  128.   m_pSprite._End();  
  129. end;  
  130.   
  131. class function TCreatorRenderer.GetDevice: IDirect3DDevice9;  
  132. begin  
  133.   Result := m_pDevice;  
  134. end;  
  135.   
  136. class function TCreatorRenderer.GetSprite: ID3DXSprite;  
  137. begin  
  138.   Result := m_pSprite;  
  139. end;  
  140.   
  141.   
  142. end.  

 

http://blog.csdn.net/warrially/article/details/7938672

简单封装 Delphi 的 DirectX类