《游戏脚本的设计与开发》-1.4 图片的读取显示

本章来实现一下如何用脚本来读取一张图片,将其显示到画面中,并且对图片进行一些缓动变换等操作。

本章预备实现一下几个脚本

/*
游戏脚本的设计与开发 第四章
*/
//读取图片数据
Load.img(backdata,lufy_legend.jpg);
显示图片
Img.add(-,backimg01,backdata,0,0,100,100,1);
对图片进行缓动操作
Img.transition(backimg01,{x:350},1,Strong.easeOut);


1,如何读取一张图片

看下面脚本

/*
游戏脚本的设计与开发 第四章
*/
Load.img(backdata,lufy_legend.jpg);

之前我用脚本中的Load类实现了脚本文件的读取,为了将Load类作为专用的读取类,现在我依然用它来完成一张图片的读取,首先在ScriptLoad.analysis函数中将Load.img分析出来:

ScriptLoad.analysis = function (value){
	var start = value.indexOf("(");
	var end = value.indexOf(")");
	ScriptLoad.data = value.substring(start+1,end).split(",");
	switch(LMath.trim(value.substr(0,start))){
		case "Load.img":
			ScriptLoad.loadImg();
			break;
		case "Load.script":
			ScriptLoad.loadScript();
			break;
		default:
			LGlobal.script.analysis();
	}
};

下面关键看ScriptLoad.loadImg()函数,在lufylegend.js中,读取图片,当然是要用LLoader类了,看下面

ScriptLoad.loadImg = function (){
	ScriptLoad.loader = new LLoader();
	ScriptLoad.loader.addEventListener(LEvent.COMPLETE,ScriptLoad.loadImgOver);
	ScriptLoad.loader.load(ScriptLoad.data[1],"bitmapData");
};

因为在ScriptLoad.analysis函数中,我已经将参数都保存在了ScriptLoad.data中,两个参数一个是读取后用来保存图片的名字,另一个是图片的路径,所以上面的ScriptLoad.data[1]就是图片的路径了,图片读取完之后调用ScriptLoad.loadImgOver函数,将图片保存起来,看下面代码。

ScriptLoad.loadImgOver = function (event){
	var script = LGlobal.script;
	script.scriptArray.bitmapdataList[ScriptLoad.data[0]] = new LBitmapData(ScriptLoad.loader.content);
	ScriptLoad.loader.imgLoader = null;
	script.analysis();
};

这里将读取到的图片保存为LBitmapData对象,并保存在scriptArray.bitmapdataList数组里,当然一开始你要把这个数组定义在LScriptArray这个仓库里,如下。

/*
* LScriptArray.js
**/
function LScriptArray(){
	var self = this;
	//用来保存LTextField对象
	self.textList = new Array();
	//用来保存LSprite对象
	self.layerList = new Array();
	//用来保存变量
	self.varList = new Array();
	//用来保存函数
	self.funList = new Array();
	//用来保存LBitmapData对象
	self.bitmapdataList = new Array();
	//用来保存LBitmap对象
	self.imgList = new Array();
}

成功读取图片并保存后,就可以用下面的脚本来显示一张图片了。

/*
游戏脚本的设计与开发 第四章
*/
Img.add(-,backimg01,backdata,0,0,100,100,1);

几个参数分别为:显示层,所添加LBitmap对象的名称,所使用LBitmapData对象的名称,坐标x,坐标y,长,宽,透明度

解析函数中的switch部分肯定要修改了,如下

switch(sarr[0]){
	case "Load":
		ScriptLoad.analysis(lineValue);
		break;
	case "Text":
		ScriptText.analysis(lineValue);
		break;
	case "Var":
		ScriptVarlable.analysis(lineValue);
		break;
	case "Call":
		ScriptFunction.analysis(lineValue);
		break;
	case "Img":
		ScriptImg.analysis(lineValue);
		break;
	default:
		if(lineValue.indexOf("if") >= 0){
			ScriptIF.getIF(lineValue);
		}else if(lineValue.indexOf("function") >= 0){
			ScriptFunction.setFunction(lineValue);
		}else{
			self.analysis();
		}
}

可以看到,当遇到Img脚本的时候,会调用ScriptImg类的解析函数,这个函数代码如下

/*
* ScriptImg.js
**/
var ScriptImg = function (){};
ScriptImg.analysis = function (value,start,end){
	
	var start = value.indexOf("(");
	var end = value.indexOf(")");
	switch(value.substr(0,start)){
		case "Img.add":
			ScriptImg.addImg(value,start,end);
			break;
	}
};

下面看看在ScriptImg.addImg函数中,如何来添加一个图片,代码如下

ScriptImg.addImg = function (value,start,end){
	var script = LGlobal.script;
	var layer;
	//分解参数
	var lArr = value.substring(start+1,end).split(",");
	var layerStr = lArr[0];
	var nameStr = lArr[1];
	var dataStr = lArr[2];
	var bitdata;
	//获取LBitmapData对象
	bitdata = script.scriptArray.bitmapdataList[dataStr];
	var xInt = parseFloat(lArr[3]);
	var yInt = parseFloat(lArr[4]);
	var wNum;
	var hNum;
	//得到宽(非必须)
	if(lArr.length > 5){
		wNum = parseFloat(lArr[5]);
	}
	//得到高(非必须)
	if(lArr.length > 6){
		hNum = parseFloat(lArr[6]);
	}
	var alphaNum = 1;
	//得到透明度,默认是1(非必须)
	if(lArr.length > 7){
		alphaNum = parseFloat(lArr[7]);
	}
	//获取LSprite显示层
	layer = script.scriptArray.layerList[layerStr];
	var bitmap = new LBitmap(bitdata);
	//如果设置了宽,则通过scaleX计算LBitmap的宽
	if(wNum)bitmap.scaleX = wNum/bitdata.width;
	//如果设置了高,则通过scaleX计算LBitmap的高
	if(hNum)bitmap.scaleY = hNum/bitdata.height;
	//设置透明度
	bitmap.alpha = alphaNum;
	//设置坐标
	bitmap.x = xInt;
	bitmap.y = yInt;
	bitmap.name = nameStr;
	//将LBitmap对象保存到imgList数组
	script.scriptArray.imgList[nameStr] = bitmap;
	layer.addChild(bitmap);
	script.analysis();
};

首先,通过用逗号对括号内部分字符串的分解,得到相应的参数,然后新建LBitmap对象,并保存到imgList数组,详细做法都在上面的代码上添加了注释。

接下来,将Main.ls修改如下

//读取图片数据
Load.img(backdata,lufy_legend.jpg);
//显示图片
Img.add(-,backimg01,backdata,0,0,100,100,1);

运行程序,即可得到下面效果


2,对图片进行缓动变换

游戏中,光显示图片显然是不够的,要对图片做各种处理,坐标变换,旋转,渐显,渐退等操作,下面来实现一下这些操作的脚本,脚本格式如下。

Img.transition(backimg01,{x:350},1,Strong.easeOut,type);

几个参数分别为,所操作LBitmap对象的名称,操作内容,变换所需时间,缓动种类(缓动种类可以参照LTweenLite),是否立即执行下一行脚本(如果不设置,则缓动结束后才开始执行下一行脚本)

下面来实现一下这个脚本,首先扩展下Img的解析函数中的switch部分

ScriptImg.analysis = function (value,start,end){
	
	var start = value.indexOf("(");
	var end = value.indexOf(")");
	switch(value.substr(0,start)){
		case "Img.add":
			ScriptImg.addImg(value,start,end);
			break;
		case "Img.transition":
			ScriptImg.transition(value,start,end);
			break;
	}
};

下面看ScriptImg.transition函数部分

ScriptImg.transition = function (value,start,end){
	var script = LGlobal.script;
	
	var lArr = value.substring(start+1,end).split(",");
	var nameStr = lArr[0];
	//将json对象还原
	var toObj = eval('(' + lArr[1] + ')');
	//获取缓动时间
	var time = parseFloat(lArr[2]);
	var eases = lArr[3].split(".");
	var runNow = false;
	//是否立即执行下一行脚本
	if(lArr.length > 4){
		runNow = (lArr[4] == "1");
	}
	toObj["ease"] = LEasing[eases[0]][eases[1]];
	if(!runNow){
		toObj["onComplete"] = function(){
			script.analysis();
		};
	}
	LTweenLite.to(script.scriptArray.imgList[nameStr],time,toObj);  
	//如果runNow为1,则立即执行下一行脚本
	if(runNow)script.analysis();
};

好了,因为使用了lufylegend.js引擎中的缓动类LTweenLite,所以缓动操作十分简单。需要注意的是这里只能使用一种操作缓动操作,多种缓动操作的话,应该分为多行脚本来实现,下面修改Main.ls为

Load.img(backdata,lufy_legend.jpg);
Img.add(-,backimg01,backdata,0,0,100,100,1);
Img.transition(backimg01,{x:350},1,Strong.easeOut,1);
Img.transition(backimg01,{y:200},1,Strong.easeOut,1);
Img.add(-,backimg02,backdata,50,50,50,50,0.5);
Img.transition(backimg02,{y:200},1,Strong.easeOut,1);
Img.transition(backimg02,{scaleX:1},1,Strong.easeOut);
Img.add(-,backimg03,backdata,200,50,200,200,0.5);

运行程序,可以看到各种缓动效果,如下


测试连接如下

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

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

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

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

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

本章就介绍这么多了,下一章介绍如何使用脚本来实现分层操作以及利用脚本在界面上绘制矩形,圆形等各种图形。

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

转载请注明:转自lufy_legend的博客http://blog.csdn.net/lufy_legend
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第1章 Java语言概述······························· (1) 1.1 Java语言及其产生···························· (1) 1.2 Java的特点································ (1) 1.3 Java的体系结构····························· (3) 1.3.1 Java的体系结构···························· (3) 1.3.2 Java虚拟机······························ (3) 1.3.3 垃圾回收机制····························· (3) 1.3.4 代码安全检测····························· (4) 1.4 Java的3种版本······························ (4) 1.5 Java开发环境概述···························· (4) 1.5.1 JDK的安装、配置和使用························ (4) 1.5.2 JDK工具箱····························· (6) 1.5.3 Eclipse开发环境的安装、配置和使用··················· (6) 1.5.4 Java程序的编写···························· (7) 1.6 本章小结································· (9) 习题1···································· (9) 第2章 Java语言基础······························ (11) 2.1 Java语言要素······························ (11) 2.1.1 标识符······························· (11) 2.1.2 关键字······························· (11) 2.1.3 分隔符······························· (12) 2.1.4 注释································ (12) 2.2 基本数据类型······························ (13) 2.2.1 简单类型······························ (13) 2.2.2 引用类型······························ (14) 2.2.3 常量································ (14) 2.2.4 变量································ (15) 2.3 运算符和表达式····························· (16) 2.3.1 算术运算符····························· (16) 2.3.2 关系运算符····························· (17) 2.3.3 逻辑运算符····························· (17) 2.3.4 位运算符······························ (18) 2.3.5 赋值运算符····························· (19) 2.3.6 其他运算符····························· (20) 2.3.7 运算符的优先级与结合性························ (21) 2.3.8 表达式与语句···························· (21) 2.4 控制语句································ (22) 2.4.1 选择结构控制语句·························· (23) 2.4.2 循环结构控制语句·························· (25) 2.4.3 转移语句······························ (27) 2.5 数组·································· (29) 2.5.1 一维数组······························ (29) 2.5.2 二维数组······························ (31) 2.5.3 多维数组······························ (32) 2.6 字符串································· (32) 2.6.1 字符串类······························ (33) 2.6.2 常用方法······························ (33) 2.7 综合应用实例······························ (34) 2.8 本章小结································ (37) 习题2···································· (37) 第3章 Java类和对象······························ (39) 3.1 面向对象基础······························ (39) 3.1.1 类································· (39) 3.1.2 对象································ (40) 3.1.3 消息································ (40) 3.2 继承·································· (40) 3.2.1 创建子类······························ (40) 3.2.2 成员变量和方法··························· (41) 3.2.3 对象的构造和初始化过程························ (44) 3.2.4 上转型对象····························· (45) 3.2.5 关键字this和super·························· (47) 3.2.6 对象的撤销和清理·························· (49) 3.3 多态·································· (50) 3.3.1 基本概念······························ (50) 3.3.2 方法重载······························ (50) 3.3.3 方法覆盖······························ (51) 3.3.4 变量覆盖······························ (53) 3.4 修饰符································· (53) 3.4.1 访问修饰符····························· (53) 3.4.2 非访问修饰符···························· (57) 3.5 内部类和匿名内部类··························· (59) 3.5.1 内部类······························· (59) 3.5.2 匿名内部类····························· (61) 3.6 接口·································· (63) 3.6.1 接口的定义····························· (63) 3.6.2 接口与多重继承··························· (63) 3.6.3 接口的实现····························· (64) 3.6.4 接口中的变量和方法························· (64) 3.7 包··································· (66) 3.7.1 包的作用······························ (66) 3.7.2 Java中定义的包··························· (66) 3.7.3 自定义包的创建和使用························ (66) 3.7.4 编译和生成包···························· (67) 3.8 综合应用实例······························ (68) 3.9 本章小结································ (70) 习题3···································· (71) 第4章 Java的I/O流和异常处理·························· (73) 4.1 I/O流概述································ (73) 4.2 System I/O类和Scanner类························· (75) 4.2.1 System I/O类···························· (75) 4.2.2 Scanner类······························ (76) 4.3 文件类································· (76) 4.3.1 使用File类访问文件系统························ (76) 4.3.2 随机文件读写···························· (78) 4.4 字节级输入输出流···························· (79) 4.4.1 数据输入输出流··························· (79) 4.4.2 文件输入输出流··························· (80) 4.4.3 缓冲输入输出流··························· (81) 4.4.4 管道输入输出流··························· (81) 4.4.5 格式化输出流···························· (81) 4.5 字符级输入输出类···························· (82) 4.5.1 字符输入输出类··························· (82) 4.5.2 缓冲读写类····························· (83) 4.5.3 文件读写类····························· (86) 4.5.4 格式化写类····························· (88) 4.6 对象序列化······························· (89) 4.6.1 对象输入流····························· (89) 4.6.2 对象输出流····························· (90) 4.7 异常处理································ (91) 4.7.1 Java中定义的异常·························· (91) 4.7.2 异常类的层次结构·························· (92) 4.7.3 捕获异常······························ (92) 4.7.4 异常处理的嵌套··························· (96) 4.7.5 自定义的异常和使用························· (97) 4.8 文件流综合应用实例··························· (98) 4.9 本章小结································ (106) 习题4··································· (106) 第5章 Java用户界面类和Applet························· (108) 5.1 AWT简介······························· (108) 5.2 AWT容器类······························ (108) 5.3 基本控件类······························· (110) 5.4 图形类································· (112) 5.5 事件类型及其处理··························· (112) 5.5.1 事件类······························ (113) 5.5.2 事件监听器····························· (113) 5.5.3 事件处理流程···························· (114) 5.6 布局管理器······························· (115) 5.6.1 FlowLayout····························· (115) 5.6.2 BorderLayout···························· (116) 5.6.3 GridLayout····························· (116) 5.6.4 CardLayout····························· (116) 5.6.5 GridBagLayout··························· (117) 5.7 Swing简介······························· (117) 5.7.1 Swing组件的特点·························· (118) 5.7.2 Swing包中的类··························· (118) 5.7.3 Swing包中的控件类························· (118) 5.8 Java Applet······························· (122) 5.8.1 Applet简介···························· (122) 5.8.2 Applet程序的编写·························· (124) 5.8.3 Applet程序的编译和执行······················· (125) 5.8.4 Applet的绘图和控制························· (126) 5.9 GUI设计综合应用实例·························· (128) 5.10 本章小结······························· (130) 习题5··································· (130) 第6章 Java网络编程······························ (132) 6.1 Java网络基础······························ (132) 6.1.1 IP地址······························ (132) 6.1.2 端口······························· (133) 6.1.3 套接字······························ (134) 6.1.4 数据报······························ (134) 6.1.5 传输协议······························ (135) 6.2 基于URL的高层次Java网络编程····················· (135) 6.2.1 从URL中读取内容························· (135) 6.2.2 建立URL连接并读取内容······················· (136) 6.3 基于Socket的网络编程························· (137) 6.3.1 Socket通信过程··························· (138) 6.3.2 创建客户端Socket·························· (139) 6.3.3 创建服务器端Socket························· (139) 6.3.4 打开输入输出流··························· (139) 6.3.5 关闭流和Socket··························· (141) 6.4 基于Datagram的网络编程························ (141) 6.4.1 数据报和套接字··························· (142) 6.4.2 创建客户端Datagram························· (142) 6.4.3 创建服务器端Datagram························ (142) 6.4.4 打开输入输出流··························· (143) 6.4.5 关闭流和Datagram·························· (143) 6.5 网络编程与应用实例·························· (144) 6.6 本章小结································ (150) 习题6··································· (150) 第7章 Java多线程编程····························· (152) 7.1 线程基础································ (152) 7.1.1 线程概述······························ (152) 7.1.2 线程的状态····························· (152) 7.1.3 线程的优先级···························· (153) 7.2 线程的创建······························· (153) 7.2.1 通过继承Thread类创建························ (153) 7.2.2 通过实现Runnable接口创建······················ (155) 7.3 多线程的创建······························ (156) 7.4 线程的调度······························· (159) 7.4.1 线程优先级的获取与设置······················· (159) 7.4.2 线程睡眠······························ (159) 7.4.3 线程让步······························ (159) 7.4.4 线程等待······························ (160) 7.4.5 线程唤醒······························ (160) 7.5 多线程的同步处理··························· (161) 7.5.1 多线程的互斥···························· (161) 7.5.2 synchronized方法·························· (161) 7.6 多线程综合应用实例·························· (164) 7.7 本章小结································ (168) 习题7··································· (168) 第8章 数据库编程······························· (170) 8.1 数据库基础······························· (170) 8.1.1 关系数据库····························· (170) 8.1.2 SQL基本内容···························· (171) 8.1.3 ODBC技术····························· (173) 8.2 JDBC数据库连接技术·························· (174) 8.2.1 JDBC概述····························· (174) 8.2.2 JDBC的实现及其驱动程序······················ (174) 8.2.3 JDBC的常用类和接口························ (175) 8.3 Java访问数据库的基本步骤······················· (176) 8.3.1 加载驱动程序类··························· (176) 8.3.2 建立JDBC连接··························· (177) 8.3.3 执行SQL语句··························· (179) 8.4 JDBC高级特性····························· (180) 8.4.1 预备语句······························ (180) 8.4.2 可滚动和可更新的结果集······················· (180) 8.4.3 元数据······························ (182) 8.4.4 事务······························· (183) 8.5 创建数据库······························· (184) 8.6 JDBC综合应用举例··························· (185) 8.7 本章小结································ (187) 习题8··································· (188) 第9章 Servlet与JSP······························ (189) 9.1 Java EE Web开发技术·························· (189) 9.2 Servlet基础······························· (190) 9.2.1 Servlet定义····························· (190) 9.2.2 Servlet工作方式··························· (191) 9.2.3 Servlet API····························· (192) 9.2.4 Servlet异常····························· (193) 9.3 配置Servlet工作环境·························· (193) 9.3.1 Servlet开发环境··························· (193) 9.3.2 Servlet类的配置··························· (194) 9.3.3 编写简单的Servlet·························· (195) 9.4 JavaBean基础······························ (196) 9.4.1 JavaBean基本概念·························· (196) 9.4.2 JavaBean的属性、方法和事件····················· (197) 9.4.3 一个简单的JavaBean························· (197) 9.5 JSP概述································ (198) 9.5.1 JSP基本概念···························· (198) 9.5.2 JSP技术的特点··························· (199) 9.5.3 JSP的工作方式··························· (199) 9.5.4 JSP和Servlet的区别························· (200) 9.6 编写简单的JSP····························· (200) 9.7 在JSP中访问数据库··························· (200) 9.8 JSP的设计模式····························· (202) 9.8.1 JavaBean与JSP的结合························ (202) 9.8.2 Servlet与JSP的结合························· (203) 9.9 JSP的语法要素····························· (203) 9.9.1 JSP脚本元素···························· (203) 9.9.2 JSP指令和动作元素························· (205) 9.9.3 JSP内置对象···························· (206) 9.10 Web综合应用实例··························· (209) 9.11 本章小结······························· (222) 习题9··································· (223) 第10章 RMI和EJB······························ (224) 10.1 RMI基础······························· (224) 10.1.1 RMI概述···························· (224) 10.1.2 RMI的目标和体系结构······················· (224) 10.1.3 RMI的工作机制·························· (225) 10.1.4 用RMI设计应用系统························ (226) 10.2 RMI API································ (227) 10.3 Java RMI与其他分布式技术······················· (228) 10.4 RMI部署问题····························· (229) 10.5 编写一个RMI应用系统························· (229) 10.6 EJB技术································ (233) 10.6.1 EJB基本概念··························· (233) 10.6.2 EJB组件····························· (234) 10.6.3 EJB容器····························· (235) 10.6.4 开发和部署EJB·························· (236) 10.6.5 EJB和其他分布式技术······················· (237) 10.6.6 基于EJB的Web应用程序实例···················· (238) 10.7 本章小结······························· (244) 习题10··································· (245) 附录A Java运算符及其优先级·························· (246) 附录B Java类路径和类加载器·························· (247) 参考文献···································· (249)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值