1.1 读取和解析一个脚本文件

上一篇《游戏脚本的设计与开发》-序中我介绍了游戏脚本的基本概念和准备工作,本篇来说说具体如何解析一个脚本

所谓解析脚本,就是按照自己定义的语法,将每一个脚本命令还原成不同的代码逻辑进行执行,比如,我规定绘制一个矩形的脚本

draw rect和一个绘制圆的脚本draw arc那么,当我读取到了字符串“draw rect”的时候,就在屏幕上画一个矩形,读取到了字符串“draw arc”的时候,就在屏幕上画一个圆。如果你已经按照上一篇序中的说明安装了xampp,那么请找到xampp中的htdocs文件夹,在里面新建一个lsharp文件夹,然后再按照下面结构新建一些文件和文件夹lsharp |-script文件夹 |-index.html |-Main.js |-lufylegend.lsharp.js |-lufylegend-1.7.5.jsindex.html文件代码如下<!DOCTYPE html><html><head><meta charset="UTF-8"><title>L#</title></head><body><div id="mylegend">loading……</div><script type="text/javascript" src="./lufylegend-1.7.5.js"></script> <script type="text/javascript" src="./lufylegend.lsharp.js"></script> <script type="text/javascript" src="./Main.js"></script> </body></html>注意:lufylegend-1.7.5.js你需要自己下载。解析脚本,需要建立一个解析脚本的函数analysis,每解析完一个脚本,就返回调用一次analysis函数,让解析不断的进行,直到脚本文件全部解析结束。首先,在lufylegend.lsharp.js文件中新建一个LScript.js类,作为脚本解析对象,用来控制脚本的解析和执行。/** LScript.js**/function LScript(scriptLayer,value){var self = this;LGlobal.script = self;self.scriptLayer = scriptLayer;self.dataList = new Array();var arr=[value];self.dataList.unshift(arr);self.toList(value);}代码解析:LScript.js类接受两个参数,,第一个参数scriptLayer是显示层,也是使用L#脚本制作游戏的最底层画板,之后的脚本命令的所有绘图都将绘制到这个显示层上,第二个参数是一个字符串脚本,也是LScript.js对象被创建后立即会被解析的脚本。LGlobal.script = self;LGlobal.script将脚本解析对象保存起来,方便回调脚本的解析函数。self.scriptLayer = scriptLayer;将显示层保存起来,方便以后使用。self.dataList = new Array();var arr=[value];self.dataList.unshift(arr);保存脚本到缓存数组。self.toList(value);这一行是将整个字符串脚本进行分解,得到单个的脚本命令数组。看一下toList函数:toList:function(ltxt){var self = this;self.lineList = ltxt.split(";");self.copyList = self.lineList.slice(0);self.analysis();}代码解析:self.lineList = ltxt.split(";");在L#中,我设定了各个的脚本指令之间是以分号来分割的,所以使用字符串的split函数对字符串进行分割,得到单个的脚本命令数组,并将其存入到脚本解析对象的lineList。self.copyList = self.lineList.slice(0);copyList用来保存当前所执行的lineList,当有新的脚本命令lineList被添加进来的时候,当前的lineList就会被保存起来,当新的脚本命令lineList全部解析完之后,就会对上一个未被解析完的脚本命令继续进行解析执行。self.analysis();开始解析脚本命令。下面看一下关键的脚本解析函数analysis。analysis:function(){var self = this;var lineValue = "";if(self.lineList.length == 0){self.dataList.shift();if(self.dataList.length > 0){arr=self.dataList[0];self.lineList = arr[1];self.copyList = arr[2];self.analysis();}return;}while(self.lineList.length > 0){lineValue = LMath.trim(self.lineList[0]);self.lineList.shift();}if(lineValue.length == 0){self.analysis();return;}trace("analysis lineValue = " + lineValue);var sarr = lineValue.split(".");switch(sarr[0]){default:self.analysis();}}代码解析:if(self.lineList.length == 0){self.dataList.shift();if(self.dataList.length > 0){arr=self.dataList[0];self.lineList = arr[1];self.copyList = arr[2];self.analysis();}return;}上面代码判断lineList数组内的脚本指令是不是被解析完,如果被解析完了的话,检查一下dataList数组中是否有其他未被执行的脚本,有则继续执行。var lineValue = "";while(self.lineList.length > 0 && lineValue.length == 0){lineValue = LMath.trim(self.lineList[0]);self.lineList.shift();}上面代码用来获取一个lineList数组中的脚本指令if(lineValue.length == 0){self.analysis();return;}如果当前脚本指令为空,则执行下一条指令trace("analysis lineValue = " + lineValue);这行代码用来debug,发布的时候可以不要var sarr = lineValue.split(".");switch(sarr[0]){default:self.analysis();}在L#中,所有被执行的脚本指令,都是[类.命令]的格式,如果你在设定脚本的时候使用了其他格式,则请根据你的格式来做相应的处理。所以使用split函数,对每一条指令进行分割,获取需要的信息,进行解析。接着,我们在Main.js中加入以下代码init(50,"mylegend",400,100,main);function main(){LGlobal.setDebug(true);var sc = "aaa;Load.script(script/Main.ls);bbb;";var sp = new LSprite();addChild(sp);var script = new LScript(sp,sc);}那么脚本解析类会对["aaa;Load.script(script/Main.ls);bbb;"]这个脚本进行解析,里面的脚本指令是我随便写的,并非正确的指令。运行一下代码,

你本地的执行URL为

看看debug函数会输出的信息,如下

爱情使人忘记时间,时间也使人忘记爱情。

1.1 读取和解析一个脚本文件

相关文章:

你感兴趣的文章:

标签云: