从一个文字冒险引擎开始
引
文字冒险游戏,顾名思义是以文字为主体的冒险游戏,其体现形式包含交互式小说、养成游戏、恋爱冒险等等。通过文字和音画表现情境戏以软件模拟情境,令玩家使用文字指令控制角色,以影响周边的情境。其运作方式可以理解成是用电脑游戏来做文学叙事。而一个文字冒险引擎,其本质就是设计一种对于用户简单易用的脚本,并将脚本进行解析。
需求分析:
“我要在游戏里说话,然后为了让人知道是我说的,画上面要显示为的名字!”用户兔兔说道。
脚本的设计:
由于文字冒险游戏的本质在于文字,那么设计脚本时就需要综合语言习惯、输入的难度、阅读的美观性等多方面考虑。从编写的容易程度和阅读难度出发,假设我们设计了这样的脚本,它使用txt格式,让基本所有用户都能打开和编辑,再包含几种元素,让用户能够轻松的记住并不容易混淆。
松鼠抱着尾巴思考了一番之后得出了这样的结果:
脚本类型:表明这一行脚本是对话,旁白,头像,播放音效音乐等等
分隔符:表明一段脚本的起止,字段之间的分隔
字段:可以是一段对话,一个角色的名称,立绘出现的位置,图片音乐的地址,根据脚本类型的不同起不同的作用
从最基础的功能,显示对话框开始,我们的脚本是这个样子
[dialogName | Text]
脚本类型是dialog,表示这是一段角色对话。因为脚本类型是能够完全由引擎的开发者指定的,所以松鼠可以随心所欲的用一个特别容易打出来的符号作为分隔符:一个空格。
于是,空格之前的字符串代表脚本类型,之后的字符串代表各种字段的内容。
对话通常需要显示角色的名字和台词,就需要至少两个字段来表明对话的内容。由于表示对话的部分是由用户填写的,我们在分隔符的选择上就需要下一些功夫:既不能在对话中常见,又要是键盘上人们比较熟悉的符号。这里使用了一个单竖线。
松鼠觉得有些用户会希望能在脚本文件里写一些其他的东西,比如标注这段剧本会导致那种结局,这段故事会对整个故事造成什么影响,俗称注释。同时又希望能让用户在普通的文本编辑器里一眼就能把脚本和注释区分开来,于是决定在脚本首尾加上一对方括号,这样,括号里的部分属于脚本,括号外的部分就不再做解析。松鼠对自己的体贴十分满意。
脚本的解析:
对脚本的解析实际就是一个将字符串按一定规则分割,再将分割出的各个部分用在不同位置的过程,在我们已经敲定了分隔符的情况下,只需要使用substring和split函数对其进行处理即可。
在拿到一行脚本的时候,引擎所做的工作就是:
1.找出脚本的类型
2.分拣出不同类型各自做相应的处理
分拣脚本类型需要首先找到方括号并获取括号内的内容。
var sTag = sourceStr.substring(1, sourceStr.indexOf(""));switch (sTag){case " dialog " ://do somethingreturn;}
如果找到的是dialog类型,就取出从分隔符空格开始,到方括号尾端的部分,按照对话框做处理。
var txtScript= sourceStr.substring(sourceStr.indexOf("") + 1, sourceStr.indexOf("]"));
松鼠为对话框脚本设计了两个字段分别表示人名和台词,于是在解析时,需要把它们拆分开来。
var Arr = sourceStr.split("|");txtTalk.Text = ArrT[1];txtName.Text = ArrT[0];
至此,名字和台词可以分别在它们该在的地方显示出来了,用户兔对此满意,并表示下次想到什么功能还来光顾松鼠的洞。松鼠表示并不害怕,因为对于一个新的文字冒险引擎来说,决定了脚本的格式之后,后续的工作都可以顺理成章的开展,于是第二天,用户兔兔背着一大包需求来到了松鼠的洞口。
扩展阅读:
文字冒险游戏的制作,系列分为表/里两个部分,分别介绍引擎的制作和游戏本身的制作过程。由于当年穷酸的开发者买不起测试手机,于是选择了过气网红flash作为平台,所以这系列文章计划从原理和设计的方面来讲,尽量不牵扯太多语言问题_(┐「ε:)_希望能得到喜欢在git上查看基于adobe air的整个项目
在blogger提前观看还没来得及写中文版的表篇
示例游戏:
变形金刚同人:逆转执法官2
忍者神龟同人:mntgg