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

《游戏脚本的设计与开发》-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
分享到:
评论

相关推荐

    Cocos2D-X游戏开发技术精解

    1.4 下载与安装 10 1.5 引擎的组成 13 1.6 技术文档 15 1.7 成功的游戏 17 1.8 Cocos2D-X引擎的体系 18 1.9 Cocos2D-X引擎的版权声明 19 1.10 本章小结 20 第2章 Cocos2D-X引擎的 开发环境 21 2.1 跨平台的开发 21 ...

    Shell脚本学习笔记

    3.4.2 读取变量与读取命令 69 3.4.3 改变字段分隔符与使用通配符读取目录 69 3.4.5 C式的for命令 70 3.5 while、until命令 71 3.5.1 使用多条测试命令 71 3.5.2 until命令与循环嵌套 72 3.6 文件数据的循环与控制...

    DLOG4J II v1.4

    采用纯Java技术开发,符合J2EE v1.3规范,可在不同操作系统、数据库系统以及应用服务器系统间进行无缝移植,基于浏览求/服务器的瘦客户端方式,采用现今流行的符合MVC模式的Web应用开发框架—Struts,使用Hibernate...

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

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

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘 作者:王晓军 田中雨 刘跃军 等 全书共分12章,介绍了,JSP开发环境配置,页面组成元素,内置对象,访问数据库技术,JavaBean,Servlet技术,以及开发JSP...

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

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

    Visual C++程序开发范例宝典(光盘) 第四部分

    3.11 简单游戏设计 实例113 拼图游戏 实例114 网络五子棋 实例115 彩票抽奖机 3.12 OpenGL程序设计 实例116 制作OpenGL动画 实例117 利用OpenGL绘制立体模型 实例118 利用OpenGL绘制NURBS曲线 第4章 ...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    3.9 图像管理 cc实例109 管理计算机内图片文件的程序 cc实例110 提取并保存应用程序图标 3.10 图片动画 cc实例111 利用图片制作屏幕保护程序 cc实例112 图片动画 3.11 简单游戏设计 cc实例113 拼图...

    Visual C++程序开发范例宝典(光盘) 第八部分

    3.11 简单游戏设计 实例113 拼图游戏 实例114 网络五子棋 实例115 彩票抽奖机 3.12 OpenGL程序设计 实例116 制作OpenGL动画 实例117 利用OpenGL绘制立体模型 实例118 利用OpenGL绘制NURBS曲线 第4章 ...

    H5智能内核-基于MVC架构的全新Zoomla!逐浪CMS2 x3.8发布

    基于这一思维开发的产品,具有更易维护、更加简洁目录,同时加上全新的逐浪CMS架构和自主表现引擎,整体效率与运行脚本也更具上乘。 Zoomla!逐浪CMS2 x3.8系统是逐浪软件团队年度大作,也是有史以来最大的一次加构...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     3.11 简单游戏设计   cc实例113 拼图游戏   cc实例114 网络五子棋   cc实例115 彩票抽奖机   3.12 OpenGL程序设计   cc实例116 制作OpenGL动画   cc实例117 利用OpenGL绘制立体模型   cc实例...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     3.11 简单游戏设计   cc实例113 拼图游戏   cc实例114 网络五子棋   cc实例115 彩票抽奖机   3.12 OpenGL程序设计   cc实例116 制作OpenGL动画   cc实例117 利用OpenGL绘制立体模型   cc实例...

    JavaScript王者归来part.1 总数2

     10.7.2.2 系统设计与实现--处理LRC歌词   10.8 总结   第三部分 浏览器与DOM  第11章 浏览器对象  11.1 Window对象--最基本的浏览器对象   11.1.1 Window对象概览   11.1.2 Window对象的生命周期   ...

    ASP.NET 3.5 开发大全11-15

    1.4 安装SQL Server 2005 1.5 ASP.NET应用程序基础 1.5.1 创建ASP.NET应用程序 1.5.2 运行ASP.NET应用程序 1.5.3 编译ASP.NET应用程序 1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# ...

    ASP.NET 3.5 开发大全1-5

    1.4 安装SQL Server 2005 1.5 ASP.NET应用程序基础 1.5.1 创建ASP.NET应用程序 1.5.2 运行ASP.NET应用程序 1.5.3 编译ASP.NET应用程序 1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# ...

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

Global site tag (gtag.js) - Google Analytics