`
252190908
  • 浏览: 227157 次
文章分类
社区版块
存档分类
最新评论

《游戏脚本的设计与开发》-1.2 文字显示[Hello world]

 
阅读更多

上一章介绍了如何读取和解析一个脚本,

其实,对于一个游戏来说,文字的显示和操作是最基本的组成元素之一,本章进入正题,就先从文字显示开始讲解一下。

显示一个文字,就是将文字绘制到游戏界面上,而在lufylegend.js引擎中,要显示一个文本,只需要将LTextField对象添加到LSprite对象之上。

首先,为了便于操作游戏中的所有对象,我们来新建一个“仓库”LScriptArray,用于保存游戏中各种对象,如下。

/*
* LScriptArray.js
**/
function LScriptArray(){
	var self = this;
	self.textList = new Array();
	self.layerList = new Array();
}
其中textList用来保存LTextField文本对象,layerList用来保存LSprite层对象,当然游戏中的对象种类肯定不止这么几个,比如图片,按钮等,这些对象等以后的章节中会陆续添加。

修改一下LScript类的构造器,如下

function LScript(scriptLayer,value){
	var self = this;
	LGlobal.script = self;
	self.scriptLayer = scriptLayer;
	self.scriptArray = new LScriptArray();
	self.scriptArray.layerList["-"] = scriptLayer;
	self.dataList = new Array();
	var arr=[value];
	self.dataList.unshift(arr);
	self.toList(value);
}
这样,我们就可以通过LGlobal.script.scriptArray获取到游戏中的所有对象了。

在L#脚本中与文字操作相关的脚本语法如下

1,添加一行文字

Text.label(-,txt01,Hello World,0,0,30,#000000);
几个参数如下:

显示层,文字名称,文字内容,文字坐标x,文字坐标y,文字大小,文字颜色
2,改变一行文字的内容

Text.labelChange(txt03,Hello Change,40,#FF0000);
几个参数如下:
文字名称,文字内容,文字大小,文字颜色
3,移除一行文字
Text.remove(txt02);
参数如下:

文字名称

接着,修改解析函数中的switch部分,如下

switch(sarr[0]){
	case "Load":
		ScriptLoad.analysis(lineValue);
		break;
	case "Text":
		ScriptText.analysis(lineValue);
		break;
	default:
		self.analysis();
}
这样的话,遇到文字操作相关的脚本的话,就会调用ScriptText静态类的analysis函数。

下面看一下ScriptText类和analysis函数

/*
* ScriptText.js
**/
var ScriptText = function (){};
ScriptText.analysis = function (value){
	var start = value.indexOf("(");
	var end = value.indexOf(")");
	switch(LMath.trim(value.substr(0,start))){
		case "Text.label":
			ScriptText.label(value,start,end);
			break;
		case "Text.labelChange":
			ScriptText.labelChange(value,start,end);
			break;
                case "Text.remove":
                        ScriptText.removeText(value,start,end);
			break;
		default:
			LGlobal.script.analysis();
	}
};
在这个函数里,遇到我定义的三个脚本的时候,就会通过调用三个不同的函数,并将脚本括号内的部分作为参数来进行解析,我们来一个个的实现这几个函数。
首先是ScriptText.label,如下

ScriptText.label = function (value,start,end){
	var script = LGlobal.script;
	var lArr = value.substring(start+1,end).split(",");
	var layer,label,i;
	var layerStr = lArr[0];
	var nameStr = lArr[1];
	var textStr = lArr[2];
	layer = script.scriptArray.layerList[layerStr];
	var textArr = textStr.split("\\n");
	var textList = new Array();
	for(i=0;i<textArr.length;i++){
		label = new LTextField();
		label.size = lArr[5]-4;
		label.color = lArr[6];
		label.text = textArr[i];
		label.x = parseInt(lArr[3]);
		label.y = parseInt(lArr[4]) + label.getHeight()* i ;
		label.name = nameStr;
		layer.addChild(label);
		textList.push(label);
	}
	script.scriptArray.textList[nameStr] = textList;
	script.analysis();
};
来解释一下上面的代码:
var lArr = value.substring(start+1,end).split(",");
将参数分解到lArr数组。
var layerStr = lArr[0];
var nameStr = lArr[1];
var textStr = lArr[2];
这样就从lArr数组中得到了相应的参数。
layer = script.scriptArray.layerList[layerStr];

得到显示层,在这里只支持“-”这个参数,就是最底层,后面会详细讲解显示层脚本,支持其他参数。

var textArr = textStr.split("\\n");
var textList = new Array();
for(i=0;i<textArr.length;i++){
	label = new LTextField();
	label.size = lArr[5]-4;
	label.color = lArr[6];
	label.text = textArr[i];
	label.x = parseInt(lArr[3]);
	label.y = parseInt(lArr[4]) + label.getHeight()* i ;
	label.name = nameStr;
	layer.addChild(label);
	textList.push(label);
}
这里是考虑到换行的问题,在设置文字内容的时候,可以使用“\n”来换行。在这里将分割后的字符串用一个个的LTextField对象显示出来,然后将这些LTextField对象压入数组中。

script.scriptArray.textList[nameStr] = textList;
script.analysis();
将存有LTextField对象的数组保存进script.scriptArray.textList数组中,最后再调用script.analysis()继续进行解析。

接着是ScriptText.labelChange,如下

ScriptText.labelChange = function (value,start,end){
	var script = LGlobal.script,i;
	var lArr = value.substring(start+1,end).split(",");
	var nameStr = lArr[0];
	var textStr = lArr[1];
	var textList = script.scriptArray.textList[nameStr];
	var x = textList[0].x;
	var y = textList[0].y;
	layer = textList[0].parent;
	for(i=0;i<textList.length;i++){
		label = textList[i];
		label.parent.removeChild(label);
	}
	textList = new Array();
	textArr = textStr.split("\\n");
	for(i=0;i<textArr.length;i++){
		label = new LTextField();
		label.size = lArr[2];
		label.color = lArr[3];
		label.text = textArr[i];
		label.x = x;
		label.y = y + label.getHeight()* i ;
		label.name = nameStr;
		layer.addChild(label);
		textList.push(label);
	}
	script.scriptArray.textList[nameStr] = textList;
	script.analysis();
};
解释下代码

var lArr = value.substring(start+1,end).split(",");
var nameStr = lArr[0];
var textStr = lArr[1];
这个跟前面一样,是获取参数。

var textList = script.scriptArray.textList[nameStr];
用传入的文字名称来得到保存在script.scriptArray.textList数组中的LTextField对象组。

var x = textList[0].x;
var y = textList[0].y;
得到LTextField对象的坐标。

layer = textList[0].parent;
得到LTextField对象的显示层。
for(i=0;i<textList.length;i++){
	label = textList[i];
	label.parent.removeChild(label);
}
为了改变文字内容,我先将被添加的LTextField对象删除。

textList = new Array();
textArr = textStr.split("\\n");
for(i=0;i<textArr.length;i++){
	label = new LTextField();
	label.size = lArr[2];
	label.color = lArr[3];
	label.text = textArr[i];
	label.x = x;
	label.y = y + label.getHeight()* i ;
	label.name = nameStr;
	layer.addChild(label);
	textList.push(label);
}
script.scriptArray.textList[nameStr] = textList;
script.analysis();
添加的LTextField对象已经被删除,剩下的就是按照新的文字内容重新添加LtextField对象,所以上面的代码和添加文字是一样的。

最后,再看看ScriptText.removeText,代码如下
ScriptText.removeText = function (value,start,end){
	var lArr = value.substring(start+1,end).split(",");
	var nameStr = lArr[0];
	var script = LGlobal.script;
	var textList = script.scriptArray.textList[nameStr];
	if(textList == null){
		script.analysis();
		return;
	}
	for(i=0;i<textList.length;i++){
		label = textList[i];
		label.parent.removeChild(label);
	}
	script.scriptArray.textList[nameStr] = null;
	script.analysis();
};
删除对象比较简单,和前面ScriptText.labelChange函数中移除部分是一样的。

下面看一下效果如何,

修改Main.ls脚本文件的代码,如下

Text.label(-,txt01,Hello World,0,0,30,#000000);
运行代码,效果如下:

显示多个文字的话,修改Main.ls脚本文件的代码,如下

Text.label(-,txt01,Hello World,0,0,30,#000000);
Text.label(-,txt02,Hello World,0,50,30,#000000);
Text.label(-,txt03,Hello World,0,100,30,#000000);
运行代码,效果如下

下面看看如何修改文字内容,修改Main.ls脚本文件的代码,如下

Text.label(-,txt01,Hello World,0,0,30,#000000);
Text.label(-,txt02,Hello World,0,50,30,#000000);
Text.label(-,txt03,Hello World,0,100,30,#000000);
Text.labelChange(txt03,Hello \nChange,40,#FF0000);
运行代码,效果如下

最后,看看改变删除文字对象,修改Main.ls脚本文件的代码,如下

Text.label(-,txt01,Hello World,0,0,30,#000000);
Text.label(-,txt02,Hello World,0,50,30,#000000);
Text.label(-,txt03,Hello World,0,100,30,#000000);
Text.labelChange(txt03,Hello \nChange,40,#FF0000);
Text.remove(txt02);

运行代码,效果如下


测试连接如下

http://lufylegend.com/demo/test/lsharp/02/index.html

本章为止的lufylegend.lsharp.js源码如下

http://lufylegend.com/demo/test/lsharp/02/lufylegend.lsharp.js

《游戏脚本的设计与开发》系列文章目录

http://blog.csdn.net/lufy_legend/article/details/8888787


本章就讲到这里,欢迎继续关注我的博客

转载请注明:转自lufy_legend的博客http://blog.csdn.net/lufy_legend

分享到:
评论

相关推荐

    嵌入式Linux程序设计案例与实验教程-实例代码

    实验2.2 Makefile与helloworld19 2.3 Linux多线程库编程21 2.3.1 多线程21 2.3.2 Linux下的多线程21 2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程...

    系统学习TCL脚本入门教程

    系统学习TCL脚本入门教程 1 TCL语法 1.1 简介 作为脚本语言,tcl语法简单而功能强大。它诞生于80年代初,进入中国的时间也许多年了。不过关于tcl的资料多而杂,一时心血来潮,想到写一篇文章,以例子为中心,系统...

    MySQL 5权威指南(第3版) 中文版 下载地址

     18.2 Hello,World  18.3 与MySQL服务器建立连接  18.4 执行SQL命令  18.5 处理二进制数据和特殊字符  18.6 出错处理  第19章 Visual Basic 6/VBA  19.1 基础知识和术语  19.2 Connector/ODBC选项 ...

    精通JS脚本之ExtJS框架.part2.rar

    《精通JS脚本之ExtJS框架》由浅入深地讲解了ExtJS在Web开发中的相关技术。本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    实验2.2 Makefile与helloworld19 2.3 Linux多线程库编程21 2.3.1 多线程21 2.3.2 Linux下的多线程21 2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用...

    ORACLE SOA 11g 环境搭建手册 for Linux

    文档控制 ii 1. 准备篇 2 1.1. 软件准备 2 1.2. 硬件准备 2 1.3. 操作系统平台 2 1.4. 安装VMware6.5 2 ...7.3. 开发一个Hello World 53 7.4. 部署Hello World 58 8. 未结与已结问题 65 未结问题 65 已结问题 65

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    实验2.2 Makefile与helloworld19 2.3 Linux多线程库编程21 2.3.1 多线程21 2.3.2 Linux下的多线程21 2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用...

    精通JS脚本之ExtJS框架.part1.rar

    《精通JS脚本之ExtJS框架》由浅入深地讲解了ExtJS在Web开发中的相关技术。本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    实验2.2 Makefile与helloworld19 2.3 Linux多线程库编程21 2.3.1 多线程21 2.3.2 Linux下的多线程21 2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用...

    iuhyiuhkjh908u0980

    Buildfile: G:\eclipseEjb3\Ejb_HelloWorld_02\build.xmlprepare: [mkdir] Created dir: G:\eclipseEjb3\Ejb_HelloWorld_02\buildcompile: [javac] Compiling 3 source files t ... by caizhongda 2009-02-28 回复 ...

    禅道自动化测试框架ZenTaoATF.zip

    ZenTaoATF是由禅道开发团队开发的自动化测试框架,它只有一个脚本文件,可以支持各种脚本语言编写的自动化测试脚本,语法简单,使用灵活,后续会和禅道项目管理软件进行绑定和集成。 它的基本工作原理如下: 首先,...

    Node.js 开发指南.pdf

    3.1.1 Hello World 24 3.1.2 Node.js命令行工具 25 3.1.3 建立HTTP服务器 26 3.2 异步式I/O与事件式编程 29 3.2.1 阻塞与线程 29 3.2.2 回调函数 31 3.2.3 事件 33 3.3 模块和包 34 3.3.1 什么是...

    php网络开发完全手册

    13.7 数据库设计的方法与步骤 210 13.7.1 需求分析 211 13.7.2 概念设计的E-R方法 214 13.7.3 数据库的逻辑设计方法 215 13.7.4 物理设计阶段 218 13.7.5 数据库的实施阶段 218 13.7.6 数据库的运行和维护阶段 218 ...

    Java Web程序设计教程

    1.2使用java开发web应用 3 1.2.1面向对象的编程语言 3 1.2.2丰富的框架技术 4 1.2.3xml、css的应用 4 1.2.4使用javascript与ajax提升用户体验 7 1.3多种集成开发环境 9 1.3.1集成开发环境简介 9 1.3.2web应用...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    Mastering Web Application Development with AngularJS

     Hello World——AngularJS示例  双向数据绑定  Angular JS中的MVC模式  鸟瞰  深入作用域  视图  模块与依赖注入  模块  协作对象  注册服务  模块的生命周期  模块依赖  1.3 AngularJS和其他框架  ...

    深入浅出ExtJS第2版

    1.4 Hello World 2 1.4.1 直接使用下载的发布包 2 1.4.2 在项目中使用EXT 3 1.5 为什么页面提示"找不到图片" 3 1.6 辅助开发 4 1.6.1 调试工具Firebug 4 1.6.2 开发利器Spket 7 1.7 本章小结 10 第2章 EXT...

    IDA.Pro代码破解揭秘part1

    9.9.1 Hello World插件 191 9.9.2 find memcpy插件 194 9.10 间接调用插件 209 9.10.1 收集数据 210 9.10.2 用户接口 211 9.10.3 实现回调 213 9.10.4 显示结果 215 9.11 插件开发和调试策略 250 9.11.1 ...

    Ext 开发指南 学习资料

    1.6. 入门之前,都看helloworld。 1.6.1. 直接使用下载的发布包 1.6.2. 只把必要的东西放进项目中 2. 震撼吧!让你知道ext表格控件的厉害。 2.1. 功能丰富,无人能出其右 2.2. 让我们搞一个grid出来耍耍吧。 2.3. ...

    magento开发教程

    5.1配置资源,修改Helloworld模型的config.xml: 38 5.2创建资源类文件: 39 5.3创建安装脚本 39 5.4资源版本 40 5.5解剖配置脚本 42 5.6模块升级脚本 43 5.7总结 45 6.高级Magento模型EAV 45 6.1什么是EAV模型? ...

Global site tag (gtag.js) - Google Analytics