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

《游戏脚本的设计与开发》-第二章 文字显示[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多线程...

    flex第一部 源代码(1-17章) 第I部分

    每一章用“Chapter_N”来区分,其中,N代表章的序号,比如Chapter_2/HelloWorld表示的是第二章的示例程序HelloWorld,程序的主程序文件与程序名相同,HelloWorld文件夹下的HelloWorld.mxml即为主程序文件。...

    flex第一部 源代码(1-17章) 第II部分

    每一章用“Chapter_N”来区分,其中,N代表章的序号,比如Chapter_2/HelloWorld表示的是第二章的示例程序HelloWorld,程序的主程序文件与程序名相同,HelloWorld文件夹下的HelloWorld.mxml即为主程序文件。...

    flex第一部 源代码(1-17章) 第III部分

    每一章用“Chapter_N”来区分,其中,N代表章的序号,比如Chapter_2/HelloWorld表示的是第二章的示例程序HelloWorld,程序的主程序文件与程序名相同,HelloWorld文件夹下的HelloWorld.mxml即为主程序文件。...

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

    第二部分 管理工具和用户操作界面  第4章 mysql、mysqladmin和mysqldump  4.1 mysql  4.2 mysqladmin  4.3 mysqldump  第5章 MySQL Administrator和MySQL Query Browser  5.1 安装  5.2 与MySQL服务器...

    嵌入式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多线程使用...

    flex 第一步全书源码

    每一章用“Chapter_N”来区分,其中,N代表章的序号,比如Chapter_2/HelloWorld表示的是第二章的示例程序HelloWorld,程序的主程序文件与程序名相同,HelloWorld文件夹下的HelloWorld.mxml即为主程序文件。...

    嵌入式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多线程使用...

    嵌入式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多线程使用...

    php网络开发完全手册

    13.6.2 第二范式(2NF) 209 13.6.3 第三范式(3NF) 210 13.7 数据库设计的方法与步骤 210 13.7.1 需求分析 211 13.7.2 概念设计的E-R方法 214 13.7.3 数据库的逻辑设计方法 215 13.7.4 物理设计阶段 218 13.7.5 ...

    Java Web程序设计教程

    2.4项目实战——第一个javaee应用:helloworld 28 2.4.1开始创建第一个javaee应用 28 2.4.2熟悉helloworld框架结构 29 本章小结 32 课后练习 32 第3章jsp和servlet 33 3.1开发第一个jsp+servlet应用 33 3.1.1...

    从零开始学JavaScript 源代码

    第二篇 JavaScript进阶篇 第10章 正则表达式 第11章 客户端与服务器端通信 第12章 JavaScript与Ajax技术 第13章 JavaScript错误与异常处理 第三篇 JavaScript实例篇 第14章 JavaScript与插件通信 第15章 JavaScript...

    PHP和MySQL Web开发第4版pdf以及源码

    第二篇 使用MySQL 第8章 设计Web数据库 8.1 关系数据库的概念 8.1.1 表格 8.1.2 列 8.1.3 行 8.1.4 值 8.1.5 键 8.1.6 模式 8.1.7 关系 8.2 如何设计Web数据库 8.2.1 考虑要建模的实际对象 8.2.2 避免...

    ASP API接口和返回的版本

    按照惯例,第一个演示程序几乎总是 HelloWorld,我们也不想打破这个惯例,不过对于 PHPRPC 来说,有服务器端就要有客户端,否则我们就没有什么好演示的啦,所以我们的第一个演示程序实际上是两个,一个是服务器端,...

    PHP和MySQL WEB开发(第4版)

    第二篇 使用MySQL 第8章 设计Web数据库 8.1 关系数据库的概念 8.1.1 表格 8.1.2 列 8.1.3 行 8.1.4 值 8.1.5 键 8.1.6 模式 8.1.7 关系 8.2 如何设计Web数据库 8.2.1 考虑要建模的实际对象 8.2.2 避免保存冗余数据 ...

    PhoneGap Beginner’s Guide

    采取行动的时间 - 用相机的API 191的Hello World 浏览器是不是模拟器或设备198 图像来源199 其他选项199 当我们终于得到一个形象是什么? 200 时间F或行动 - 获取的文件路径显示200 这哪里是形象,反正? 204 原始...

    vc++ 开发实例源码包

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

    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 ...

    JSP API接口和返回的版本

    按照惯例,第一个演示程序几乎总是 HelloWorld,我们也不想打破这个惯例,不过对于 PHPRPC 来说,有服务器端就要有客户端,否则我们就没有什么好演示的啦,所以我们的第一个演示程序实际上是两个,一个是服务器端,...

    PHP API接口和返回的版本

    按照惯例,第一个演示程序几乎总是 HelloWorld,我们也不想打破这个惯例,不过对于 PHPRPC 来说,有服务器端就要有客户端,否则我们就没有什么好演示的啦,所以我们的第一个演示程序实际上是两个,一个是服务器端,...

Global site tag (gtag.js) - Google Analytics