游戏开发初步1-我的第一个DirectX 程序!

终于能有时间安下心来学程序了,我要坚持到最后写出自己的游戏!
郑州这里游戏开发书籍几乎没有,只好到网上先找个教程自学,不过以后一定要买个国外的教程看,然后边看边写若有疑问再在论坛上发帖子提问或问身边的高手。我想这大概是我这段时间的伟大计划吧!

开发前曾在论坛上看了很多关于用opengl还是directX开发游戏的争论,直到看到晕,我还是觉得用directX还是舒服点.
先是用DirectX3d创建了一个窗口,运行例子的时候竟然什么都看不到,用dxdiag查看原来显卡不支持directX3d,下了一个新的驱动就好了。

这是第一个程序,每个字母都是自己打出来的,可是完全没有自己的风格,因为这还是完全照着例子打的, 我总是想高手刚开始也应该是这样吧。

运行程序需要安装directX sdk,我在华军软件园上搜索了一个,然后安装,安装后用vc建立一个控制台程序,然后
在project的setting中加入d3d8.lib。创建一个main.cpp程序,并写入以下内容:
#include <d3d8.h>

LPDIRECT3D8 g_pD3D = NULL;
LPDIRECT3DDEVICE8 g_pD3DDevice = NULL;


HRESULT InitialiseD3D(HWND hWnd)
{
 g_pD3D = :irect3DCreate8(D3D_SDK_VERSION);//创建direct3d对象

 if (g_pD3D == NULL)
 {
  return E_FAIL;
 }

 D3DDISPLAYMODE d3ddm;

 if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))//查询当前显示模式
 {
  return E_FAIL;
 }

 D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory(&d3dpp,sizeof(d3dpp));//清除d3dpp中的数据?

 d3dpp.Windowed   = TRUE;
    d3dpp.SwapEffect  = D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat = d3ddm.Format;

 //创建设备并用软件加速
 if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
           D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))
    {
        return E_FAIL;
    }
    
    return S_OK;
}
//一个绘制图形的函数
void render()
{
 if (g_pD3DDevice == NULL)
 {
  return;
 }

 g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,0),1.0f,0);
 g_pD3DDevice->BeginScene();
 g_pD3DDevice->EndScene();
 g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}
//清空所建立的所有对象,在程序结束时使用
void CleanUp()
{
 if (g_pD3D != NULL)
 {
  g_pD3D->Release();
  g_pD3D = NULL;
 }

 if (g_pD3DDevice != NULL)
 {
  g_pD3DDevice->Release();
  g_pD3DDevice = NULL;
 }
}
//游戏循环,检查消息循环里里有没有消息,如果没有就调用render来画图
void GameLoop()
{
 MSG msg;
 BOOL fMessage;


 PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);

 while(msg.message != WM_QUIT)
 {
  fMessage = PeekMessage(&msg,NULL,0U,0U,PM_REMOVE);//对列里没有消息返回真,有返回假
  
  if (fMessage)
  {
   TranslateMessage(&msg);//后面有详细说明
   DispatchMessage(&msg);//调用消息处理函数
  }

  else
  {
   render();
  }
 }
}
//响应消息函数并处理
LRESULT WINAPI WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
 switch(msg)
 {
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
  break;

 case WM_KEYUP:
  switch(wParam)
  {
  case VK_ESCAPE:
   DestroyWindow(hWnd);
   return 0;
   break;
  }
  break;
  }
 return DefWindowProc(hWnd,msg,wParam,lParam);
 }
//window主函数,建立窗口,并显示
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
 WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,GetModuleHandle(NULL)
 ,NULL,NULL,NULL,NULL,"DirectX",NULL};
 RegisterClassEx(&wc);

 HWND hWnd = CreateWindow("DirectX","Window",WS_OVERLAPPEDWINDOW,
 100,100,500,500,GetDesktopWindow(),NULL,wc.hInstance,NULL);

 if (SUCCEEDED(InitialiseD3D(hWnd)))
 {
   ShowWindow(hWnd,SW_SHOWDEFAULT);
   UpdateWindow(hWnd);
   GameLoop();
 }
  CleanUp();
  UnregisterClass("DirectX",wc.hInstance);

  return 0;
}

/*
TranslateMessage的详细说明
Translate 是转化的意思,整个函数有什么用呢?对了,是把 虚拟键码 转化为 字符码 ( MSDN 原文:translates virtual-key messages into character messages 。 虚拟键码 (virtual-key) 是什么?其实在之前检测全局键盘里面就用过,那是对键盘上不同键钮的编码,用来区分每一个键钮。 那么字符码 (character) 实际上是 ASCii 码的一个子集。 实现方式是,当认定消息需要转化为 字符码 消息,该函数就会向自己的消息队列里 Post 一个 WM_CHAR 的消息 (WM_CHAR == 258),因为是使用 Post 方式,所发送的消息会插队到最前面。 要转化的 虚拟键码 从原消息的 wParam 中取得,转化后的 字符码 则放在 WM_CHAR 消息的 wParam 中。

举个例子,当 A 键被按下的时候会发出 WM_KEYDOWN 消息,并且附带一个虚拟键码帮助我们知道被按下的是哪一个键。但是,A 被按下的情况不止一种,根据不同的其他因素,可能是 大写 的 "A" ,也可能是 小写 的 "a",完全视乎当时是否打开大写输入 (Caps Lock) 和有没有同时按下 Shift 键。 TranslateMessage() 会自动识别这些情况,保证在 WM_CHAR 消息的 字符码 是希望得到的效果。


*/
一个下午时间才把这个程序完全搞懂,幸好原来有window编程的基础,不然我想会更久。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值