⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g01.htm

📁 一本介绍如何开发游戏,如何进行游戏编程的非常值得一看的好书.
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都网--Windows游戏编程大师技巧</title><LINK rel="stylesheet" href="../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,网络安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%">  <tbody>   <script language="javascript">print2()</script>  <tr>     <td width="100%">       <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%">        <tbody>         <tr>           <td class=f1 id=thetd width="100%">             <p>[<a href="index.html">目录</a>][上一页][<a href="g02.htm">下一页</a>]</p>            <p align="center"><b>第一章 无尽之旅</b></p>            <p>  Windows编程是一场由来已久并还在进行着的战争。开始时,游戏程序拒绝Windows平台,但正如Borg所言:“反对无效......”,我也赞同这一观点。本章就Windows的发展进行一下回顾。<br>                ·游戏的历史<br>                ·游戏类型<br>                ·游戏编程的基本要素<br>                ·使用工具<br>                ·一个游戏的例子:FreakOut</p>            <p> <b>历史一瞥</b></p>            <p>  在60年代的某个时候,第一台台式计算机问世,当时运行在Unix机器上的Core Wars,是最早的计算机游戏之一。当70年代的黄金岁月到来时,在全世界的台式计算机和小型计算机上流行着文本游戏和粗糙的图片游戏。有趣的是从那以后,大多数游戏开始网络化。我是说,90%的游戏程序MUD(Multi-User               Dungeons)或类似的模拟游戏,如Star Trek和战争模拟游戏。但是,直到精彩的Pong游戏问世,大众才真正品尝到计算机游戏的乐趣。由Nolan               Busnell设计的Atari计算机的问世,使单人的视觉游戏一夜之间充斥市场。<br>                而后,在1976~1978年间,TRS-80、Apple、Atari 800等型计算机开始冲击市场,这些是消费者买得起的第一代计算机。当然,读者也可以买类似Altair               8000型的组装机,但是又有谁乐意进行它们的组装呢?无论如何,这些计算机有各自的优缺点,Atari 800是当时功能最强大的计算机(我也保证,我可以写一个Wolfenstein程序在它上面运行)。TRS-80最商业化,而Apple机的市场最好。<br>                慢慢地,游戏开始冲击计算机相关产业方面的市场,一夜之间,产生了许多年轻的百万富翁。制作者只需要一个类似“月亮领地”或Pong类型的好游戏,就可以突然致富!从那时,游戏开始像真正的计算机游戏,而且只有百十人知道如何编写游戏,当时绝对没有这类的指导书,只是有人不时半地下地出版一些50~100页的有许多令人费解之处的小册子,另外也曾在Byte杂志上有过文章,但是,大多时候,读者必须靠自己。<br>                80年代是游戏升温的年代。第一代16位计算机问世,如:IBM PC及其兼容机、Mac、Atari ST、Amiga 500等等。这是游戏变得好看的时候,甚至有些3D游戏如Wing               Commander、Fight Simulator等开始出现在市场上。但是,PC机肯定仍然落后于游戏机。在1985年以前,Amiga               500和Atair ST作为最终游戏机占有绝对的支配地位。但是PC机由于低廉的价格和其商业用途开始大众化,并且最终必须将是具有最大市场基础的计算机——不考虑它的技术和质量——一统江湖。<br>                在90年代初期,IMB PC及其兼容机是主流。随着微软的Windows 3.0的发行,Apple Macintosh寿终正寝。PC是“工作者的计算机”。读者可以真正在上面进行游戏、编程、开机并连接其他东西。我想这就是为什么会有这么多人沉醉于PC而不是Mac的原因。一句话,读者不可能从Mac中寻求乐趣。<br>                但是PC在图像或声音上还依然落后,PC机看起来像没有足够的马力使游戏如同在Amiga或者游戏控制台上表现得那样好。 <br>                而后曙光终于来临......<br>                在1993年后期,Id Softwere发行了DOOM作为Wolfenstein 3D(是由Id编写的第一批3D游戏之一)的换代产品。PC机开始成为家用微机市场玩游戏或编程的选择,直到现在也是。DOOM表明,只要读者有足够的才智,就可以在微机上面作任何事情。这点非常重要,记住,没有任何东西可以替代想像力和决心,只要读者认为可能,它就能实现。<br>                在DOOM的疯狂冲击下,Microsoft开始重新估计它在游戏和游戏编程上的地位,它意识到娱乐产业的巨大,并且只会更大。它开始制定巨大的计划涉足游戏,以使它得以在这个产业中分一杯羹。               <br>                问题是即使Windows 95的实时视听能力也表现得很恶劣,于是微软发行了Win-G以解决视觉方面的问题,Win-G被宣布为游戏编程和图形子系统的最终解决方案,而实际上它不过只是用位图画的一些图像而已。一年之后Microsoft却又否认它的存在。——这可实有其事!<br>                但是,新的图形、声音、输入、网络、3D系统的工作已经开始,DirectX诞生了。像以往一样,Microsoft发行人员宣称它将解决世界上PC机平台上所有游戏编程的问题,并且在Windows上运行的游戏将同DOS32上的游戏一样快,甚至更快。但事实上并非如此。<br>                DirectX开始的两个版本在实际应用中是失败的,但这并非指技术而言,Microsoft低估了视觉游戏编程的复杂性及视觉游戏程序员能力。但是到了DirectX3.0,DirectX就开始工作得比DOS出色!但是那时(1996~1997)许多公司仍然采用DOS32平台进行游戏编程,直到DirectX版本5.0发行,人们才转而使用DirectX。<br>                现在DirectX已经升级到8.0版本(本书包含7.0版本),它是一类极强大的API。的确,读者应当改变一下想法——用COM(Component               Object Model)在Win32上编程,不再对整个计算机进行全部控制——但生活就是如此。<br>                利用DirectX技术,读者可以创建一个4GB地址(或更多)、内存线性连续的、仿DOS的虚拟机,读者可以像在DOS环境(如果读者喜欢的话)下那样来编程。更为重要的是,现在读者可以即时操纵图像和声音技术的每一个新的片段。这都归功于DirectX远见卓识的设计和技术。总之,关于DirectX的话题已经足够多了,不久读者就会接触到整个处理所带来的效果。<br>                首先出现的是DOOM游戏,它仅用到软件光栅技术,如图1.1所示。看一看Rex Blade游戏的屏幕表现,它是DOOM游戏的一个克隆版本。下一代的3D游戏,如QuakeⅠ、QuakeⅡ和Unreal就有了巨大的飞跃。再看一看图1.2中Unreal游戏的屏幕表现。这个游戏及其类似的游戏,其表现简直令人难以置信。所有这类游戏都采用软件光栅和硬件加速代码来获得最好的游戏表现。提请读者注意的是,Unreal和QuakeⅡ游戏至少要运行在配置VoodooⅡ加速卡的PentiunⅡ400MHz机器上才能够达到这么眩目的效果。那么这将把我们带向何方?技术的发展越来越先进,以至空间已成为制约因素。然而,“奇迹”总会涌现。即使诸如Quake和Unreal这类的游戏需要花费数年才能制作完成,我们仍然相信读者也能够创作出有如此吸引力的游戏。<br>                历史的回顾到此为止,下面让我们转到游戏软件设计的核心上来。 </p>            <p> <b>设计游戏</b></p>            <p>  编写视频游戏最难的一个工作是设计。的确,3D运算很难,但是策划一个有趣的游戏并且进行设计可谓同样困难、重要。谁会关心游戏中是否采用最新的光子跟踪技术呢?<br>                现在,构思一个游戏并不难。难的是它的细节体现、最终实现和相似物体在视觉形象上的差别表现。因此下面概述一下一些基本概念和本人在游戏设计工作中的一些心得、经验。</p>            <p> <b>游戏类型</b></p>            <p>  现在,游戏类型多如政治许诺(只说不做),但可以将它们归入以下几个类型:<br>                <b>类似DOOM的单人游戏</b>——这些游戏大部分是全3D游戏,你将以角色的身份置身游戏中。DOOM、Hexen、Quake、Unreal、Duke               Nukem 3D以及Dark Forces都属于这一类型的游戏。<br>                从技术上讲,它们或许是最难开发的游戏 ,这类游戏要求采用边缘切换技术。<br>                <b>运行游戏</b>——运行游戏可以是2D的,也可以是3D的,但是近来3D的运行游戏越来越多了。运动游戏可以一个人玩。也可以多人玩。运动游戏的图像已经有了很大的改进。也许运动游戏不像单人游戏给人印象深刻,但是它们也很吸引人。当然运行游戏中的人工智能水平却是所有游戏类别中最先进的。<br>                <b>格斗游戏</b>——<br>                <b>街道/枪战/平面游戏</b>——<br>                <b>机械模拟游戏</b>——<br>                <b>生态模拟游戏</b>—— <br>                <b>攻略或战争游戏</b>——<br>                <b>交互式故事</b>——<br>                <b>重新流行的游戏</b>——<br>                <b>纯智力和棋牌游戏</b>—— </p>            <p> <b>集思广益</b></p>            <p>  一旦读者决定了制作哪一种游戏(这是件简单的事,因为我们知道自己喜欢什么),就到了构思这个游戏的时候了。这完全由读者自己决定,策划一个好游戏并没有一成不变的思维定式。<br>                首先,必须想出一个读者喜欢制作并将它开发成为听上去很酷的、可以实现的,并且其他人能够喜欢的游戏。<br>                当然,读者可以将其他游戏作为模板或出发点来得到启发。不要简单地复制其他产品,但是大致模仿已成功的产品也是可以的。并且,大量阅读科幻书籍和游戏杂志,观察正在卖什么观看大量的电影将有助于产生很酷的故事想法、游戏想法或视频动作。<br>                我通常所做的是和朋友一起坐坐(或者是自己),抛出各种想法,直到出现听上去很酷的想法。然后,开发这个想法,直到似是而非,或者土崩瓦解为止。这令人非常心灰意冷。读者可能会对所有的想法厌烦,然后在两三个小时后放弃。不要灰心,这是件好事,如果一个游戏想法能存活一夜,第二天想起来还喜欢它的话,也许运气就来了。<br>                警告:在这里我想给读者一个告诫:不要贪多嚼不烂!我已经收到上千封游戏编程新手的电子邮件。这些读者一心想在很短的时间内开发出诸如DOOM或Quake这类高水平的游戏来作为他们的处女作,显然这是不可能的。如果读者在3~6个月内能够完成一个Asteroids的复制品,就是很幸运的了,因此不要狂热。设定一个可行的目标,尝试考虑一些自己能做的事,因为最后可能只有自己在继续工作,别人都离你而去了。另外让处女作游戏的想法简单些。<br>                下面我们进行一些细节工作。</p>            <p><b>设计文档和情节图板</b></p>            <p>  一旦读者有了一个游戏想法,就应当将它落实到纸上。现在,当我进行一个大游戏产品时,需要自己编写一个实际的设计文档,但是对于少数游戏来讲,应当做几页的细节。首先一个设计文档是一个游戏的路标或框架。应当编写能想到的、尽可能多的游戏、游戏等级和游戏规则的细节。这样能知道正在做什么以及能按计划做下去。相反,如果想法一直在变化,那么所做的游戏不连贯。<br>                通常,我喜欢将一个简单的故事写下,开始的一或两页可能描写这个游戏是什么游戏,谁是主角、游戏思路是什么、最后游戏如何攻关。然后我决定游戏的核心细节——游戏等级和规则,列出尽可能多的细节。完成后,就一直进行添加或删除,但至少我有一个工作计划。如果想出了100条很酷的新思路,我能够一直补充它们,而不会忘记。<br>                很明显,细节的数量由读者决定,但是要写下一些东西,至少是一个游戏梗概。例如,可能读者不会连续地考虑一个完整的设计文档,而是一些大致的游戏等级和规则的框图。图1.3是为一个游戏编写的情节图板的例子。没有复杂的细节,只有方便观察和工作的草图。             </p>            <p> <b>使游戏具有趣味性</b></p>            <p>  游戏设计的最后部分是实际校验。读者确信游戏具有趣味性并且人们喜欢它吗?还是在自欺欺人?这是一个严重的问题。大约有10000个游戏被搁置,9900个公司歇业,因此要仔细考虑。如果读者完全为之着迷并不顾一切的想玩这个游戏的话,那么已经大功告成。但是如果读者作为一个设计者对该想法冷淡的话,想像一下如何令其他人来对它感兴趣呢!<br>                这里的关键是进行大量的游戏策划和beta测试,增加各种类型的非常酷的特性,因为这才是令游戏生动有趣的关键所在。这就如同橡木家具上的精美的手工艺品。人们喜欢这些游戏细节。</p>            <p> <b>游戏的构成</b></p>            <p>  现在来看一下一个视频游戏程序和其他各种程序的区别。视频游戏是一种极其复杂的软件,毫无疑问它们也是最难编写的程序。显然,编写MS               Word程序要比Asteroids游戏难一点,但是编写Unreal游戏则要比我所能想像得到的其他任何程序都要难。<br>                这就表示读者应当学习一种新的编程方式,这种方式更有益于实时应用和模拟,而不是读者经常使用的单行的、事件驱动的或顺序逻辑的程序,一个视频游戏基本上是一个连续的循环,它完成逻辑动作,并在屏幕上产生一个图像,通常是每秒钟30幅图或更多,这和电影的放映非常相似。只是读者要按自己的思路创建这个电影。<br>                下面让我们从观察如图1.4所示的简化游戏循环开始,下面对图中每个部分作些说明。</p>            <p><b>第一步:初始化</b></p>            <p>  在这一步中,游戏程序运行的初始化操作和其他程序一样,如内存单元配置、资源采集、从磁盘装载数据等等。 </p>            <p><b>第二步:进行游戏循环</b></p>            <p>  在这一步中,代码运行进入游戏主循环,此时各种游戏动作和情节开始运行,直至用户退出游戏主循环。</p>            <p><b>第三步:获得玩家的输入信息</b></p>            <p>  在这一步中,处理游戏玩家的输入信息并将其储存到缓存以备下一步人工智能和游戏逻辑使用。</p>            <p><b>第四步:执行人工智能和游戏逻辑</b></p>            <p>  这部分包括游戏代码的主体部分,执行人工智能、物理系统和常规的游戏逻辑,其结果用于产生下一帧屏幕图像。</p>            <p><b>第五步:渲染下一帧图像</b></p>            <p>  本步中,玩家输入和游戏人工智能和逻辑执行的结果,用来产生游戏的下一帧动画。这个图像通常放在后备缓存区内,因此无法看到它被渲染的过程。随后该图像被迅速拷贝到显示区中。</p>            <p><b>第六步:同步显示</b></p>            <p>  许多计算机会因为游戏复杂程度的不同,游戏的速度会加快或减慢。例如,如果屏幕上有1000个对象在运行,CPU的负载就比只有10个对象时重得多,因而游戏画面刷新速度也会有所改变,这是不允许的。因此必须确保游戏和最大帧速同步并使用定时器和/或等待函数来维持同步。一般认为30帧/秒是最佳的帧速。</p>            <p><b>第七步:循环</b></p>            <p>  这一步非常简单,只需返回到游戏循环的入口并重新执行上述全部步骤。</p>            <p><b>第八步:关闭</b></p>            <p>  这一步结束游戏,表示用户结束主体操作或游戏循环,返回操作系统。然而,在用户进行结束之前,用户必须释放所有的资源并刷新系统,这些操作和其他软件所进行的相应操作相同。<br>                读者可能对上述游戏操作的细节感到疑惑。诚然,上面进行解释有点过于简单化,但是它突出了如何进行游戏编程的重点。在大多数情况下,游戏循环是一个包括了大量状态的FSM(Finite               State Machine,有限态计算机)。清单1.1是一个相当复杂的C/C++游戏循环实际代码。<br>              <b>程序清单1.1 一个简单的游戏事件循环 </b></p>            <p>  //defines for game loop states<br>                #define GAME_INIT //the game is initializing<br>                #define GAME_MENU //the game is in the menu mode<br>                #define GAME_STARTING //the game is about to run<br>                #define GAME_RUN //the game is now running<br>                #define GAME_RESTART //the game is going to restart<br>                #define GAME_EXIT //the game is exiting</p>            <p>   //game globals<br>                int game_state = GAME_INIT;//start off in this state<br>                int error =0;//used to send errors back to OS</p>            <p>   //main begins here</p>            <p>   void main()<br>                {<br>                 //implementation of main game loop<br>                 while(game_state != GAME_EXIT)<br>                 {<br>                  //what state is game loop in <br>                  switch(game_state)<br>                  {<br>                   case GAME_INIT: //the game is initializing<br>                   { <br>                    //allocate all memory and resources<br>                    Init();<br>                    //move to menu state<br>                    game_state =GAME_MENU;<br>                   }break;</p>            <p>      case GAME_MENU://the game is in the menu mode<br>                   {<br>                    //call the main menu function and let it switch states<br>                    game_state =Menu();<br>                    //note:we could force a RUN state here<br>                   }break;</p>            <p>      case GAME_STARTING://the game is about to RUN<br>                   {<br>                    //this state is optional,but usually used to<br>                    //set things up right before the game is run<br>                    //you might do a little more housekeeping here<br>                    Setup_For_Run();<br>                    //switch to run state<br>                    game_state = GAME_RUN;<br>                   }break;</p>            <p>      case GAME_RUN: //the game is now running<br>                   {<br>                    //this section contains the entire game logic loop<br>                    //clear the display<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -