Programming 版 (精华区)

发信人: superman (☆风雨无阻☆), 信区: Programming
标  题: [转载] DOS到Windows的 游 戏 移 植(1)
发信站: 紫 丁 香 (Sat Aug 29 07:35:34 1998), 站内信件

【 以下文字转载自 cnprogram 讨论区 】
【 原文由 Young_Yang@bbs.ustc.edu.cn 所发表 】

                      DOS到Windows的 游 戏 移 植(1)
                                      
                                    谭翁
                                      
   ----对一些程序员来说,将DOS环境下的游戏移植到Windows 95环境下,可能感到
   无从下手。本系列文章将介绍一些在32位 Windwos环境下编写游戏程序的基本概
   念和关键之处,并引导用户将游戏移植到Windows环境下。 设计实时游戏要面对
   以下两个最基本的问题:
    1. 建立驱动动作的引擎:主游戏循环;
    2. 建立实时事件,使得在处理事件时由程序员而不是硬件或操作系统来选择步
       调。
       
   ----此外,在这一过程中,我们还将接触到键盘输入等问题。
   
   ----从程序员角度看来,实时游戏是最富有挑战意义的,即在每一时刻,无论是
   否有用户输入都会有一些事情在发生,所以我们主要讨论这类游戏的设计,但我
   们讨论的方法大多同样适用于基于周期(turn-based)的游戏。
   
  工 具
  
   ----把游戏从DOS移植到Windows编程环境下无疑需要一个新的开发环境,在选择
   主要编程工具时,最关键的一条是看它能否与 Microsoft DirectX(tm)
   Software Development Kit (SDK)一起很好地工作。Direct X在 Windows的环境
   下可以实现高质量的动画,还可以提供的各种服务,如:声音回放、用户输入、
   和多玩家的游戏(对 DirectX不很熟悉的程序员请参阅有关书籍和资料)。
   
   ----Visual C++是与 DirectX结合的天衣无缝的一种工具,C++的 4.1版就是随
   DirectX SDK的成熟而发展起来的。当然,程序员也可以使用任何其它32位
   Windows C或 C++编译器。 Borland公司的 Delphi 2也可以与 DirectX共同工作
   ,但需要一个Pascal的接口。Blake Stone公司的程序接口也是一个可选项,其站
   点为 http://www.dkw.com/bstone/,并且可以免费获得。
   
   ----DirectX是严格的32位软件,并且只能在 Windows 95和 Windows NT 4.0及以
   上版本下编译和运行,所以用它来编写16位Windows环境下的游戏是不可行的。今
   天,几乎所有成功的Windows游戏都是特为32位Windows设计的,而且这种趋势会
   越来越强烈。
   
   ----对于Visual C++的初学者来说,MFC意味着 Microsoft基本类。实际上,MFC
   不仅仅是一个包装了许多低级 Windows应用程序编程接口(API)的一个面向对象的
   编程框架,它还提供了一个非常有用的范例,使 Windows围绕着“文档”(数据
   )和“视图”(用户观察和操纵数据的方式)构造应用程序。它与AppWizard结合
   使用,能够大大加快创建基本架构应用程序并添加诸如可连接的工具栏和状态栏
   的过程的速度,它还能够自动完成诸如文件输入和输出这种单调沉闷的编程工作
   。
   
   ----开发者们都一个共同的目标:最快速的执行。MFC的目标是产生有吸引力的、
   风格统一的用户界面,而游戏的设计者则希望具有创建他们自己风格的界面,不
   希望他自己的游戏看起来像标准的 Windows应用程序。
   
  Moby Dick:一个示例
  
   ----从DOS移植到Windows时会遇到一些问题,为说明这些问题,笔者创建了一个
   简单的DOS游戏,是VGA图形显示,然后把它移植到 Windows下。本文给出两个版
   本的程序源代码。在后续的文章中,笔者将使用 DirectX SDK增强 Windows版游
   戏的功能,至少增加鼠标和游戏杆输入、声音、和更加成熟的动画系统。
   
   ----Moby Dick是一个“拱廊”样式的游戏,仅接收键盘输入。一条鲸鱼(即
   Moby Dick),有计算机控制,在地图上以随机方式移动,会偶尔“喷气”以暴露
   一下它的位置。玩家在船长 Ahab的命令下使用光标键或数字键盘移动小船。使用
   拐角(corner)键盘键或同时按下两个光标键可以实现斜方向的移动。小船驶过的
   地方会留下航迹,并且 Moby Dick出现的格子也会用同样的航迹标记起来。玩家
   获胜的条件是在一个已标记的格子中移动小船捕到 Moby Dick。该游戏的
   Windows版还有一个增强的功能:一朵云彩会随机地出现在地图中的某一行,擦除
   该行中的已标记的格子。笔者添加这个功能的目的是演示多线程和设置线程属性
   。
   
   ----DOS版游戏有时间限制,但是这个功能在 Windows版中被删除了,这样是为了
   在实验设置值时不会被中断。
   
   ----该游戏的DOS版源代码是用 Borland Turbo C++ 3.0版开发出来的,但是只需
   要很小的改动就可以适用于任何C或C++编译器。要确保关掉寄存器变量
   。Windows版游戏设计在一个 Visual C++ 4.0版工程的窗体中;同样,因为它不
   使用类,所以也无须多少修改就可以适用于其它编译器。
   
   ----该游戏中包含了一个名为 Time Waster的小程序,它的全部功能就是消耗
   CPU时间。它实现这一功能的方法是不停地分配内存,直到耗尽所有的可用内存,
   然后再释放它们,同时还进行一些浮点数学运算。注意:因为 Windows把交换文
   件作为可用 RAM的扩展来处理,Time Waster会对硬盘造成很大影响。当我们开始
   实验计时和优先级时会用到这个程序。
   
  DOS版游戏的结构
  
   ----DOS版Moby Dick游戏程序的“心脏”是两个中断服务例程,它们拦截正常的
   时钟和键盘中断(对于使用ISRs来驱动游戏的技术还不熟悉的程序员请参阅有关
   书目)。
   
                                  [INLINE]
                                      
                           图 1.用ISR中断程序流程
                                      
   ----键盘 ISR捕获所有的按键和松开键的动作,并且更新键盘状态表,该表中保
   持着所有光标键的当前状态。每次该 Ahab(或 Pequod)移动时,程序就会查询
   该表。该例程还需要一点附加工作以确保不会有击键丢失,后面我们将看到这一
   点。同样,在 Windows版中我们要处理快速击键,但是我们的目的仅仅是演示。
   
   ----时钟 ISR所做的工作只是每当系统时钟“滴答”一次(大约 5毫秒左右),
   就递增一个计数器的值。每执行一次游戏循环,我们就检查该计数器,看看现在
   是否应该做点什么事情。在两个响应例程 Move_Ahab和 Move_Moby中都执行该检
   查,然后,在游戏循环的结尾处,我们就检查是否有“有趣”的事情发生,如果
   需要就重画屏幕。
   
   ----图形系统是最小化了的。所有的“捣蛋鬼”(sprites)都包保存在一个 .PCX
   文件中,并且在加载的时候被解压缩到变量中。更新操作是直接对屏幕进行的,
   不需要缓存、翻转(flipping)、甚至于不需要等待纵向的回折(vertical
   retrace)。可见整个这个游戏是非常简单的。
   
  DOS程序与Windows程序的区别
  
   ----DOS程序是Windows程序的基础,他们之间最根本的差别在于: DOS程序是过
   程式的(它遵照开发者所设定的过程,并且按照开发者所指定的顺序),而
   Windows程序是事件驱动的。如果把程序看成一个保险公司的代理处,那么 DOS程
   序会按照一个事先拟定的工作表来工作,依次给每个人打电话。而 Windows程序
   将坐在那里,翘起腿来,等待电话铃响。
   
   ----但是Moby Dick的 DOS版把以上这种差别弄得有一点不清晰了,因为它使用了
   中断处理程序,而不是不停地检查是否有键击或者系统时钟是否产生了一个“滴
   答”。它会立即对这些系统产生的事件做出响应。事实上,Moby Dick的 DOS版利
   用的是一种原始的多任务,因为无论程序在做什么,它都会中断以响应相应的事
   件。
   
   ----Windows使用了相同的概念,只是更加深刻。它不使用中断例程,至少对于应
   用程序的编程者是不可见的;但它跟踪许多事件,这些事件不仅包括输入,还包
   括响应输入时发生的事件(例如调整窗口的大小),并且就有关该事件的必要信
   息以消息的形式与相关的窗口通信。
   
   ----几乎所有发生在 Windows程序中的事件都直接或间接地响应消息。在游戏程
   序中,主循环在消息接收和分发机制上,--检查并响应输入。
   
                                  [INLINE]
                                      
                        图 2. Windows游戏的程序流程
                                      
  忘掉硬件
  
   ----从DOS转移到 Windows编程最艰难的是失去控制。游戏程序员一般都是在低级
   别与硬件打交道的专家,擅长于拦截中断、读取端口、“哄骗”视频卡进入
   "Mode X"状态,而且习惯于对程序的流程具有完全的控制。Windows初看像是一个
   狡诈的黑箱,在一端得到输入,而在另一端出来的天知道是什
   么(who-knows-what)。计算出应该从黑箱中出来什么和只是学习怎样使用它的差
   别是非常大的。
   
   ----但是,第一步就是要学会失去控制,所以程序员需要忘掉所有的寄存器、中
   断和调色板等,Windows会承受这一切负担。事实上,当我们处理键盘输入时,我
   们将越过 Windows消息系统。但是即便如此,我们还是要依靠 Windows为我们读
   取键盘的状态。
   
  Windows图形文件处理
  
   ----Moby Dick的 DOS版的相当一部分工作是加载和解压缩 .PCX图形文件。大多
   数工作是在线汇编程序完成的,因为写这个程序时,12 MHz的 PC是最快的机器,
   加载图形是程序性能的最大“瓶颈”。
   
   ----如果要在 DOS游戏中使用位图,程序员就不得不开发、购买或偷一个程序,
   以便能够把磁盘中的图像转换成内存中可用的图形。而Windows中有能够加载
   .BMP的函数,所以只需短短几行,就可以完成 Moby Dick DOS中代码所完成的全
   部功能。在 Moby Dick Windows中,可以把位图放进资源文件中,这样它们就可
   以被编译进可执行文件中去。
   
   ----(未完待续)  
   
     _________________________________________________________________
                                      

--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: poster.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.307毫秒