注意:本系列教程为长篇连载无底洞,半路杀进来的朋友,如果看不懂的话,请从第一章开始看起,文章目录请点击下面链接。
/lufy_legend/article/details/8888787
一,内容预览
算起来,游戏脚本系列文章已经很久没更新了,虽然该系列文章更新缓慢,但是确实还是能够帮到一些朋友,前段时间,仅仅因为做毕业设计通过邮件联系我的就有4位学生。有鉴于此,我还是挤点儿时间来继续慢慢更新一下了。另外,我想再声明一下,目前该脚本引擎还处在移植开发阶段,所以功能优先,其中有大量需要优化的地方还没有处理,所以在手机上测试的时候,在一些性能比较差的手机上,如果效果不太好的话,不要奇怪。本节来介绍一下如何通过脚本来控制正在运行的游戏。一个RPG游戏中会触发各种各样的剧情,让某个人物的动作改变,二,功能屏蔽
正在运行的游戏中,如果没有触发特定的剧情,RPGRunMode.set(1);RPGRunMode.set(0);
参数为1的时候表示功能屏蔽,参数为0的时候表示解除功能屏蔽。首先,在LRPGObject.js中建一个变量
LRPGObject.runMode = false;
默认是false,表示剧情模式没有开启,
/** LRPGRunMode.js**/LRPGRunMode = function(){};LRPGRunMode.analysis=function(value){var start = value.indexOf("(");var end = value.indexOf(")");var params = value.substring(start+1,end).split(",");switch(value.substr(0,start)){case "RPGRunMode.set":LRPGObject.runMode = (parseInt(params[0]) == 1);LGlobal.script.analysis();break;default:LGlobal.script.analysis();}};
然后,在需要屏蔽的功能的代码中,
if(LRPGObject.runMode)return;
三,人物角色移动指令
控制人物角色移动的时候,大致可以分为下面三种情况。・人物角色按照绝对坐标进行移动・人物角色以自己为参照物,按照相对坐标进行移动・人物角色以指定人物为参照物,按照相对坐标进行移动下面一个个来看1,首先看一下[人物角色按照绝对坐标进行移动],//角色ID,坐标x,坐标y,是否等待RPGCharacter.moveTo(2,60,13,1);
先不说这个脚本如何进行解析。首先,
MapController.prototype.characterMoveTo = function(chara,cx,cy,callback){var self = this;chara = self.getCharacter(chara);if(!chara)return;if(chara.hasEventListener(Character.MOVE_COMPLETE)){chara.removeEventListener(Character.MOVE_COMPLETE);}var coordinate = chara.getTo();var fx = coordinate[0] , fy = coordinate[1];var returnList = self.query.queryPath(new LPoint(fx,fy),new LPoint(cx,cy));if(returnList.length > 0){chara.setRoad(returnList);if(callback){chara.addEventListener(Character.MOVE_COMPLETE,callback);}}};MapController.prototype.getCharacter = function(value){var self = this;if(LString.isInt(value)){var childList = self.view.charaLayer.childList,child;for(var i=0,l=childList.length;i<l;i++){child = childList[i];if(value != child.index)continue;return child;}}else if(typeof value == "object"){return value;}return null;};
有了这个函数,解析前面的脚本就简单多了。看下面的解析代码。
LRPGCharacter.moveTo = function (value,start,end){var params = value.substring(start+1,end).split(","), wait;if(params.length == 3){wait = false;}else{wait = (parseInt(params.pop()) == 1);}//params:index,x,yLRPGObject.RPGMap.characterMoveTo.call(LRPGObject.RPGMap,params[0],parseInt(params[1]),parseInt(params[2]),LRPGCharacter.getMoveCallback(wait));};LRPGCharacter.getMoveCallback = function (wait){var lineValue, callback = LGlobal.script.analysis.bind(LGlobal.script);if(!wait && LGlobal.script.lineList.length > 0){lineValue = LMath.trim(LGlobal.script.lineList[0]);if(lineValue.indexOf("RPGCharacter.move") == 0){callback = null;LGlobal.script.analysis();}}return callback;};
上面的LRPGObject.RPGMap.
2,接着看[人物角色以自己为参照物,按照相对坐标进行移动],
//角色ID,相对坐标x,相对坐标yRPGCharacter.move(2,-4,0);
同样,先在MapController中加入相应的函数,
MapController.prototype.characterMove = function(chara,cx,cy,callback){var self = this;chara = self.getCharacter(chara);self.characterMoveToCharacter(chara,chara,cx,cy,callback);};
接下来是脚本解析。
LRPGCharacter.move = function (value,start,end){var params = value.substring(start+1,end).split(","), wait;if(params.length == 3){wait = false;}else{wait = (parseInt(params.pop()) == 1);}//params:index,x,yLRPGObject.RPGMap.characterMove.call(LRPGObject.RPGMap,params[0],parseInt(params[1]),parseInt(params[2]),LRPGCharacter.getMoveCallback(wait));};
效果如下。
3,再看[人物角色以指定人物为参照物,按照相对坐标进行移动]
//移动角色ID,参照角色ID,相对坐标x,相对坐标yRPGCharacter.moveToCharacter(2,1,0,4);
同样,先在MapController中加入相应的函数
MapController.prototype.characterMoveToCharacter = function(chara,toChara,cx,cy,callback){var self = this;chara = self.getCharacter(chara);toChara = self.getCharacter(toChara);var coordinate = toChara.getTo();self.characterMoveTo(chara,coordinate[0] + cx,coordinate[1] + cy,callback);};
脚本解析。
LRPGCharacter.moveToCharacter = function (value,start,end){var params = value.substring(start+1,end).split(","), wait;if(params.length == 4){wait = false;}else{wait = (parseInt(params.pop()) == 1);}//params:index,index2,x,yLRPGObject.RPGMap.characterMoveToCharacter.call(LRPGObject.RPGMap,params[0],parseInt(params[1]),parseInt(params[2]),parseInt(params[3]),LRPGCharacter.getMoveCallback(wait));};
效果如下。
4,多个人物同时移动的时候,脚本如下。
RPGCharacter.move(1,4,0,0);RPGCharacter.move(2,4,0,0);
效果如图。
四,人物角色方向和动作改变指令
通常动作发生改变的时候,有下面两种情况的话,应该就够用了。・人物方向和动作的改变(等待动作结束)・人物方向和动作的改变(不等待动作结束)规定脚本如下。//参数:角色ID,动作,方向(或者角色ID),动作是否循环,是否等待RPGCharacter.changeAction(2,move,up,0,1);RPGCharacter.changeAction(2,move,left,1);RPGCharacter.changeAction(1,stand,2,1);
当第三个参数指定为数值型的时候,表示转向该指定角色。
MapController.prototype.setActionDirection = function(chara,action,direction,loop,callback){var self = this;chara = self.getCharacter(chara);if(LString.isInt(direction)){var toChara = self.getCharacter(direction);var coordinate = chara.getTo();var coordinateTo = toChara.getTo();var angle = Math.atan2(coordinateTo[1] - coordinate[1],coordinateTo[0] - coordinate[0])*180/Math.PI + 180;if(angle <= 22.5 || angle >= 337.5){direction = CharacterDirection.LEFT;}else if(angle > 22.5 && angle <= 67.5){direction = CharacterDirection.LEFT_UP;}else if(angle > 67.5 && angle <= 112.5){direction = CharacterDirection.UP;}else if(angle > 112.5 && angle <= 157.5){direction = CharacterDirection.RIGHT_UP;}else if(angle > 157.5 && angle <= 202.5){direction = CharacterDirection.RIGHT;}else if(angle > 202.5 && angle <= 247.5){direction = CharacterDirection.RIGHT_DOWN;}else if(angle > 247.5 && angle <= 292.5){direction = CharacterDirection.DOWN;}else{direction = CharacterDirection.LEFT_DOWN;}}chara.setActionDirection(action,direction);if(callback){if(loop){callback();}else{var fun = function(){chara.actionObject.anime.stop();chara.removeEventListener(PLETE,fun);callback();};chara.addEventListener(PLETE,fun);}}};
上面的代码并不难理解,
LRPGCharacter.changeAction = function (value,start,end){var params = value.substring(start+1,end).split(","), wait;//params:index,action,direction,loop,waitparams[3] = (parseInt(params[3]) == 1);if(params.length == 4){wait = false;}else{wait = (parseInt(params.pop()) == 1);}params.push(LRPGCharacter.getActionCallback(wait));LRPGObject.RPGMap.setActionDirection.apply(LRPGObject.RPGMap,params);};LRPGCharacter.getActionCallback = function (wait){var lineValue, callback = LGlobal.script.analysis.bind(LGlobal.script);if(!wait && LGlobal.script.lineList.length > 0){lineValue = LMath.trim(LGlobal.script.lineList[0]);if(lineValue.indexOf("RPGCharacter.changeAction") == 0){var start = lineValue.indexOf("(");var end = lineValue.indexOf(")");var params = lineValue.substring(start+1,end).split(",");if(parseInt(params[3]) == 0)return callback;callback = null;LGlobal.script.analysis();}}return callback;};
上面的getActionCallback函数是为了实现同时处
同时控制多个角色的动作的时候,脚本如下。
RPGCharacter.changeAction(1,stand,2,1,0);RPGCharacter.changeAction(2,stand,1,1,0);
效果如下。
五,最后人物角色进入和离开场景的指令
首先规定脚本如下。//人物角色离开场景//参数:角色IDRPGCharacter.remove(2);//人物角色进入场景//参数:角色ID,方向,动作,坐标x,坐标y,是否可控RPGCharacter.add(2,stand,down,52,13,false);
对应的MapController中处理如下,
MapController.prototype.addCharacter=function(index,action,direction,x,y,ishero,callback){var self = this;self.view.addCharaLayer(index,action,direction,x,y,ishero);if(typeof callback == "function")callback();};MapController.prototype.removeCharacter=function(index,callback){var self = this;self.view.removeCharaLayer(index);if(typeof callback == "function")callback();};
在MapView中,加入角色是原来就有的,
MapView.prototype.removeCharaLayer=function(index){var self = this;var childList = self.charaLayer.childList,child;for(var i=0,l=childList.length;i<l;i++){child = childList[i];if(index == child.index){self.charaLayer.removeChildAt(i);break;}}};
这部分的脚本的解析部分尤其简单,加上本节其他代码,
人物角色离开场景效果
人物角色进入场景效果
六,小结
还是我刚开始说的那样,RPG的脚本指令是列举不完的,最后,给出本次的代码下载:
/lufylegend/lsharp/archive/3.8.zip
预告:RPG部分下一节可能会讲一下变量的应用,
《游戏脚本的设计与开发》系列文章目录
/lufy_legend/article/details/8888787
本章就讲到这里,欢迎继续关注我的博客转载请注明:转自lufy_legend的博客/lufy_legend
如果觉得《《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)》对你有帮助,请点赞、收藏,并留下你的观点哦!