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

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

 
阅读更多

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

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

/*
游戏脚本的设计与开发 第四章
*/
//读取图片数据
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
分享到:
评论

相关推荐

    Unity 3D脚本编程 使用C#语言开发跨平台游戏

    Unity 3D脚本编程 使用C#语言开发跨平台游戏 陈嘉栋 著 目录 第1 章 Hello Unity 3D 1 第2 章 Mono 所搭建的脚本核心基础22 第3 章 Unity 3D 脚本语言的类型系统58 第4 章 Unity 3D 中常用的数据结构99 第5 章 在...

    Cocos2D-X游戏开发技术精解

    第4章 动作功能 100 4.1 概述 100 4.2 动作基类 101 4.2.1 动作类的继承关系 102 4.2.2 动作基类CCAction的成员函数 102 4.2.3 类CCNode中与动作有关的函数 104 4.3 时间动作 105 4.3.1 及时动作 105 4.3.2 持续动作...

    ASP和SQL网站数据库程序设计(DOC)

    第4章 系统的安装与激活…………….……..61 4-1 安装前的准备 62 4-1-1 选择安装版本 62 4-1-2 硬件需求 63 4-1-3 软件需求 63 4-2 开始安装SQL Server 2000 64 4-3 重要设置说明 73 4-3-1 服务帐户 73 ...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    第4章 立竿见影 25 4.1 新建一个应用程序 25 4.2 Hello, Rails 27 4.3 把页面连起来 35 4.4 我们做了什么 37 第2部分 构建应用程序 39 第5章 Depot应用程序 41 5.1 增量式开发 41 5.2 Depot做些什么 41 5.3 让我们...

    ASPNET35开发大全第一章

    第4章 ASP.NET的网页代码模型及生命周期 4.1 ASP.NET的网页代码模型 4.1.1 创建ASP.NET网站 4.1.2 单文件页模型 4.1.3 代码隐藏页模型 4.1.4 创建ASP.NET Web Application 4.1.5 ASP.NET网站和ASP.NET应用程序的区别...

    Shell脚本学习笔记

    第4章 处理用户输入与显示数据 76 4.1 命令行参数与特殊的参数变量 76 4.1.1 读取参数 76 4.1.2 读取程序名称 77 4.1.3 测试参数 77 4.1.4 参数计数 77 4.1.5 获取所有数据 78 4.2 移位与选项 79 4.2.1 移位 79 ...

    Python示例-从基础到高手PDF

    第 4 章 一个脚本讲述 python 语言的基础规范,适合初学者 第 5 章 python 计算文件的行数和读取某一行内容的实现方法 第 6 章 python 中用 string.maketrans 和 translate 巧妙替换字符串 第 7 章 python ...

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

    第4章 ExtJS事件机制 4.1 设计模式——观察者模式 4.2 自定义事件 4.3 浏览器事件 4.4 ExtJS中的事件 4.4.1 Function.call()/apply()方法 4.4.2 函数的作用域 4.4.3 Ext.lib.Event事件 4.4.4 Ext.util....

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

    第4章 字符串操作与正则表达式 4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:...

    PHP和MySQL WEB开发(第4版)

    第4章 字符串操作与正则表达式 4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:addslashes()和...

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

    第4章 内置对象 65 4.1 Request请求对象 65 4.1.1 Request简介 65 4.1.2 Request对象应用 66 4.2 Response响应对象 69 4.2.1 response简介 69 4.2.2 Response对象应用 70 4.3 Out输出对象 74 4.3.1 Out简介 74 4.3.2...

    ASP.NET 3.5 开发大全11-15

    第4章 ASP.NET的网页代码模型及生命周期 4.1 ASP.NET的网页代码模型 4.1.1 创建ASP.NET网站 4.1.2 单文件页模型 4.1.3 代码隐藏页模型 4.1.4 创建ASP.NET Web Application 4.1.5 ASP.NET网站和ASP.NET应用程序的区别...

    ASP.NET 3.5 开发大全1-5

    第4章 ASP.NET的网页代码模型及生命周期 4.1 ASP.NET的网页代码模型 4.1.1 创建ASP.NET网站 4.1.2 单文件页模型 4.1.3 代码隐藏页模型 4.1.4 创建ASP.NET Web Application 4.1.5 ASP.NET网站和ASP.NET应用程序的区别...

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

    第4章 多媒体技术 4.1 动画 实例119 利用Image控件制作小动画 实例120 透明的Flash动画 实例121 播放GIF动画 实例122 播放AVI动画 实例123 播放VCD 4.2 制作与播放音频 实例124 可以选择播放曲目的CD播放器...

    JavaScript基础教程第8版

    第4章 处理图像 59 4.1 创建翻转器 59 4.2 创建更有效的翻转器 61 4.3 构建三状态翻转器 64 4.4 由链接触发翻转器 66 4.5 让多个链接触发一个翻转器 68 4.6 处理多个翻转器 71 4.7 创建循环的广告条...

Global site tag (gtag.js) - Google Analytics