您的位置:首页 > 其它

HowTo如何制作一个文字冒险游戏-里篇(2)逐条解析脚本文件

2017-09-28 13:21 387 查看
作为一个文字冒险游戏,自然不能只有一条脚本,这时候,我们一般将写在文本文件中的内容全部加载,然后在逐条执行。

当一个角色说完话时,总要点击什么一下才能进行下一句。而在显示图片,播放声音,设置变量等时候,我们又希望能够直接执行下一句脚本。在遇到跳转,标签之类的语句,或者注释的时候,又希望在游戏过程中直接跳过,这就需要在分拣脚本类型的时候对它们区别对待。

假设我们指定游戏开始的时候会加载一个名叫main.txt的文件作为第一个脚本。

req= new URLRequest("scenario/main.txt");//加载路径
loader.load(req);
loader.addEventListener(Event.COMPLETE,TXTcompleteHandler);


加载好之后,我们在一个TXTcompleteHandler函数里对脚本进行处理。由于得到的是一个长长的字符串,我们需要按规律把它拆分了再使用。

var arr = new Array  ;//用来储存所有语句的数组
arr= sourceStr.split("\n");//首先通过查找换行符把长串分割


按照交互小说的写作习惯,用户通常会将剧情拆分成多个分值或片段,为了让文本看起来更清晰,在编写脚本的时候如果连一长串的回车都不能输的话,那恐怕就是一件太惨无人道的事情了。所以在获得一串脚本的时候,里面通常都会包含很多空行、注释这类无效的内容,虽然我们有足够的内存可以用,但也没必要留着它们,这时就需要做一些预处理的工作。



将空行和注释等对于引擎来说没有用的内容去掉,把从文本文件中加载的数据现在变成一个干净的脚本数组。

vari = 0;
for(i = 0; i < arr.length; i++)
{
arr[i]= trimspace(arr[i]);
if(arr[i].length <= 1 || arr[i].indexOf("//") == 0)
{
arr.splice(i,1);
i--;
}
}


在制作文字游戏的时候,难免要使用一些条件,跳转等功能,这时总不能每次都在一大堆脚本中查找一遍吧,所以在预处理的时候,要把每个标签和它所对应的行号用一个二维数组或者字典存起来。假设松鼠把标签语句设计成这样:

[label Labelname]
Labelname:标签名,仅在当前脚本文件中起作用。
为了保证游戏流程的正常进行,不能在同一脚本中使用相同的标签名,如果用了的话,只有第一个会起作用。
vargotoArr = new Array  ;//用来存跳转标签和行数的数组
for(i = 0; i < arr.length; i++)
{
//检查当前语句是不是标签类型
arr[i]= arr[i].substring(arr[i].indexOf("["),arr[i].indexOf("]")+ 1);
varstag = arr[i].substring(1,arr[i].indexOf(" "));
//如果是的话,就给它建立索引,取标签名和它所在的行号作为数组存起来
if(stag == "label")
{
varlabelname = arr[i].substring(arr[i].indexOf(" ") +1,arr[i].indexOf("]"));
varar = [trimspace(labelname),i];
gotoArr.push(ar);
}
}




在完成了这些处理之后,终于可以开始逐条处理脚本中的内容了。



由于在游戏中,我们可能会需要在整个脚本中前后跳转,所以当然不能直接将已经执行过的脚本删掉,所以,要先用一个索引来表明脚本现在执行到哪句。

var ti = 0;


在需要执行到某一句的时候,直接对索引的数值进行更改。

例如在执行对话脚本的时候,点击一次屏幕索引+1,遇到跳转语句的时候,在标签数组中找到标签名再给索引赋对应的值,在遇到显示图形的语句时,执行后直接给索引+1。在修改了索引后,就可以调用解析脚本语句的方法对新的语句进行分拣处理了。



扩展阅读:

文字冒险游戏的制作,系列分为表/里两个部分,分别介绍引擎的制作和游戏本身的制作过程。由于当年穷酸的开发者买不起测试手机,于是选择了过气网红flash作为平台,所以这系列文章计划从原理和设计的方面来讲,尽量不牵扯太多语言问题_(┐「ε:)_希望能得到喜欢

在git上查看基于adobe air的整个项目

在blogger提前观看还没来得及写中文版的表篇

示例游戏:
变形金刚同人:逆转执法官2

忍者神龟同人:mntgg
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息