【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统
作者:毛星云 邮箱: happylifemxy@qq.com 大家别叫我楼主可以吗- -.请叫我浅墨
在从第一节开始看这个笔记系列的话,大家会发现,一上来就开始讲DirectX相关的内容,但是写了几节之后,又开始讲
GDI了。
这是因为我写完前几节后,发觉直接讲DirectX有些生硬。最后我想了一下,应该先梳理完GDI相关的重点知识,再来讲
DirectX,毕竟游戏编程里面windows API是基础。所以先讲windows API,接着介绍DirectX,最后讲解游戏引擎的设
计,这样会自然得多。
————浅墨于2012年3月26日注
很多朋友在评论中都谈到了GDI的效率问题。关于GDI,我想在这一系列文章的篇首简单的说明一下。
用GDI做游戏的效率很低,非常的不推荐。但是GDI作为windows与生俱来的渲染引擎,在图形方面是一个全能的存在。
学习游戏编程如果想打好一个坚实的基础,掌握GDI是非常有必要的,全能的GDI可以在DirectX尚未做好准备的时候,以一个
强大后援的姿态,在游戏的测试与仿真过程中给予我们莫大的帮助。
————浅墨于2012年4月26日注
很多朋友也谈到游戏开发中是否运用MFC的困惑,我也在这里简单的说明一下。由于MFC有底层代码的隐蔽性等特点,且MF
C毕竟封装了很多实际上没用到的东西,不利于游戏开发的效率和游戏的运行速度,不适合做游戏开发。MFC做游戏地图编辑
器之类的工具软件倒是比较适合。我觉得一款成功的游戏最基本的特点就是具有流畅的用户体验,这个要求达不到的话,其他
方面就不用考虑了。
————浅墨于2012年4月27日注
关于本系列专栏的拟定行文思路,有必要进行说明:
▲第一阶段,介绍Windows API相关的GDI编程(进行中)。
▲第二阶段,系统讲解目前市面上中文教程非常有限的DirectX 11(即将开始)。
▲第三阶段,游戏引擎技术的讲解。
▲第四阶段,游戏源码分析,如圣剑英雄传,irrlicht(鬼火)引擎。
在这里浅墨也征求一下大家的意见:
大家对讲什么内容更感兴趣?对什么样的讲述方式更感兴趣呢?
希望大家踊跃发言。
————浅墨于2012年5月7日注
前四篇个人感觉写得不太好,待续吧,在后续文章讲解DirectX 11的时候。浅墨准备到时候系统地把DX相关知识重新过一遍。
————浅墨于2012年5月21日注
作为visual C++,DirectX入门的第一讲,概念性东西比较多,这里我们只是简单的整理一下知识框架,给大家一个大概的认知体系,
后续文章中,我们会展开进行深入的讲解。
1.DirectX的定义
首先,我们必须了解DirectX的定义。DirectX,(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛使用于Microsoft Windows、Microsoft Xbox和Microsoft Xbox 360电子游戏开发,并且只能支持这些平台。最新版本为DirectX 11,创建在最新的Windows 7上。Microsoft DirectX 是这样一组技术:它们旨在使基于Windows 的计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、3D 动画和丰富音频)的应用程序的理想平台。DirectX 包括安全和性能更新程序,以及许多涵盖所有技术的新功能。应用程序可以通过使用DirectX API 来访问这些新功能。
2.必要的工具和开发环境
要进行游戏的开发,我们必须拥有一套最新的DirectX SDK(软件开发包)。我们可以从微软的官方下载站进行下载然后安装,这里贴出地址,http://msdn.microsoft.com/zh-cn/directx/aa937788.aspx。当然我们还要拥有开发环境,我们选择Microsoft公司的Visual Studio 2010。
3.引擎设计概述
游戏引擎是一系列高级代码,我们可以以它为基础开发自己的游戏。现代的游戏引擎已经对使用他的人隐藏了底层实现的细节和规范。例如,可以在OpenGL和Direct3D的基础上开发渲染引擎,这样,引擎用户就不需要知道使用的是哪一个渲染引擎,尽管也用到了一些底层的东西。
游戏引擎包括:渲染引擎,物理引擎,声音引擎等。游戏引擎本身只是一个由更小的引擎组成的集合。游戏引擎或它涵盖的内容并没有一个精确的定义。
对于视频游戏而言,它的游戏引擎至少要包含渲染引擎和输入引擎,这是必须的,否则,就不能称其为交互式游戏。
游戏程序员和游戏引擎程序员完成的是两种不同的工作。游戏程序员只与开发游戏的游戏引擎打交道,而游戏引擎程序员要开发出其他人用于开发游戏的引擎。
4.游戏引擎中的几个关键系统
游戏引擎中的几个关键系统有:游戏渲染系统,输入系统,声音系统,物理系统,动画系统,人工智能(AI)系统等。
5. DirectX API函数
DirectX的API主要由DirectGraphics,DirectInput,DirectPlay,DirectMusic,DirectSound组成。每个API之间相互独立,负责完成DirectX内核中不同的功能。DirectX中每个API都可以通过硬件加速,这意味着这些API可以直接和运行软件的底层硬件对话。下面是各种API函数的概要解释。
DirectGraphics:
DirectGraphics为负责向屏幕渲染二维图形和三维图形的DirectX API,也就是众所周知的Direct3D。
DirectInput:
DirectInput是可以直接使用所有与计算机关联的输入设备的DirectX API。这些设备包括键盘,鼠标和游戏控制器设备。
DirectPlay:
DirectPlay是控制Direct中网络功能的Direct API。DirectPlay可以让应用程序对机器进行网络功能设置,从而可以通过和其他网络玩家交流。
DirectMusic:
DirectMusic是负责普通声音处理的DirectX API。
DirectSound:
DirectSound是负责高级声音处理的DirectX API。
6.动手写一个窗口
在Windows中使用Direct3D创建Win32窗口非常简单。要创建一个Win32窗口就必须拥有一个WinMain()函数(这不是废话是什么)。我们可以在MSDN中查到WinMain()的标准句法
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
当程序第一次运行时,WinMain()函数中的所有参数从系统获取自己的相应参数值。通过在WinMain函数内部创建一个类型为WNDCLASSSEX的窗口类对象,创建窗口,然后显示窗口,然后进行消息循环,就可以实现一个空窗口的显示。具体实现代码如下:
下面是上面讲的框架代码,也是后面的笔记二的基础,需要结合笔记二一起看。
- LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- break;
- }
- return DefWindowProc(hWnd, msg, wParam, lParam);
- }
- int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
- {
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- hInst, NULL, NULL, NULL, NULL,
- "AppClass", NULL };
- RegisterClassEx(&wc);
- // Create the application's window
- HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME,
- WS_OVERLAPPEDWINDOW,
- 100, 100, 640, 480, NULL, NULL,
- hInst ,NULL);
- ShowWindow(hWnd, SW_SHOWDEFAULT);
- UpdateWindow(hWnd);
- // Enter the message loop
- MSG msg;
- ZeroMemory(&msg, sizeof(msg));
- while(msg.message != WM_QUIT)
- {
- if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- {
- //Do something to the screen
- }
- }
- // Unregister our window.
- UnregisterClass("AppClass", wc.hInstance);
- }
第四阶段,开始学习专门介绍游戏开发的教程(有DirectX和OpenGL两条路可选,这里我们选择DirectX,DirectX在国内为主流。具体比较请移步最近刚写的这篇文章 【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈),推荐书籍为《DirectX 9.0 3D游戏开发编程基础》(封面为一个红龙的),《Windows游戏编程大师技巧》,《Direct3D游戏开发技术详解》等等,当然这类教程就比较多了。新出的有很多,DirectX相关的层出不穷,也可以选择刚发行不久的新书,毕竟上面讲的知识比较前沿,现在技术革新速度很快,初学时就学习最新的技术,可以让你少走弯路。(依然感谢liusofttech 的指出,为什么我没有推荐专门讲解3D编程数学基础的教程。我没有专门指出来,是因为几乎每一本Direct3D教材里面都有一章到几章有关必备数学基础知识的讲解。我觉得单独来学数学基础没必要,费时且费力,我们只要在Direct3D教材里掌握相关的数学知识,那就足够了。)
另外在这里预告一下,本系列文章后续内容会对目前最新的而中文教材稀少的DirectX 11技术进行深入讲解,希望有兴趣了解
最新技术的朋友们持续关注。
以上就是本节笔记的全部内容。
更精彩的内容,且看后面的笔记系列。
感谢一直支持【Visual C++】游戏开发笔记系列专栏的朋友们,也恳请大家继续关注我的专栏。
目前在讲的GDI只是前奏。DirectX 11会在GDI梳理完后进行深入讲解,敬请期待~~
【Visual C++】游戏开发 系列文章才刚刚展开一点而已,因为游戏世界实在是太博大精深了~
但我们不能着急,得慢慢打好基础。做学问最忌好高骛远,不是吗?
浅墨希望看到大家的留言,希望与大家共同交流,希望得到睿智的评论(即使是批评)。
你们的支持是我写下去的动力~
精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。
大家看过后觉得值得一看的话,可以顶一下这篇文章,你们的支持是我继续写下去的动力~
如果文章中有什么疏漏的地方,也请大家指正。也希望可以多留言来和我探讨相关的问题。
最后,谢谢你们一直的支持~~~