《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)
注意:本系列教程为长篇连载无底洞。半路杀进来的朋友,假设看不懂的话。请从第一章開始看起。文章文件夹请点击以下链接。
http://blog.csdn.net/lufy_legend/article/details/8888787
一,内容预览
本次先来实现一下几个游戏指令,以后会再进行扩展。
二。功能屏蔽
RPGRunMode.set(1);
RPGRunMode.set(0);
LRPGObject.runMode = 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;
三,人物角色移动指令
//角色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,y
LRPGObject.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;
};

//角色ID,相对坐标x,相对坐标y
RPGCharacter.move(2,-4,0);
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,y
LRPGObject.RPGMap.characterMove.call(LRPGObject.RPGMap,params[0],parseInt(params[1]),parseInt(params[2]),LRPGCharacter.getMoveCallback(wait));
};

//移动角色ID,參照角色ID,相对坐标x。相对坐标y
RPGCharacter.moveToCharacter(2,1,0,4);
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,y
LRPGObject.RPGMap.characterMoveToCharacter.call(LRPGObject.RPGMap,params[0],parseInt(params[1]),parseInt(params[2]),parseInt(params[3]),LRPGCharacter.getMoveCallback(wait));
};

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(LEvent.COMPLETE,fun);
callback();
};
chara.addEventListener(LEvent.COMPLETE,fun);
}
}
};
LRPGCharacter.changeAction = function (value,start,end){
var params = value.substring(start+1,end).split(","), wait;
//params:index,action,direction,loop,wait
params[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;
};

RPGCharacter.changeAction(1,stand,2,1,0);
RPGCharacter.changeAction(2,stand,1,1,0);

五,最后人物角色进入和离开场景的指令
//人物角色离开场景
//參数:角色ID
RPGCharacter.remove(2);
//人物角色进入场景
//參数:角色ID。方向,动作,坐标x。坐标y,是否可控
RPGCharacter.add(2,stand,down,52,13,false);
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.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;
}
}
};


六。小结
https://github.com/lufylegend/lsharp/archive/3.8.zip
《游戏脚本的设计与开发》系列文章文件夹
http://blog.csdn.net/lufy_legend/article/details/8888787
《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)的更多相关文章
- 纸牌游戏CardBattle的设计与开发
- 使用 Unity 3D 开发游戏的架构设计难点
Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛.但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D ...
- MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)
由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)
人工智能(AI)中往往都会有这么一个问题,那就是我要做什么?我该怎么做?我需要什么?所以这里所谓的智能就是赋予AI对象的判断力,以及它根据判断得到的相应反应.就好比,你去商店买东西,钱够别人才卖给你, ...
- 游戏UI框架设计(一) : 架构设计理论篇
游戏UI框架设计(一) ---架构设计理论篇 前几天(2017年2月)看到一篇文章,国内王健林.马云等大咖们看好的未来十大最有"钱途"产业中,排名第一的就是"泛娱乐&qu ...
- 游戏UI框架设计(三) : 窗体的层级管理
游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...
- Hbase 设计与开发实战
Hbase 概述 大数据及 NoSQL 的前世今生 传统的关系型数据库处理方式是基于全面的 ACID 保证,遵循 SQL92 的标准表设计模式(范式)和数据类型,基于 SQL 语言的 DML 数据交互 ...
- 游戏UI框架设计(二) : 最简版本设计
游戏UI框架设计(二) --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状 ...
随机推荐
- css 引入方式
css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负责页面样式. JS:JavaScript .从交互的角度描述页面行为 CS ...
- 证明,为什么HBase在创建表时,列簇是必须要,列可不要?
若是删除不存在的列修饰符,看下会是什么情况 package zhouls.bigdata.HbaseProject.Test1; import javax.xml.transform.Result; ...
- vue vuex初学基础 常见错误解决方式
前端界面使用篇 vue生命周期初始化事件 http://www.cnblogs.com/lily1010/p/5830946.html 常见错误篇 1 Newline required at end ...
- Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)
Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...
- cannot connect to host的解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 下午更新源码,出现下面的错误: 通过ping来测试svn服务器的连接,发现可以连接得通,于是猜测可以服务器的svn服务 ...
- HTML 5的基本标签
1. 文件开始标签<html> 在任何的一个HTML文件里,最先出现的HTML标签就是<html>,它用于表示该文件是以超文本标识语言(HTML)编写的.<html&g ...
- 水仙花数------"水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。(for循环的嵌套)
package com.zuoye.test;//打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,//其各位数字立方和等于该数本身.//例如: ...
- (2)dotnet开源电商系统-brnshop VS nopCommerce(dotnet两套电商来PK--第二篇:代码从哪开始-BrnMall3.0Beta)
看大牛们的源码,对于水平一般的人,还是略微有点难度的.我从我自身读码的亲身体验,写下杂散片语,希望能和大家一同进步,也为了日后记忆上的备查. 先看的是brnMall的源码结构,从哪看起呢? 首先推荐看 ...
- Typeclassopedia
https://wiki.haskell.org/wikiupload/8/85/TMR-Issue13.pdf By Brent Yorgey, byorgey@gmail.com Original ...
- Lost connection to MySQL server at 'reading authorization packet', system error: 0_Mysql
1.大多数时候设置"set global connect_timeout=60:"是可以解决问题的. 我们可以通过执行“SHOWSTATUS LIKE 'aborted%'”,可以 ...