HowTo如何制作一个文字冒险游戏-里篇(2)逐条解析脚本文件
2017-09-28 13:21
387 查看
作为一个文字冒险游戏,自然不能只有一条脚本,这时候,我们一般将写在文本文件中的内容全部加载,然后在逐条执行。
当一个角色说完话时,总要点击什么一下才能进行下一句。而在显示图片,播放声音,设置变量等时候,我们又希望能够直接执行下一句脚本。在遇到跳转,标签之类的语句,或者注释的时候,又希望在游戏过程中直接跳过,这就需要在分拣脚本类型的时候对它们区别对待。
假设我们指定游戏开始的时候会加载一个名叫main.txt的文件作为第一个脚本。
加载好之后,我们在一个TXTcompleteHandler函数里对脚本进行处理。由于得到的是一个长长的字符串,我们需要按规律把它拆分了再使用。
按照交互小说的写作习惯,用户通常会将剧情拆分成多个分值或片段,为了让文本看起来更清晰,在编写脚本的时候如果连一长串的回车都不能输的话,那恐怕就是一件太惨无人道的事情了。所以在获得一串脚本的时候,里面通常都会包含很多空行、注释这类无效的内容,虽然我们有足够的内存可以用,但也没必要留着它们,这时就需要做一些预处理的工作。
将空行和注释等对于引擎来说没有用的内容去掉,把从文本文件中加载的数据现在变成一个干净的脚本数组。
在制作文字游戏的时候,难免要使用一些条件,跳转等功能,这时总不能每次都在一大堆脚本中查找一遍吧,所以在预处理的时候,要把每个标签和它所对应的行号用一个二维数组或者字典存起来。假设松鼠把标签语句设计成这样:
[label Labelname]
Labelname:标签名,仅在当前脚本文件中起作用。
为了保证游戏流程的正常进行,不能在同一脚本中使用相同的标签名,如果用了的话,只有第一个会起作用。
在完成了这些处理之后,终于可以开始逐条处理脚本中的内容了。
由于在游戏中,我们可能会需要在整个脚本中前后跳转,所以当然不能直接将已经执行过的脚本删掉,所以,要先用一个索引来表明脚本现在执行到哪句。
在需要执行到某一句的时候,直接对索引的数值进行更改。
例如在执行对话脚本的时候,点击一次屏幕索引+1,遇到跳转语句的时候,在标签数组中找到标签名再给索引赋对应的值,在遇到显示图形的语句时,执行后直接给索引+1。在修改了索引后,就可以调用解析脚本语句的方法对新的语句进行分拣处理了。
在git上查看基于adobe air的整个项目
在blogger提前观看还没来得及写中文版的表篇
示例游戏:
变形金刚同人:逆转执法官2
忍者神龟同人:mntgg
当一个角色说完话时,总要点击什么一下才能进行下一句。而在显示图片,播放声音,设置变量等时候,我们又希望能够直接执行下一句脚本。在遇到跳转,标签之类的语句,或者注释的时候,又希望在游戏过程中直接跳过,这就需要在分拣脚本类型的时候对它们区别对待。
假设我们指定游戏开始的时候会加载一个名叫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
相关文章推荐
- HowTo如何制作一个文字冒险游戏-里篇(1)
- Bash:如何不用写脚本的情况下建立一个目录,然后在其中生成一组有规律的文件.
- 如何执行一个mysql的sql脚本文件
- 脚本指令《游戏脚本的设计与开发》-第一章 读取和解析一个脚本文件
- cocos2d-x的lua脚本如何加载Cocostudio制作的UI文件
- 如何方便的使用shell脚本来解析xml文件
- HOWTO:如何通过脚本创建一个文件夹的快捷方式
- 如何执行一个mysql的sql脚本文件
- 一个脚本文件的解析
- 如何用busybox制作一个自己文件系统
- 如何执行一个mysql的sql脚本文件
- 教你制作一个脚本(批处理)文件,一次安装所有的XP更新程序
- linux shell脚本如何将文本内容按空格分行、如何使用timit原始corpus制作wav的scp文件
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
- 如何执行一个mysql的sql脚本文件
- 《游戏脚本的设计与开发》-1.1 读取和解析一个脚本文件
- 求如何利用struts2从本地解析一个cvs文件并显示在页面上
- Basic INFO:InstallShield 工程如何制作Network Image安装包(即安装包为一个Setup.exe文件)
- 【脚本】如何在linux shell下面查找 abc开头或xy结尾的文件,只用一个命令
- PHP如何解析一个ini的配置文件?