《游戏脚本的设计与开发》-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

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: jstl-api-1.2.jar是一个JavaServer Pages标准标签库(JavaServer Pages Standard Tag Library,简称JSTL)的API实现。JSTL是用于简化和增强JavaServer Pages(JSP)开发的标签库,提供了一系列标签和功能,使开发者能够更轻松地处理动态网页内容。 在JSTL,标签被用于处理循环、条件判断、格式化和国际化等常见的网页开发需求。jstl-api-1.2.jar包含了JSTL的API接口和类,开发者可以通过导入该jar文件来使用JSTL提供的功能。 使用JSTL可以让网页开发更加简洁和易于维护。通过使用JSTL标签,我们可以将Java代码从JSP页面分离出来,使页面更加清晰和可读。此外,JSTL还提供了一些内置函数和标签,可以帮助开发者处理日期、时间、格式化、国际化等任务,减少了编写重复代码的工作量。 要使用jstl-api-1.2.jar,首先需要将该jar文件添加到项目的类路径,可以通过将jar文件放置在项目的lib目录下来实现。接下来,在JSP页面引入JSTL的命名空间,并使用JSTL标签来处理网页内容。可以在JSTL的官方文档找到详细的使用方法和示例代码。 总而言之,jstl-api-1.2.jar是JSTL标准标签库的API实现,用于简化和增强JSP开发。通过使用JSTL,开发者可以更方便地处理动态网页内容,提高开发效率和网页质量。 ### 回答2: jstl-api-1.2.jar是一个Java标准标签库的核心API库。JSTL代表JavaServer Pages标准标签库,是Java的一个标准规范,用于简化JavaServer Pages(JSP)页面的开发。通过使用JSTL,开发人员可以在JSP页面上使用事先定义好的标签,而无需编写复杂的Java代码。 jstl-api-1.2.jar提供了JSTL标签库的核心功能。它包含了用于数据处理、条件控制、循环迭代和格式化输出等常用操作的标签。通过引入jstl-api-1.2.jar,开发人员可以方便地在JSP页面使用这些标签,从而简化开发流程,提高代码的可读性和维护性。 此外,jstl-api-1.2.jar还提供了一些用于自定义标签的接口和类。开发人员可以使用这些接口和类来创建自己的JSTL标签,以满足特定的业务需求。通过自定义标签,开发人员可以进一步扩展JSTL的功能,使其适应不同的应用场景。 总之,jstl-api-1.2.jar是一个用于JSP页面开发的核心API库,它提供了JSTL标签库的核心功能,帮助开发人员简化开发流程,提高代码的可读性和维护性。通过引入这个库,开发人员可以更加方便地利用JSTL来实现各种常用操作,并且可以通过自定义标签来扩展JSTL的功能。 ### 回答3: jstl-api-1.2.jar是JavaServer Pages标准标记语言(JSTL)的一个API文件。JSTL是一组用于在JSP页面进行逻辑处理和循环控制的标签库。它提供了一些功能强大且易于使用的标签,以简化JSP页面的开发工作。 jstl-api-1.2.jar是JSTL的核心API文件,包含了所有JSTL标签库的定义和相关的类和接口。在使用JSTL时,我们需要在项目引入jstl-api-1.2.jar文件,并将其配置到项目的类路径。 通过使用JSTL,我们可以轻松地在JSP页面进行循环遍历、条件判断、数据格式化等操作,避免了在JSP编写大量的Java代码。JSTL提供了一些常用标签库,比如核心标签库(c标签库)、格式化标签库(fmt标签库)、SQL标签库(sql标签库)等,每个标签库都有一组特定的标签,可以根据需要选择使用。 使用JSTL可以提高JSP页面的可读性和可维护性,减少了在JSP页面编写复杂的逻辑代码的工作量。同时,JSTL的标签库也提供了安全防护机制,可以有效地防止一些安全漏洞,如脚本注入攻击等。 总之,jstl-api-1.2.jar是JavaServer Pages标准标记语言(JSTL)的一个API文件,通过使用JSTL可以简化JSP页面的开发工作,提高代码的可读性和可维护性,并提供一些安全防护机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值