一、造个什么游戏
造一个什么样的游戏?如果叫您来答,您会答什么?是角色扮演还是即时战略?对于广大游戏编程爱好者来说,答案肯定会是角色扮演。
那么,我们要造一个什么样的角色扮演型游戏呢?相信这个问题也是毋庸质疑的,大家肯定都会说:“《仙剑》式”。的确,《仙剑奇侠传》自1ArrayArray5年出世以来,在游戏界中已经成了一个不败的神话。
我们也许会问:“谁来打破这个神话呢?”我的答案是:“我们!由我们广大的游戏爱好者来打破。”我和一群同学创立了绝情电脑游戏创作群,从1ArrayArray7年6月开始致力于电脑游戏的制作。我想,正在看这篇文章的您,也许您和我们的“同行”吧? 再问:“打破这个神话要怎么做呢?”首先,我们需要一批工作人员,造一个游戏至少需要以下工作人员:
策划:负责对游戏制作进行策划指导。
编剧:负责游戏的剧本编写。
人物设计:设计游戏中的人物形像。
场景设计:对游戏中的地图、场景、物品进行设计制作。
电脑美工:将设计好的所有图片输入电脑。
动画设计:设计游戏中的各种动画,包括片头、片尾等。
招式设计:根据剧本设计战斗人员的各种招式、法术。
程式设计:负责对游戏中的各种程式进行编写。
地图制作:用设计好的地图编辑器制作游戏中所使用的地图。
脚本制作:根据剧本对游戏情节数据进行编写。
声音制作:录制游戏中所使用的各种音乐及音效。
测试:对制作好的游戏进行各种测试工作。
宣传发行:对测试完成后的游戏进行宣传与发行工作。可以找代理。
这些工作,可以适当的进行兼职。比如策划与程式设计兼职,可别兼职太多哦!
二、游戏策划
策划,是一个游戏创作群(小组、工作室)的总指挥。他将负责整个游戏的具体安排工作,比如开发环境、游戏运行条件、游戏风格、等等工作。要制作一个合格的游戏,如果没有一个好的策划,那么这个游戏可能很难做成。不过一般的小创作群都是策划兼程式设计的,比如我就是。
那么策划要做些什么呢?
确定运行游戏的操作系统。各种操作系统的优缺点见下表:操作系统 优点 缺点 推荐编程语言
DOS系列 直接控制硬件、速度快、编程方便。 对于一些多媒体设备,需要自己制作驱动程序。(显卡按VESA,声卡按SB16进行编程即可解决此问题) WatcomC/C++11.0或更高
Windows3.x
WindowsArrayx 编程与硬件无关,多媒体控制方便。 速度慢,消息式编程不方便,无法直接控制硬件进行快速处理。DirectX太复杂,太慢。 Visual C/C++、Borland C/C++
OS/2 同WindowsArrayx差不多
LinuX系列 网络操作方便,可直接控制硬件、速度快 缺少软件支持,游戏程式源代码开放 情况不明。
UNIX系列 如果你选UNIX,我推荐你换LinuX
MacOS 可以直接控制硬件、编程与硬件无关、可以很方便的控制各种多媒体设备 必须使用Mac系列计算机
FC-OS 日本任天堂公司的家用游戏机平台,编程使用汇编语言。
SEGA-OS 日本世嘉公司的家用游戏机平台,在电脑上使用专门的编程工具进行制作。
PS-OS 日本索尼公司的家用游戏机平台。本站无详细资料。
CPS-OS CAPCOM公司的街机运行平台(大明鼎鼎的《街霸》便出生于此)。本站无详细资料。
NEO-GEO 日本SNK公司的家用游戏机与街机运行平台。本站无详细资料。
有一点请大家注意:不要把游戏的运行机型设的太高。因为现在还不是人人都用PentiumⅢ加Vodoo的时代。
顺便提一句:绝大多数据的电脑玩家很少去理会游戏运行在什么操作系统下,千万不要认为DOS版的游戏就没有人玩了。《侠客英雄传3》和《江湖任我行》不就运行在DOS下吗!。
确定游戏的画面清晰度。
我们将使用标准VGA即可实现的清晰度称为低清晰度;需要SVGA才能实现的清晰度称为高清晰度。画面清晰度见下表:
低清晰度 高清晰度
分辨率 300x200x256、*0x480x16等 *0x480x256、*0x480x65536等代表作 《仙剑奇侠传》 《风云》
优点 数据量少、不分页。显示标准统一。动画速度快、可实现多层卷轴动画。用来做游戏中的片头、片尾动画是再好不过的了。 画面效果好、视角范围大。
缺点 非动画的画面效果很难做好,锯齿明显 数据量太大,显存要分页操作,速度慢。如果不使用VESA则需为每一种显卡编写一种驱动程序。
现在来看,如果要制作一个商业化的游戏,选择低清晰度是不行的。最低也得是*0x480x256色才行。若是编程人员能力不够的话,选择低清晰度也是未尝不可的。比如造一个“《街霸》”,就可以选择320x200x256色的清晰度。
如果选择256色的清晰度,就必须调配一个超级调色板(站长调配了一个,可供下载。1851字节),以适应各种复杂的图片。如果您的编程人员有能力的话,可以选择65536色的清晰度。因为65536色是直接向显存送三原色,可以表现任何颜色。不过编程人员要处理的的数据量比256色大了一倍,显示速度也就只有256色的一半了。
在下自1ArrayArray7年7月以来,一直致力于一个角色扮演型游戏的制作。采用的画面清晰度是800x600x65536色,效果好到极点,速度比 WindowsArrayx下的DirectX还快,放动画每秒种可达42.7帧(酷吧!在下的机型只不过是AMD K5-PR133、内存40、PCI显卡1MB显存、无3D加速卡)。当然就全靠我的Watcom C++版超级图形加速引擎,有兴趣一同制作游戏的朋友们可以与我联系。
确定游戏的画面视角。见下表:视角 代表作 适用游戏类型
2D Array0度直视,也称作横版 《街霸》、《阿猫阿狗》、《江湖》 这一视角的引擎设计简单,可用于制作2D格斗、横版动作类游戏及RPG。
2D 45度俯视 《侠客英雄传3》 这一视角的设计同前一种一样,只是地图要大些。可用于RPG的制作。
2D 斜45度俯视(推荐)
《仙剑奇侠传》、《风云》 这一视角设计比前二种要复杂的多,但是效果可是当今2D游戏中最好的。可用于RPG的制作。
3D第一人称 《Quake系列》3D第三人称 《古墓丽影》
在此,在下向您强烈推荐第三种2D斜45度俯视的设计。虽然设计要麻烦一些,但想一想:如果不用会怎么样?您是选前两种?还是后两种?
确定游戏的画面风格。见下表:风格 代表作 特点
日式 《江湖》、《超时空英雄传说2》 以最少的线条和颜色表现出最好的效果,看起来很像日式漫画。
美式 《暗黑破坏神》、《风云》 立求逼真,远点儿看起来像电影。
中式 《仙剑奇侠传》 此乃日式和美式的融合。不注意时觉得很真实,仔细想一想,不对!
中式漫画 《阿猫阿狗》、《赤壁》 以细腻的线条来表现人物。
确定游戏的操作方法。对于制作RPG游戏,主要有键盘、鼠标和、手柄三种操作方式。在这三种操作方式中,以键盘操作的技术最为成熟,实现最为简单,同样效果也是最好的。所以我推荐您选择键盘操作方案。
到此,我们可以看出。这五种选项中,除了第四个之外。其它四个选项都和程式设计有重大关连,所以您一定要与程式设计人员好好沟通一下。值得庆幸的是,我们的大多数游戏创作群(小组、工作室)都是策划兼程式设计。
三、编剧与脚本制作
编剧在这里的意思是编写游戏所需的剧本。可以是自行创作,也可以拿现成的小说、故事进行改编。对于后者,您可一定要在游戏中注明:“本游戏的剧本作者×××请与本创作群联系,我们保留了您的稿费x元(人民币,如需外汇按当日银行排价计算),请在xxxx年xx月xx日前找本创作群的财务负责人×××领取。”
好了,玩笑开的也差不多了!不过您要是真的拿别人的小说当游戏剧本的话,上面那句话千万不能少。
由于编剧负责的是整个游戏的剧本编写,而脚本制作是负责按剧本编写游戏情节发展的。所以他们的工作是很重要的。想想当年的《仙剑奇侠传》是怎样以情动人的,您就应该知道一个好的剧本对游戏是多么的重要。但是,有了好的剧本并不代表这个游戏就能够打动玩家。脚本制作也是相当重要的。想想当年的《新蜀山剑侠》您就应该知道如果将一个好剧本交给一个水平不高的脚本制作人员的话,那么制作出来的游戏是否依然能够打动玩家呢? 由于编剧和脚本制作的工作几乎是密不可分的。所以我推荐您的创作群(小组、工作室)最好是让编剧去兼任脚本制作,在编写剧本时直接按游戏脚本进行编写。这样即能减去一道工序,同时也能取得十分好的效果。
那么一个游戏的剧本应该怎样编写呢?这个问题我无法说清楚,因为时代在进步,玩家对剧情的要求也越来越高,所以这个问题就让您的编剧自己去想吧!我只能将编剧的要点给您说一下。 在游戏中用来表现人物和剧情的主要是对话,所以在编写剧本时一定要注重人物对话,要用对话充分表现出每个人(起码是主角)的性格和习惯。
根据上一点发展而来,在游戏中要注重的是对人物刻画;而不是战斗动作描写。所以在剧本中,每一场战斗直接写战斗结果即可。
游戏剧本中,没有必要过细的去描写场景、人物外貌、物品形状和人物动作(特殊情况除外,比如打败最终魔头后的一节战斗动画)。这些工作是属于场景设计和人物设计的。
剧本如果是拿别人的小说改编的(比如《西游记》),就一定要尊重原著,对原著中的内容最好不要变动。
如果剧本是根据真实故事改编的(比如《花木兰》),则不但要尊重原著,还要尊重历史。可不能改写历史哦!
如果剧本是根据神话传说改编的(比如《天仙配》),那么就千万不能泄漏时代。如果是有时代的,就一定要注意当时的风俗,否则就是改写历史。注意:泄露时代是多方面的,不光是年号。
如果剧本是自行创作的,千万不要将别人小说或游戏(只限于有著作权的)中的剧情和人物拉进来,不然别人跟你打官司我可不管。
自行创作剧本,如果和已有的故事有联系,最好不要改写原有的内容,包括人物性格和宝物特性等等。比如您在写《后西游记》时,孙悟空的性格可不能和《西游记》中的孙悟空不一样哦!自行创作剧本时,如果使用了真实地名,就要注意真实地理位置和当地的人民风俗习惯。《仙剑奇侠传》就犯了一个严重错误:从杭州去大理应该向西南走,而李逍遥这个大白痴却一直向北走。
自行创作剧本时,要确保不和任何已有的故事发生冲突。更不要把不可能在一起的写在一起。比如在您的游戏出现了诸葛亮(三国时代)巧斗刘伯温(元朝)的场面。专门打乱时空的游戏除外(比如《金庸群侠传》)。
自行创作剧本时,如果把两个毫不沾边的传说或故事联系在一起。就要注意联系一定要得当,否则是要被人笑话的。
自行创作剧本时,如果使用了传说中的人物,一定要注意这些人物是属于那一类传说的(传说人物分类见下表)。如果同时出现了两类或两类以上传说中的人物,则一定要安排好根据,不可乱来,否则是要闹笑话的。传说 代表人物 可以联系在一起的传说
中国上古传说 女娲、盘古 中国道教传说
中国道教传说 玉皇大帝 中国上古传说、佛教传说
佛教传说 西天如来、南海观音 中国道教传说
希腊传说 宙斯、雅典娜
基督教传说 上帝、耶稣
四、美工与电脑美工
美工与电脑美工,同样都是美工,曲别只在于美工是在纸上绘画;而电脑美工是在电脑上绘画的;同样都是绘画,所以我建议您:让您的美工与电脑美工互相兼职。
不管美工与电脑美工是否互相兼职,都有一个问题,那就是:电脑游戏中的画怎么画?一般来说分三步完成:一、由美工人员在纸上画好原画。二、由电脑美工将原画绘制在电脑上。三、由美工指点,电脑美工对电脑上的画作进一步修改。如果您有扫描仪的话,那么就要轻松一些了。
下一步是决定游戏的画面风格。在第二章《游戏策划》里,我们介绍了四种绘画风格,日式、美式、中式和中式漫画。由效果来讲,最好是采用中式。但是有一个问题就是:您的美工和电脑美工有这么高的水平吗?不是我刻意贬低,而是这种画面风格确实太难作到了。所以我推荐您采用中式漫画的画面风格。中式漫画,是由中国的传统漫画和日式漫画融合演变而来的。它的特点是线条细而多、能够充分表现出人物的特点。由于其色彩使用简单明了,所以特别适合高清晰度(*0x480及以上)游戏的制作。但是,由于中式漫画的线条要求细腻、清晰。而且细条的数量明显要比日式漫画多的多(大约在10倍左右)。况且我们的一些“画家”也画惯了日式漫画,所以无形中加大了美工人员的难度和工作量。 这里列举了几条美工和电脑美工人员在绘画时所要注意的要点,请参阅:
日式漫画只要求外形同真实一致,而忽略了立体感;而中式漫画不但要求外形同真实一致,还要求能够通过线条来表现出立体感。所以美工在绘画时一定要注意立体感。
线条要求细腻、流畅。
美工在绘画时要注意,有些绘画手法是不能使用的。比如模糊效果,因为这些效果到了电脑上是无法完成的。
同时美工还要注意到,在绘画时,应尽量保证线条清晰。如果线条不清晰,到了电脑上也是无法完成的。
电脑美工在电脑上绘画时,首先要做到的是图画比例。一般来说,人物宽度与屏幕宽度的比例是1:10,即10个人物正好放满一屏。人物宽度与人物高度的比例是1:5。
人物或物品以及场景的大小比例应和真实世界一致。
电脑美工使用绘画软件绘画时,应在真彩色模式下作图,并将软件的Antialias(锯齿平滑)功能打开。但是,在画一些透明的画时,人物或物品与透明区域交界处的线条在画时应将Antialias功能关闭。
电脑美工将图画画好后,应将画中的部分轮廓线抹去。
不要去力求逼真,因为那样纯粹是自找麻烦。
如果您自己不是一位“画家”的话,可以去找别人帮你画。但是别找的太远,因为那样您对他就很难进行管理。还有最重要的一点,如果您要造商业化的游戏的画,千万不要从别人的游戏中“窃取资源”,后悔药可不好吃哦!
五、程式设计一──选择一种计算机语言(编译器)
选择一种合适您的计算机语言和编译器,这对游戏制作来说可是相当重要的。如果在游戏制作到半中央发现这一语言编程不方便或编译器不好,岂不让人伤心。所以在造一个游戏前一定要选择好编程语言和编译器。
我作为同行,当然要向您推荐最好的语言与编译器了,请看下表:
语言 编译器 优点 缺点
DOS C/C++ Borland C/C++ 相当普及,学习简单。编程简单,出错少。 16位程序、速度慢、有*0k基本内存限制。
HIGH C/C++ 速度快、性能好。 难学、太专业化。
Microsoft C/C++ 16位程序、速度不是很快、有*0k基本内存限制。太专业化。
DJGPP+Allegro 速度快、多媒体游戏库丰富,非常适造游戏。 不好学,帮助少。速度不如Watcom C/C++快。
Watcom C/C++ 速度最多、性能优越。 较专业化、不好学。
WindowsArrayx Basic Visual Basic 学习简单、编程方便。 太慢。……
C/C++ Borland C/C++
Borland C++ Builder
Visual C++
Microsoft C/C++
Watcom C/C++
Pascal Borland Pascal
Borland Delphi
游戏工厂
其代表作如下:
Borland C/C++ for DOS《仙剑奇侠传》
DJGPP+Allegro《雷神之锥(Quake)》DOS版(唯一一个出了名的)
Watcom C/C++ for DOS《三国演义》、《超时空英雄传说》、《金庸群侠传》、《红色警报》、《古墓丽影》,真多呀!还有一大堆呢!
Visual Basic《仙剑奇侠传──九八柔情版》(我都想不到)
Borland C++ builder《风云之天下会》
可以看到:在DOS下,Watcom C/C++可以说是一统天下。在WindowsArrayx下,在这些C/C++中您随便选一种就可以了。可我完完没有想到:《仙剑奇侠传──九八柔情版》“居然”是用Visual Basic编的,真是出人意料。
我们也可以看出,大部分的游戏都是用C/C++编写的。这可能已经成了一个不得不让人承认的事实,起码现在来说“想编写一个好游戏,必须用C++”。
在DOS下编写游戏的朋友,最好去找些有关VESA显示标准和SB16声卡的编程资料。这样一来,Windows的最大优势──与硬件无关性,就没有了。您可尽情发挥DOS下编程可直接控制硬件的乐趣,那种感觉真是棒极了。
在WindowsArrayx下编写游戏的朋友,最好去下载一份DirectX SDK,再找些有关DirectX编程的资料。虽然Microsoft提供的DirectX SDK库中有DirectX编程的示例程序,但按Microsoft的惯例来说,这些示例程序应该是很难看懂或根本看不懂才对(并非玩笑)。
这一章不长,朋友们快去找资料吧!下一章我将告诉您游戏大概分几个模块,最好学一下C++的类哦!
六、程式设计二──是面向对象还是面向过程
这一章,看题目应该知道,这是一个比较重要的选择。
面向对象,是近几年来新兴起的一种编程手段。由于其在Windows系统的帮助下迅速崛起,成为明日之星的可能性与日俱增。照理说,面向对象的编程手法的确要比面向过程的手法要先进的多。然而,面向对象的编程也有着它的致命弱点。就拿C++在WindowsArray8下编游戏来说:如果以面向对象的形式进行编程的话,那么在游戏运行时,程序自动创建的类将会变的非常多。而且在进行消息循环时,有大部分的运行时间是掌握在Windows系统手里。这将会大大影响游戏的运行速度,《风云》就是一个很好的例子,在一台Pentium133上玩《风云》慢的就像乌龟,而相同清晰度的《大富翁Ⅳ》在这一机型上却奔跑如飞。当然,你也可以在你的游戏配置中标明“本游戏最低配置为PentiumⅡ300+*MB内存”
如果一个游戏以面向对象形式编程的话,那么它用到的类将会有成百上千个。此时如果将这一游戏以面向过程的形式重新编写的话,那么它用到的类不会超过20个(Windows下的游戏不会超过100个)。如此多的类当然会将游戏的速度降到很慢。
当然,我不是故意贬低面向对象的编程手段。面向对象的编程手段用来编写应用软件那将是上上之选,而用来编游戏可就有些不如面向过程了(现在)。
下面我们以在面向过程的编程手法说明一下在一个角色扮演型游戏中所需要的模块(类)。
游戏内部所用模块
游戏外部所用工具
图片管理器
地图编辑器
动画编辑器
人物信息管理器
物品信息管理器
剧情脚本编辑器
音乐管理器
声音管理器
在上表中,左边的结构图是一个角色扮演型游戏中至少要用到的模块(类),右边的是你自己所要用到的几个工具。这些模块和工具在一个游戏中可以说是必不可少的,有些编程人员喜欢将这些所有的模块和工具造在一些,便出现了所谓的调试模式。其实这是一个很不好的习惯,因为一个游戏本来就是一个很大的程序集合。光是游戏本身所必须的模块就已经使游戏程序变得很大了,如果再加上一些对玩家来说没有用的工具,那你想想:这个游戏程序会变得多么大。所以我认为游戏模块应与工具完全分开。 下面按步骤讲一下每个模块与工具的工作范围。
显示控制:对显示器、显示卡进行管理,负责初始化显示模式及画面的高速显示。提供基本的操作函数,有画点、画垂直线、画水平线、画空心矩形、画实心矩形这几个函数即可。再提供几个特殊处理的函数,比如淡入淡出、屏幕闪烁等。
字符管理:故名思义,管理对字符的显示操作。负责读取字库,并使用显示模块提供的基本操作函数显示字符。(如果您觉得在显示字符上也要提高速度的话,那么您可以将字符管理模块和显示控制模块编写到一块,在显示字符时搞直接写屏。能提高字符显示速度15%)
窗口控制:别理解错了,这一模块主要用于在游戏中菜单、选择项、提示信息的显示。
图片管理:这一模块按每个人游戏的习惯不同分为两类:
一、有些人造游戏没有图片管理模块,而在窗口控制、人物管理、物品管理、地图控制、动画控制这几个模块中各自建立相互独立的图片库。这样做的好处是每个图片库相互独立,不会混淆。坏处是必须给以上每个模块都配备一个图片管理模块,使游戏程序变大。而且每个图片库之间的图片不能互相调用,有时会造成不必要的浪费。
二、我推荐使用第二种方法:只造一个图片管理模块,将所有的图片(动画图片可以除外),包括提示图像、人物、物品、地图及其它图像均放于一个图片库中。好处是减少了图片控制模块,而且一个图片可以供多个模块调用。
动画控制:很好理解的,控制动画的吗!
地图控制:一定要注意,这一模块只负责管理地图库、组建地图,但并不负责显示地图。
人物管理:管理每个人物的信息(不包括对话信息)。
物品管理:管理每个物品的信息。
音乐管理:管理所有的音乐及其播放,音乐文件一般使用MIDI格式,如果你水平高点可以使用MP3格式。
声音管理:管理所有的声音及其播放,声音文件是WAV和VOC格式任选。
剧情控制:最大、最难、最复杂的一个模块。管理其它的全部模块,负责整个游戏的剧情发展。
战斗控制:负责站斗啦!
自己用的工具吗,介绍一下:
图片管理器:负责管理图片库,要求可以随意加入、删除图片,为图片库建立索引以便游戏调用。
地图编辑器:编辑地图用的吗!用它来造地图,然后形成专用的文件格式。
动画编辑器:造动画用的,如果懒的造动画那就算了。
人物信息管理器:编辑人物信息的工具。
物品信息管理器:编辑物品信息的工具。
剧情脚本编辑器:又是最大、最难、最复杂的一个,用来编写剧情文件用的。
音乐管理器:管理音乐库的工具。
声音管理器:管理声音库的工具。
看完了,是不是要趴下了!没事,慢慢来吗!一个人造个游戏最快也要2年!
程式设计三──显示方面的程式设计
上一章里,我们说明了作为一个游戏的程式设计所需要完成的工作。在这一章,我们将有关图形方面的程式设计内容详细给大家说一下。
首先申明一下,无论您的游戏采用那一种清晰度,本文所说的内容都适用于您。
一、2D驱动程序
如果是编写WindowsArrayx下游戏的话,2D显示驱动程序的代表作主要有Microsoft公司推出的DirectX中的DirectDraw和SciTech公司的WinDirect、MGL。
在DOS 下就显得有些问题,现在市面上的显示卡类型非常多,如果我们给每一个显卡都编写一个驱动程序的话,那恐怕是相当困难的。再说我们也不可能拥有每一种显卡的详细资料。幸好在各种SVGA显示卡出现不久,由各大厂家联合推出了一个VESA标准。现在的显卡几乎可以说是全部都只持VESA标准。所以,我们只要按VESA标准进行显示卡编程,就可以获得最大的兼容性。
二、3D驱动程序
编写3D游戏的话,3D驱动程序接口无非就是OpenGL和Direct3D两种。如果你想编写Windows下的游戏的话,那么选择那一个都一样。如果编写DOS游戏的话,使用OpenGL当然不会错。
注:由于3D游戏所涉及的范围较大,所以在以后我们将不讨论3D游戏的制作。
(到SciTech公司的网页上去转转,这个公司提供的WinDirect、MGL开发库提供了完整的2D与3D支持(DOS/WindowsArrayx),而且还提供了DOS下的OpenGL 3D引擎)注:MGL开发库同时有DOS版和WindowsArrayx版。
三、无规则图片库的管理
这里所说的图片库包含了整个游戏所使用到的任何图片,想必您也可以猜到,这个图片库将会变得相当大。如何管理这样一个数据量极大的图片库,成了现在的首要问题。
游戏中所使用的图片有大有小,也就是说,图片库中的图片数据长度不固定。这也为我们管理图片库增加了难度。
图片管中的图片位置是无规律的,但是我们可以建立一个有规律的索引表来管理这个图片库。因为每个图片的索引长度是一样的,也就是说是有规律的。这样一来,管理就容易多了。
索引文件的基本结构如下:
文件头,图片个数,第1个图片在图片库中的地址,……,最后一个图片在图片库中的地址
图片库的基本结构如下:
文件头,第1个图片的数据,……,最后一个图片的数据
然而,就算是这样,整个图片库的管理仍然不方便。比如说有一张图片的编号是105,而在中途我们删除了第85张图片。当下次再调用第105张图片时,就会发现调用的是原来的第106张图片。为了解决这个问题,我们将索引文件的结构改进如下:
索引结构:
struct PicIdx
{
char PicName[10]; //图片名称
unsigned int high,width; //图片大小
unsigned long offset; //图片在图片库中的地址
};
图片索引文件结构:
文件头,图片个数,第1个索引(PicIdx),……,最后一个索引(PicIdx)
可以看出,我们为索引增加了一个项目:图片名称。这样做的好处是,我们在调用图片时,可以按图片名称进行调用。以后无论是增加还是删除图片库中的图片,都可以保证图片调用正确。
四、有规则图片库的管理
有规则图片库相对于无规则图片库来说管理起来就要方便的多了。这里说的有规则是说每一个图片的大小都一致,也就是说数据长度都一致。这样的图片库最点型的就是人物图片库,以人物图片库为例,图片索引文件结构如下:
文件头,图片个数,第1个人的姓名,……,最后1个人的姓名
五、对话框的处理
在游戏中,对话框是少不了的,特别是角色扮演型游戏。对话框的主要类型有:菜单、信息显示框、逻辑选择框、多项选择框、买卖物品框、人物信息框等等。在这一点上,设计者可以按自己的意欲随意设计。不过要注意的是风格要保持一致。
从下一章开始,将细致讲述有关显示方面的程式设计,分别是《图片库的压缩保存》、《虚拟屏幕的编程》、《地图引擎的制作》、《屏幕特殊效果的处理方法》。
程式设计四──图片库的压缩保存
我们知道,随着游戏画面清晰度的不断提高,游戏所占用的硬盘空间也在不断增大。为此,我们有必要将有些大容量的数据做压缩保存,图片库就是一个很好的例子。
首先要谈到的就是压缩算法问题,现在的压缩算法很多,选择那一种好呢?大家一定会想到在网页上常用到的JPEG格式和GIF格式,但是这两种算法都不适合在游戏中使用。就游戏开发来说,我们必须选择一种压缩率高、解码速度又快的算法。如果采用JPEG无损压缩算法,那么压缩率就不高,采用有损压缩的话虽然压缩率很高但在游戏中图像是不能有所损坏的。还有,JPEG算法的一个最大缺点就是解码速度太慢。GIF算法性能很高,压缩率高解码又快,只可惜它不能压缩超过256色的图像。但如果您做的游戏是256色的话,那么使用GIF算法是再好不过的了。
如果您的游戏画面采用了真彩色或您想将图像压缩的再好一点,那么无疑您得自己研制一套压缩程序。这里,我为大家提供了两个方案:
方案一:采用LZSS或LZH压缩算法。
方案二:使用它方提供的压缩程序。这个程序是本人在网络上无意发现的,使用非常方便,而且它不是压缩文件而是压缩内存中的数据又存放在内存中,所以非常适合在游戏中使用。唯一的缺陷就是压缩率不是非常高。
以上两方案的源程序和开发包均可在资源下载处下载,方案二开发包名称为DCL压缩软件开发包。
程式设计六──地图引擎的制作
地图,在角色扮演型游戏中也称作场景,是整个游戏中最重要的部分,制作方法也是最难的。按地图组成方法的不同,大致可分为两种:
第一种:拼图式,以《仙剑奇侠传》为例。
著名的角色扮演型游戏《仙剑奇侠传》对地图的制作方法可以说是相当落后的了,但却是十分实用的。左边的这幅图片绿色为透明部分,红色为图像部分。《仙剑奇侠传》的地图(静态部分)就是由许许多多的这种图片拼凑而成的,排列形式如右图所示。
这种方法的好处是对内存的使用量少,读盘时间少,处理速度快。但它的缺点也是十分明显的,开发者必须将图片用专用工具分解成一个个如左图式的地图元素放入图片库中,且这一图片库不能被其它模块使用。
前面说了,这种方法虽然落后,但却十分实用。不过要生成效果更好的地图,还是使用后面的两种方法为好。
第二种:图片式,以《轩辕剑三》(尚未推出)为例。
《轩辕剑三》的地图在所有的角色扮演型游戏中效果可谓一流的,整个画面浑然一体,丝毫看不出地图元素组合的痕迹(如下图)。
为什么DOMO小组能够做出效果如此之好的画面呢?原因很简单:《轩辕剑三》的静态地图是非组合而成的,使用的是已经绘制好的图片。
直接使用图片真的行吗?当然不行,DOMO小组也不会认为就此便可以战胜同门师兄《仙剑奇侠传》。它还使用了另一个先进技术──即时光影效果。
即时光影效果在3D游戏中很容易实现,而在2D游戏却非常难,几乎可以说是无法办到。那么怎样办到呢?这里我们暂时不考虑光线效果,只考虑影子。我介绍一种很弱智的办法:假设阳光是从上方照下来的,那么人的影子是椭圆形就可以了。可惜即使是这样也无法达到很好的效果,解决的办法也非常简单:将椭圆形影子设定成黑色,然后与地表进行50%融合处理。但有一点要注意,根据游戏清晰度的不同,融合的方法也不一样。这一点我将放在下一章《屏幕特殊效果的处理方法》里为大家讲述。
这种方法的好处不必说了,效果是所有方法中最好的。那它的坏处呢?想必不说大家也知道了,占用的硬盘空间、内存空间太多,地图装入慢。
第三种:组合式,以《剑客》(本创作群制作,尚未推出)为例。
这种方法是我自己想出来,我们创作群自行开发的游戏《剑客》便是使用的这种方式。别人是否在我之前使用过,我不知道。
这种方法是将场景所需的各种图片,如草坪、花瓶、树木、椅子之类,按照一定的层次进组合。组合完成后便成了玩家所看到的地图,其效果也非常好,次于第二种方式,但优于第一种。由于其制作技术复杂,所以这里不便于介绍。
当然这种方式也有它的缺点:占用内存空间过大,地图装入速度很慢。
大体上的地图使用方式就只有这三种了,下面我列一个表供大家参考:
地图方式
装入速度
占用硬盘空间
占用内存空间
拼图式
快,但由于地图要进行组合所以不是很快 少 少
图片式
慢,数据量很大所以慢 很多 很多
组合式
很慢,数据量不但很大而且地图进行组合的过程也很复杂 很少 很多,虽然装入速度最慢,但地图组合完毕后占用的内存量和图片式一样多
程式设计七──屏幕特殊效果的处理
这一章的内容很多,希望大家注意看。
两幅图像的融合
真正的两幅图像融合的实现方法并不复杂,但是如果不使用MMX技术的话,速度会非常慢。为了加快速度,这里提出一种快速的伪融合方法。速度很快,但只能进行50%的融合处理。
我们假设一幅图片被扎了很多孔,只要这些孔即多又分布均匀,我们就可以看清楚在这幅图片的后面是什么了。想必大家也想出来是什么方法了。假设我们要将图一与图二进行融合,我们可以做如下处理。x,y分别表示行坐标与列坐标。
步骤一:显示图像一,但只显示(x%2)=(y%2)的点。注:x%2表示求X除2的余数。
步骤二:在同一位置显示图像二,但只显示(x%2)!=(y%2)的点。注!=表示不等于。
只此两步,两幅图像的融合就完成了。
瞧见左边的这幅灰色图块了吗,其实它是由黑色和白色两种颜色进行上述融合后的产物。让我们将它放大4倍再看看吧(右图)。
人物影子的即时生成
想必很多程序员都为此问题烦脑过,其实很简单。我这里有一个解决办法,同“云风”工作室的解决办法一样。即采用即时生成的办法,生成的效果很不错。此时,我们设阳光从西南方照下,即影子在人的东北方。 步骤一:将原人物图像非透明部分全部变黑。
步骤二:将变黑后的图像高度压缩当原来的25%。
步骤三:再将图像右倾45度。
经过以上三步,一个影子便完成了。如图所示。
■原人物图像
■全部变黑后的图像
■高度压缩四分之三后的图像
■右倾45度后的图像,即为生成的影子
在游戏中,直接将处理成的影子先于人像这前显示出来,显示时与背景进行50%融合。然后再显示人像。
--------------------------------------------------------------------------------
斜视角游戏中全屏雨雪效果的实现
即使将地上铺满雪花,也比不上天上飘下两朵雪花那么让人感动。这是笔者在云风工作室读到的一句话。此话得确不错,可惜雪花并不那么容易就会飘下来。
其实在非斜视角游戏中,全屏雨雪效果很容易实现。只是在斜视角游戏中不容易实现。这里介绍一种方法可以在斜视角游戏中实现全屏雨雪效果。
不知大家会不会用3DS MAX,不会用可糟了,我们这里要用到它。使用3DS MAX的粒子系统生成一幅全屏雨雪下落的动画,当然不要忘了将视角旋转一下以便同游戏中一致。然后将3DS MAX的渲染功能关闭,再生成连续的单幅图像就可以供游戏使用了。
--------------------------------------------------------------------------------
隔行抽丝
隔行抽丝一般用在动画上,使用的目的是为了减少占用的空间。一般来说,隔行抽丝是在屏幕上显示时,屏幕上的单数行或偶数行没有内容。
假设原本的图像或动画大小是800x600,经过隔行抽丝后,在显示时的大小就是800x300。所以在保存时我们可以将图像或动画保存成800x300的,这可谓正宗的隔行抽丝了,可惜效果不好。其实,我们只要将图像或动画保存成400x300的就可以了。在显示时将宽度放大一倍,不但节省了硬盘占用空间,而且效果很不错。不过会使装入速度减慢,但也不失为良策。
我另有一个建议,隔行抽丝一般是使用在动画上的。如果使用隔行抽丝技术,将画面保存成400x300,显示时不但会使动画装入速度减慢,而且效果远不如隔行抽丝前的好、播放的速度也快不了多少。我认为,使用隔行抽丝技术在800x600显示模式下播放400x300的动画,还不如直接将显示模示动态的改为400x300。不但效果很好,而且在速度上比使用隔行抽丝技术要快的多。反正是放动画,在切换显示模式时的屏幕闪烁也并不要紧。
(有一个事实,在《超时空英雄传说Ⅱ复仇魔神》中,是将动态的将显示模式由*0x480切换为320x240放动画的。而在《超时空英雄传说Ⅱ外传北方密使》中,是使用的隔行抽丝技术播放动画的)
--------------------------------------------------------------------------------
16位增强色显示模式下的淡出处理
淡入淡出,想必各位同行、玩家不会不清楚。在256色等使用调色板的游戏中,淡入淡出的实现非常简单,直接修改调色板就可以了。在24位或32位真彩色显示模式下,虽不使用调色板,但实现也很简单,直接修改显示的数据就可以了。但毕竟24位或32位真彩色显示模式使用的不多,而渐渐被使用的是16位增强色显示模式。在16位增强色显示模式下,由于它并不使用调色板,所以要实现淡入淡出也必须直接修改显示数据。
但由于在16位增强色显示模式下,三原色数据被段存放在二个字节中。如果不使用MMX技术,在操作时必须按位分解出来才能进行操作,但这样必定会使操作速度变慢。云风提意将每个点的数据扩展成32位再进行操作,但速度也不会很快。
这里,我提出一种方法,自行测试效果不错,速度也不慢。但是很不容易说清楚,列个表给大家看吧!将纯白色变成纯黑色。
数据说明:1111111111111111,左边16位数据中,0-4位(占5位)表示红色,5-10位(占6位)表示绿色,11-15位(占5位)表示蓝色。
步骤 数据 解释说明
1 1111111111111111 原本数据
2 1111111111011111 将绿色第六位变成0,由于绿色多一位,所以先写它
3 1111011111011111 将红色第五位变成0
4 1111011110011111 将绿色第五位变成0
5 1111011110011110 将蓝色第五位变成0
6 1110011110011110 将红色第四位变成0
7 1110011100011110 将绿色第四位变成0
8 1110011100011100 将蓝色第四位变成0
Array 1100011100011100 将红色第三位变成0
10 1100011000011100 将绿色第三位变成0
11 1100011000011000 将蓝色第三位变成0
12 1000011000011000 将红色第二位变成0
13 1000010000011000 将绿色第二位变成0
14 1000010000010000 将蓝色第二位变成0
15 0000010000010000 将红色第一位变成0
16 0000000000010000 将绿色第一位变成0
17 0000000000000000 将蓝色第一位变成0
无论显存中的数据是什么,我们都按这个顺序将16位数据均写入0便完成了淡出的效果。