资源描述:
《2d游戏编程笔记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2D游戏编程笔记-1here本人同意他人对我的文章引用,但请在引用时注明出处,谢谢.作者:蒋志强2D游戏开发与3D相比相对简单,在主要的流行平台都提供了相应的API支持其开发.比如对本地windows原生程序,系统提供了GDI;对windows平台上更高效率的需求,以COM的形式提供DirectDraw;在托管的.NET环境下提供了GDI+;JAVA也有相应的支持2D图形的包等.不同的API接口在调用方法上虽然有所差异,但思想和处理方法都是类似,所以熟练的使用了一种以后,可以很容易的举一返三.在我的该系列笔记中,介绍的是DirectD
2、raw这种编程接口.DirectDraw是microsoft推出的DirectX开发包中的一个组件,专门用于提供高效的2D图象编程支持.从DirectX8的版本开始,DirectDraw就没有被更新了,在新的DirectX版本将用于2D的DirectDraw组件和用于3D的Direct3D组件合并为了Graphics组件,将2D和3D图形处理合并.对于3D图形图象处理,我们只要固定观察角度,那么就等同于在处理2D图象,这也是Graphics替代D3D和DirectDraw的原因,但是以3D的方法来处理2D的图象,也会让本来可以更简单的
3、操作人为变得复杂.所以我仍然选择DirectDraw编程接口.我必须先说一下COM,因为DirectX的组件都是以COM组件来实现的.我们的目的不是要自己编写COM组件,所以我们只需要有个大概的了解就,就可以理解DirectDraw组件的工作方式了.(当然,如果你愿意对COM做更深入的学习也是会对你很有好处的.)COM是组件对象模型(ComponentObjectModel)的意思,它是microsoft定义的一种进行组件编写的规范,按照COM规范编写的组件就叫做COM组件.组件是相对独立的软件可复用的模块,有按照不同组件规范编写的组
4、件,COM组件只是其中的一种类型.COM组件用C++实现的,实际上一个COM组件在内存中就是一个C++的类,但COM组件不一定必须用C++语言来编写,也可以是其他的语言(比如Delphi,VB),只要在内存中与C++编写的组件的类相同就可以.COM组件对外通过接口提供各种方法的调用.DirectDraw是COM组件,我们对它的使用,也是通过它提供的接口中的方法调用.每个新版本的COM组件,都必须实现以前旧版本COM组件的接口,所以在新的DirectX9中,我们仍然可以调用老的DirectDraw7组件.我们先看一下,DirectDra
5、w在windows程序体系结构中的工作位置,如下图所示:最上面是我们的win32应用程序,我们进行2D图象处理可以可以直接在程序中调用GDI,GDI再通过DDI,也就是显卡驱动程序调用显卡硬件进行绘图.另外一种方式是通过DirectDraw组件提供的接口中的方法来进行绘图.从图中我们可以看到DirectDraw下面既有HEL层也有HAL层.HAL层是硬件抽象层,在microsoft推出DX后,要求显卡硬件制造商要遵守规范,这就是DirectX规范,我们现在在市面上看到的显卡都标有支持DirectX9的说明,向上对操作系统提供相同的功能
6、实现.由于支持DirectX9规范的显卡,都实现了DirectX所要求的功能调用(当然同样支持DirectX9规范的高档的显卡实现同样的功能会比入门显卡快),所以可以通过相同的硬件抽象层HAL来调用显卡的功能,而不用关心显卡的GPU是Nvidia的还是ATI的.还有一个叫做HEL的硬件仿真层,这是由于也许游戏程序中使用了DirectX9组件最新接口中的新的方法调用,但你机器上的显卡比较老,只能支持DirectX8的规范,所以你的显卡的GPU无法完成该方法调用,这个时候就可以通过HEL让CPU来通过软件的方式来实现该调用,而不用让GPU
7、去做它根本没有能力做的事情.当然由CPU通过软件计算会比通过GPU硬件实现要慢很多,但是我们获得的好处显而易见,游戏程序可以在老的机器上跑.通过HEL和HAL层的体系结构,实现了程序的硬件无关,这十分的有意义.基础的知识概念介绍得差不多了,下一次我们要对编程环境进行配置,并完成一个真正的DirectDraw程序,我假定我们都有windows编程的基础,如果没有,建议你参考一下Petzold的那本<windows程序设计>.很令人兴奋吧,突然发现已经很晚了,我也该睡觉了,明天还要上班真是可怜.成都的天气实在是闷热,我去洗澡了,ByeBy
8、e. 2D游戏编程笔记-2本人同意他人对我的文章引用,但请在引用时注明出处,谢谢.作者:蒋志强要进行DirectX的程序开发,必须要安装DirectX的SDK(SoftwareDevelopKit),因为我们使用Dire