渲染游戏的第一个窗口

2009年4月24日

 

         游戏第一步,先渲染一个窗口,在程序中定义了自己的游戏引擎,虽然很小,但是以后应该也是这样的吧。

   在main函数中先InitializeEngine(),定义引擎代码是

bool InitializeEngine()
{
  if(!CreateD3DRenderer(&g_Render)) return false;

  if(!g_Render->Initialize(WIN_WIDTH, WIN_HEIGHT,
  g_hwnd, FULLSCREEN)) return false;

  g_Render->SetClearCol(0, 0, 0);

  return true;
}


 CreateD3DRenderer函数定义是bool CreateD3DRenderer(CRenderInterface **pObj)
{
  if(!*pObj) *pObj = new CD3DRenderer;
  else return false;
   
  return true;
}这个函数返回一个指针,这样对于directx和opengl就没有关系了。定义完引擎后就CreateD3DRenderer(&g_Render))定义过后就初始化,初始化代码是
bool CD3DRenderer::Initialize(int w, int h, WinHWND mainWin,
  bool fullScreen)
{
  Shutdown();

  m_mainHandle = mainWin;
  if(!m_mainHandle) return false;

  m_fullscreen = fullScreen;

  D3DDISPLAYMODE mode;
  D3DCAPS9 caps;
  D3DPRESENT_PARAMETERS Params;

  ZeroMemory(&Params, sizeof(Params));

  m_Direct3D = Direct3DCreate9(D3D_SDK_VERSION);
  if(!m_Direct3D) return false;

  if(FAILED(m_Direct3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
  &mode))) return false;

 if(FAILED(m_Direct3D->GetDeviceCaps(D3DADAPTER_DEFAULT,
  D3DDEVTYPE_HAL, &caps))) return false;

 DWORD processing = 0;
 if(caps.VertexProcessingCaps != 0)
  processing = D3DCREATE_HARDWARE_VERTEXPROCESSING |
  D3DCREATE_PUREDEVICE;
 else
  processing = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

  if(m_fullscreen)
  {
  Params.FullScreen_RefreshRateInHz = mode.RefreshRate;
  Params.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
  }
  else
  Params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

  Params.Windowed = !m_fullscreen;
  Params.BackBufferWidth = w;
  Params.BackBufferHeight = h;
  Params.hDeviceWindow = m_mainHandle;
  Params.SwapEffect = D3DSWAPEFFECT_DISCARD;
  Params.BackBufferFormat = mode.Format;
  Params.BackBufferCount = 1;
  Params.EnableAutoDepthStencil = TRUE;
  Params.AutoDepthStencilFormat = D3DFMT_D16;

  m_screenWidth = w;
  m_screenHeight = h;

  if(FAILED(m_Direct3D->CreateDevice(D3DADAPTER_DEFAULT,
  D3DDEVTYPE_HAL, m_mainHandle, processing,
  &Params, &m_Device))) return false;

  if(m_Device == NULL) return false;

  OneTimeInit();
  return true;
}
这段代码就是初始化directx的代码,然后就 g_Render->StartRender(1, 1, 0);和

  g_Render->EndRendering();整体上很简单。待续。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值