作者DreamYeh (天使)
看板GameDesign
标题[程式] 如何设计冒险游戏 (Adventure Game)
时间Sat May 27 19:57:32 2006
如何设计冒险游戏 (Adventure Game) DreamYeh
----------------------------
主旨:
敝人梦想一直都是让所有人都轻易学习如何设计游戏,本篇
文章会大致上讲解冒险游戏(Adventure Game)如何被设计出来
,以及更重要的,一个冒险游戏编辑器的撰写。
期盼企划人员看了本篇,能更了解如何剧情游戏的剧本观念
,也期盼想设计剧情游戏的人看了本篇,能不藉由任何工具就设
计出一个好玩的剧情游戏来。
敝人也会在之後设计个冒险游戏编辑器。并释放出原始档来
,让大家能真正看到冒险游戏的实际设计面貌,也可以藉由编辑
器简单设计出游戏来!让设计游戏的高门槛不在是高门槛!
本篇文章大多是用敝人观点去想,一套AVG该怎麽设计,
或许跟实际设计法会有差距,或许哪里没有想到。若件到哪里有
不足的,或有额外想法的,欢迎大家讨论。
本篇文章也特别感谢子商的亲切的建议。
现在,就让我们开始AVG设计的旅程。
----------------------------
主题一、什麽是冒险游戏(AVG)?
别紧张,本篇并不会花很大篇幅去说明什麽是AVG。与其
看大篇幅介绍,你还不如去找几套经典的AVG来尝试一下,举
凡无人岛之旅、金田一 悲报岛新的悲剧、 或是一些网路上很容
易就玩到的电子小说。这些都是很经典的AVG-我们可以这样
给AVG简单定义。
AVG是偏重剧情的游戏,它一定有个复杂的剧情(不会像
是超级玛莉那样只是要救公主的故事),常以大量文字来表示,
玩家可以做的动作大多是要在几个剧情分支点,去做出选择,不
同的选择会导致不同结果。
它与RPG一个很大差异在於,RPG通常会把视点拉到世
界上方,好让玩家可以自由操作角色,在一张大地图上四处打怪
、冒险。AVG通常会省略升级模式、在地图上跑来跑去的活动
,而更重视於剧情的描写、角色心境描写、情境述说等。
依照这样定义,AVG范围可是很广泛喔!举凡电子小说、
一般常见恋爱游戏、一些电影改编游戏、网路上常可以下载到的
小游戏如逃离房间系列,都可以列入这个范畴。
当然这个定义也非完全的,近代也越来越多游戏根本分不出
它的类型。当然啦~这里不是要来跟大家讨论游戏分类理论的,
我们大致了解什麽是AVG就好了。
----------------------------
主题二、分歧点
让我们一窥AVG最重要的因子,分歧点。也就是玩家可以
选择一个分歧点,就走向某个剧情。比方说玩家可以选择要走楼
梯还是走电梯、看见一个房间门可以选择要不要去开启他。
当然也有AVG完全没有分歧点,像是电子小说,你只要滑
鼠原地按按按就可以看到剧情不断被推进,直到结束。但基本上
两者的设计原理还是一样的(当然啦,电子小说是更简单的)。
而这个分歧点概念,就构成整个AVG基本设计模型,如下
:
C .....
↗
B→D .....
↗
A→E→F .....
其中每个字母都代表一个「剧情」,而那个剧情里面就会有
我们想要秀的文字、场景、音乐、想要出现的人物、它们的对话
等等。
以程式观点,要架构这部分的决策性结构是很直觉的,你可
以轻易用一个变数表示现在应该秀出什麽场景、展示什麽变数。
然後用一个Switch或if指令让程式知道你该做什麽。
AVG的要点,就在於设计这些剧情、回答选项、还有每进
入一个新剧情想要做的动作。
----------------------------
主题三、事件与变数
假设现在,你已经开始游戏,并在某个分支点中选择了你要
走向什麽剧情,可是你要怎麽让游戏知道你现在在哪个剧情中呢
?
又,接着你可能在某个剧情里,发生一个事件,比方说捡到
一把钥匙好了-那你要知道你得到一把钥匙呢?
唯一的办法,就是利用一个变数来储存。
对於没程式经验的人,变数这个辞可能会有点难理解。其实
你可以想像这个世界有个记事官,它有本簿子专门在记载「什麽
事情发生了、什麽事情没发生」。比方说你今天看到一笔钱,你
可以选择捡,它就会记载「你捡了钱」-由於它只看得懂数字,
它可能在某个栏位记载1,你若没捡钱它就会在那个栏位记载为
0。
接着世界(程式)就会根据你记载的变数,去做相对应的变
化。
以程式的观点来看,这些动作就是「发生个事件、玩家做出
什麽选择、就着就要改变某个『变数』」,我们通常称这些变数
为旗标(Flag)。
整个AVG设计模型,就会被简化为对这些旗标的操控、以
及针对旗标不同做出的决策机制。
----------------------------
主题四、剧本
让我们喘口气,继续回来看这个AVG最重要的构成因子-
剧本。
一个剧本应该有哪些东西?这当然要随着你的游戏内容有所
改变了-一个经典剧本里面通常有这些东西-
场景-发生某个剧情时候,它的背景图片是什麽?有什麽样
的动画?比方说如果你描写某剧情发生在日落时候,
你背景可能是一片黄昏晚霞。
人物-在这个场景中出场的人物,在大多AVG里面它通常
以角色的图片来表示。而人物出场的型态,很常见到
的一种形式就是一个图片的飞入。
选项-需要让玩家选定的选项,比方说是捡起、开启一个东
西与否。内容可以是文字、或是图片。
文字-这里包括上述场景的文字描述、现在剧情的描写、主
人翁们的心境描写、还有人物们的对话。
当然很多人会更希望每个人物都有专属的对话框
音乐-当然啦,到某个场景,你一定会有希望播送的音乐。
动画-这是一个高级而普遍的要求!有些人很希望场景中能
加入一些复杂的动画,比方说男女主角对话时候整个
场景就飘满着樱花啊、或是主角在雪原漫步时候飘落
着漫天飞雪。
以程式观点来说这部分是最复杂的,你将会发现你可
能花更多的时间在於把某个场景的动画弄得更漂亮。
而那些动画对玩家来说可能只是小小的服务。因此我
们在实践这部分,通常是用外挂方式来处理。
----------------------------
主题五、剧本的资料结构
想像你已经定义好一个剧本模型了,接着麻烦的就是,你要
让程式看懂这个剧本。
可是如同我们前面所述,程式这家伙是很笨的!它只看得懂
数字!也就是什麽栏位是什麽数字时候,程式该做些什麽。就好
像我们前面举例的一本簿子一样。
而储存这些数字的栏位、格式,我们就称之为 资料结构。
如果你还是不懂,那我们可以再举个例子-你可以想像你手
上有一本书,这本书每一页都是记载各种「剧情」,那剧情怎麽
被记载?
必定是这本书每一页都有一个「统一」的栏位,比方说第一
栏纪录着现在是什麽场景、第二栏位纪录着现在拨放着什麽音乐
。
而玩家可以做出各式各样选择,让某些栏位变成特定的值,
而程式本体就像一个帮你翻书的人,它会根据一个特定的指示帮
你把书翻到某一页-
比方说第十栏位是1的时候就翻到第8页这样。
而第十栏位很可能记载着你刚刚做的决定,比方说开门就让
该栏位写成1、开窗就写成2。
你可以想像整个AVG就好像你在看一本书,有个翻书员、
说书人、以及一个记事官。翻书员会引导你走向某一页剧情(这
就是我们刚刚提的主题2)、说书员会告诉你这一页剧情在说些
什麽、而记事官就随时用这些栏位记载现在故事进行模式。
好,让我们回到主题,记载方式。以这个例子我们可以看到
我们显然需要一个统一的结构,来记载现在各式各样的事物。你
可能会问为何强调需要统一格式-你可以想想看如果不同一格式
会发生什麽样的错误。(再次强调你遇到那个翻书员可没这麽聪
明)
而这些固定的栏位结构,我们称之为容器,或资料结构。以
上面举的剧本格式为例,它可能需要以下格式来储存。
typedef struct Drama
{
struct Drama *NextPage[3]; //纪录下一页要翻到哪里
char *Load_Music; //要读入的音乐档名
char *Load_Image; //要读入的图片档名
char *Text_Story; //故事文字
char *Text_Menu; //选项文字
};
好吧,如果是非程式人员,可能看不懂上面表达的型态,
其实,这里只有第一项翻的页数是使用指标型态来指到下一个
要翻到的页码在哪里。其他一律都是用字串来表示。
----------------------------
主题六、剧本的演算法
好,现在你已经有本记载各式各样剧情的簿子了-现在,你
还需要一个帮你翻簿子的人-玩家可不愿意自己去根据那些复杂
的资料结构自行判断要翻到哪一页去。
如何设计这位帮你翻簿子的人呢?我想这部分是相当直觉的
!使用if..else、或是switch机制。你可以根据每个剧情不同的
旗标、玩家做出的选择,去判断下一个要指向的页码在哪里。
接着要解决的问题,就剩下如何载入那些资料结构,让画面
显示某张图片、播送哪首音乐、以及显示哪些文字了。这部分有
相当多函式库可以支援。
若以BCB或 .Net设计,更有元件可以直接拨放音乐、显示图
片!
如此一来,在搭配刚刚的资料结构,一个AVG就这样设计
出来了!!
在此我们举个程式例子:
void AVGMain(Drama *TempDrama)
{
int Next_Page; //定义下个要翻到的页数
while (TempDrama!=NULL)
{
AVGShow(TempDrama); //秀出音乐、图片、文字
AVGEventExe(TempDrame); //引导剧情
Next_Page = AVG_Next(TempDrame); //找寻下一页要跳到哪’
TempDrama = TempDrama.NextPage[Next_Page]; //跳页:)
}
}
----------------------------
主题七、剧本编辑器
旅行到这..如果你是个企划组人员,你一定会上述两个核心
主题头大到不得了吧。
你甚至可能抱怨:「弄了半天~我还是不懂怎麽写嘛!」
但你要知道,了解上面讲述的概念对你来说还是很重要的。
或许你看不懂程式码部分,但相信这些概念对於你设计一套游戏
-或许藉由任何工具,是大有帮助的。
一些程式组成员可能也会发现,我故意漏讲一些概念,像是
指标,甚至我还有偷用到 Link List,这些有趣的资料结构对於
储存剧本有多大帮助。不过在这里为了普遍性我想还是给大家自
行研究。:P
那回归我们本意,既然我们是希望每个人都可以简单学会游
戏设计-那上面讲的所有专业知识,你都可以忘掉了-不过你切
记你还是要了解他基本概念是什麽-
接着你可能就会希望,有个能人能设计出个简单的AVG设
计引擎,来帮助不懂程式的你怎麽写AVG来!
简单的AVG编辑器?这当然是有可能的!甚至是最容易实
现的游戏编辑器。典型的AVG编辑器有恋爱游戏设计大师、吉
里吉里、和EAVG。
简单来说就是避开让企划人员接触到程式码的可能,藉由一
些虚拟码、甚至是一些介面,让企划人员可以简单制作AVG。
所谓虚拟码是什麽?它就是一个专门给程式看「现在要做什
麽」的代码。
以吉里吉里为例,它底层程式架构为TSJ语法,那是一个
类似JavaScript的程式语言。但由於一般人学习该语法仍有门槛
,因此他又有一个 KAG虚拟码把 TSJ包起来。
比方说我们可以定义<I>代表显示某张图片、<S>代表拨放某
首音乐,<T>代表显示一段文字,并在一定时间後消去。
那企划组人员要写一段剧情,它就可以这样写:
<I>Angel_At_Snow.jpg</I>
<S>Angel's Song.mp3 </S>
<T>他伫立在一片雪白的远野,四周都是白的</T>
<T>他的衣服是白的,背後的翅膀也是白的</T>
<T>轻飘飘的羽毛好像跟瑞雪融合,倘佯在一片白色的无尽里...</T>
这对企划组来来说,可以说是大大节省的他所需要付出的心
力和学习时间,只要透过简单的语法,就可以轻易交代现在剧本
内容、以及要表现出来的场景。
那他程式方面设计原理是什麽?
其实也很简单,就是一个帮助企划组人员把上述虚拟码转化
成程式码,在帮助他们把程式码编译出来的步骤。
比方说上述虚拟码,转换成程式可能是这样的:
#include <MyLibary.h> //我们可能会大幅简化显示图片和音乐的过程
//因此,你必须写一些函式库,然後包进来
Image_Main->LoadFromFile("Angel_At_Snow.jpg");
Form->Music->LoadFromFile("Angel's Song.mp3");
Memo1->Lines->Append("他伫立在一片雪白的远野,四周都是白的");
Memo1->Lines->Append("他的衣服是白的,背後的翅膀也是白的");
Memo1->Lines->Append("轻飘飘的羽毛好像跟瑞雪融合,
倘佯在一片白色的无尽里...");
接着就在编译成可以执行的执行档就好了。中间当然别忘了
Link你的函式库。因为你在转化虚拟码为实际程式码过程中。
很有可能被迫省略一些步骤,比如说图片特效处理,那些东
西对企划人员来说可能只是一行-
OB
<A> "满天飞雪的动画" </A>
而这些对你来说很有可能其实是一大串的程式码。因此你必
须额外写函数库,以便企划人员可以更简单地写出他的游戏来。
你们两个互相合作,他贡献他的编剧能力、你贡献你的程式
技术,一个游戏,就这样诞生了!!!
----------------------------
结语:
终於到结语了!松了口气吧!经过这次旅程,我们从AVG
基本概念说起,讨论他分歧点概念、事件概念、剧情概念,并简
单提及AVG的资料结构与演算法。
後面我们特别介绍了如何去撰写一个AVG编辑器。这里目
的就是希望让游戏设计门槛更降低!让游戏设计更普及!希望大
家看完本篇文章,能得到些什麽启示,也欢迎大家针对本篇文章
内容继续进行讨论!
之後敝人也会投入去撰写个免费的、公开原始码的AVG编
辑器,期盼让更多人能加入游戏设计行列,让一群人一起追逐梦
想!
若你跟敝人有着共同的理想,希望创造出个大家的游戏、能
被大家共同设计的游戏、为了大家而发展出的游戏。也欢迎你跟
敝人联络~
希望能跟大家一起筑梦!一起设计出好玩得游戏来!
----------------------------
--
— 游戏设计团队等待你的加入与支持:
/\●/\ )) http://220.132.66.21/phpbb2/portal.php
(( / /▲\ \ PTT GameDesign板 PTT2 DreamYeh板 欢迎你圆梦
\\ 巴哈姆特好像才是我大本营XD~让我们一起
Kuso吧
想了解更多DreamYeh吗?欢迎来无名
P_DreamYeh板
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.66.37.44
1F:推 Achillean:天使大出一系列不同类型的文章吧!让我们比较之间差异 05/27 20:12
2F:推 wandererc:一定要推的啦~~~~ 05/27 20:11
3F:推 wandererc:真的好期待天使的AVG编辑器面世~不过其实我没有给过什麽 05/27 20:15
4F:→ wandererc:意见耶^^"||||放在文章最前面真是害我不敢转了XD" 05/27 20:15
5F:推 lvboo:SourceSDK感觉不错 有好的工具蛮重要的 05/27 20:31
6F:推 izsoak:总之先推一个,不知道为什麽在进来之前有种这篇一定是讲美式 05/27 20:52
7F:→ izsoak:AVG的刻板印象,结果发现是讲日式AVG时吓了一跳@@ 05/27 20:53
8F:推 wandererc:美式AVG可没那麽好做,而且几乎都是3D为主流了... 05/27 20:57
9F:→ wandererc:其实主要是天使被我拐来研究AVG的关系XDDD" 05/27 20:59
10F:推 elfria:天使一出手..便知有没有 05/28 01:10
11F:推 fumizuki:推 05/28 13:41
12F:推 angelasuka:天使大耶~~ 05/29 01:41
13F:推 DreamYeh:刚看欧美系AVG,蛮重视玩家动作部份..设计难度就高了点.. 05/29 11:30
14F:推 DreamYeh:不过理论上分歧点和以剧本为元素两个思维还是可以使用的 05/29 11:31
15F:推 DreamYeh:只是还要加入脚色贴图判定就是了:) 05/29 11:32