您所在的位置:读书频道 > 设计开发 > 其它开发 > 2.2.1 老的WinMain

2.2.1 老的WinMain

2011-03-02 18:50 陈征/傅鑫 等译 机械工业出版社 字号:T | T
一键收藏,随时查看,分享好友!

《游戏编程入门(原书第3版)》第2章侦听Windows消息,本章将更详细地学习Windows消息机制和主循环,并编写一个完整的能够在屏幕上显示一些内容的窗口程序。将学习窗口句柄和设备环境如何一起在窗口上产生输出。本章继续探究实时游戏循环,尤其是获得WinMain之外的实时循环的方法。我们将在本章学到一些新的技巧,以便让实时循环运行,为下一章的DirectX做准备。本节为大家介绍老的WinMain。

AD:

2.2 什么是游戏循环

Windows编程比我们在这几页中所讲解的要博大精深得多,我们所需关注的只是能够让DirectX启动起来的有限代码。一个“真正”的Windows应用程序应该有一个菜单、一个状态栏、一个工具栏及许多对话框,这也是一般的Windows编程书籍又大又厚的原因。我们这里要关注的是游戏的创建而不是将大量篇幅花费在操作系统的逻辑上。我们真正想做的是逃离Windows代码,用上简单的、寻常的、C++程序里标准的main函数(但在Windows程序中没有它,而是WinMain)。

建议 Windows编程方面的书籍推荐参见附录B。

有一种方法是将所有的基础Windows代码(包括WinMain)都放到一个源代码文件中(例如winmain.cpp),然后使用另一个源代码文件(例如game.cpp)来放游戏。然后,就是在WinMain中调用某种形式的main函数的简单事情了,“游戏代码”会在程序窗口创建之后立即开始运行。这实际上是许多系统和库的标准做法,它将操作系统进行抽象,给程序员提供一个标准的接口。Allegro就是一种这样的库,它是跨平台的游戏库,可在Windows、Linux、Mac和Unix系统上使用。如果编写一个使用Allegro的程序,那么这个程序无需修改就可以在这些系统中的任何系统上编译!这就将“移植”工作带入可管理的层次,因为对于一个为Windows开发的程序而言,仅需一点点的努力即可为Linux重新编译(反之亦然)。这里不是真要往这个方向走,但这对于尽可能抽象代码如何有益是个很好的示例。

建议 如果想学习更多与Allegro游戏库相关的知识,参见附录B中关于这一主题的一本尖端书籍的信息!

2.2.1 老的WinMain

以下是到目前为止我们一直在用的WinMain版本:

 

这个版本的WinMain仅有一个问题:它没有一个连续的循环,只有一个有限的循环用于处理任何尚未处理的消息,然后退出(参见黑体的while一行)。

1. 对持续性的需要

当精灵或3D模型在屏幕上动画显示,敌方角色到处移动,枪弹和爆炸再加上高热原子核反应的爆炸在背景肆虐时,我们需要能够将Windows消息放在一边而一直工作的东西!简单地说,上面列出的是一个蠢笨的、无生命力的WinMain版本,完全不适合于游戏。我们需要这样一种东西,它能够持续运行而无论是否有事件消息进来。创建一个无论Windows在做什么都能一直运行的实时循环的关键就在于修改WinMain中的while循环。

首先,while循环受一条消息的制约,而游戏必须在循环中保持运行,无论是否有消息。所以这绝对需要有所改变!图2-3显示了当前的WinMain。

 
图2-3 标准的WinMain对实时游戏循环不友好

2. 实时的终止器

注意主循环在没有消息时的终止和在尚有消息存在时持续处理的方式。如果在这个版本的WinMain中调用主游戏循环会发生什么情况呢?嗯,游戏循环偶尔会执行,内容会在屏幕上更新。但更经常的是什么都不会发生。这是什么原因呢?因为这是个事件驱动的while循环,而我们需要一个普通的、寻常的、过程的while循环来保持系统运行、运行、再运行,无论发生什么。实时游戏循环在游戏结束之前必须保持运行不停。为了避免大家疑惑,下一章将展示设立一致的、常规的帧速率的方法。目前的目标是让一切尽可能快地运行,而后再考虑计时的问题。我们必须先让程序跑起来,然后再进行优化或清理(如果有时间)。

现在来看另外一个图示,见图2-4。这是新版本的WinMain,现在它支持实时游戏循环了。它不再只是对事件进行循环。它而是不管事件如何,一直保持循环。

 
图2-4 新修改的WinMain对实时游戏循环要友好得多

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

×
分享到:

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>

读书

JavaScript核心技术
它从最简单的地方入手,不仅讲述了JavaScript的基础知识,还讲述了JavsScript如何操作CSS、DOM等Ajax基础技术。而关于跨浏览器兼

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i