Laya技术文档学习总结

1.drawTexture 加载显示图片的示例

​ loadImage()方法可以即时加载外部图片资源,也可以从缓冲区读取图片资源,drawTexture()方法则必须先加载完图片后,再绘制添加到舞台中来,因此在示例代码中需要使用到加载(Laya.loader.load())与回调(Handler.create())的方法,下面我们通过简单的示例代码加载显示一张图片,代码说明请查看代码中的注释部分以及相关API说明。

2.  IDE制作图集动画

关于图集动画可以在IDE设计UI的时候,直接使用Animation组件去制作。这样,可视化的部分会更加直观。关于图集动画的IDE制作部分,可以查看 Animation组件属性详解 以及 LayaAirIDE制作图集动画 这两篇文档。

3.缓动动画

由于Tween.fromTween.to的缓动效果本来就是相反的,所以Tween.from有一种向下落的感觉,而图3Tween.to有一种向上弹起的感觉。

4.1导出时间轴动画

IDE内按快捷键F12Ctrl+F12会导出时间轴动画,.ani文件会生成在项目根目录/bin/目录下。动画中用到的资源图集位于项目根目录/bin/res/atlas/目录下,如图28所示。


(
28)

 

4.2在项目中使用时间轴动画

在项目中使用时间轴动画主要分为三步。

第一步:加载动画所需的图集。

1.   //加载图集成功后,执行onLoaded回调方法
2.   Laya.loader.load("res/atlas/ui.atlas",Laya.Handler.create(this,this.onLoaded));

第二步:创建Animation实例,加载动画文件

1.   //创建一个Animation实例
2.   var tl:Laya.Animation=newLaya.Animation();
3.   //加载动画文件
4.   tl.loadAnimation("TimeLine.ani");

第三步:添加动画到舞台,播放动画

扫描二维码关注公众号,回复: 5113046 查看本文章
1.   //添加到舞台
2.   Laya.stage.addChild(tl);
3.   //播放Animation动画
4.   tl.play();

 

4.3 UI中使用时间轴动画,然后在项目代码中调用。

创建UI页,添加Animation动画到场景中。

我们先创建一个TimeLine.uiUI页面,然后直接拖拽planCrashed.ani到场景中,如图所示。

 


5. LayaAir引擎提供了SWF文件的转换工具,将原生的SWF文件转换为LayaAir引擎可识别的格式,但是转换工具不支持在SWF文件中包含文本、形状渐变、遮罩、代码这样的特殊内容。如果包括了上述的内容,转换后将无法达到原SWF中的效果或转换失败。

 

6.什么是JSONP

JSONPJSON withPadding)是JSON的一种使用模式可以让网页从别的域名(网站)获取到资料,即跨域读取数据。为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP)呢?这是因为同源策略。同源策略,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript的浏览器都会使用这个策略。

7.WebStorage数据存储

对于不同的网站,数据存储于不同的区域,并且一个网站只能访问其自身的数据。因此本地数据的存储我们完全可以用LocalStorage(根据域名进行进行访问,永久储存在本地)。

由此我们可以看出sessionStorage是会话级别的存储对象。关闭浏览器就会消失。

8.屏幕方向的智能适配设置

LayaAir引擎可以依据浏览器显示的比例设置自动横屏或竖屏,不受系统锁屏而影响。相关API设置参数如图7、图8所示:

9. 删除图集文件后,无法重新导出的问题

当用户手动删除了图集文件,但并未删除rec文件时,如图10所示。在这种情况下,如果原始资源没有发生改变,直接使用F12是无法重新导出图集文件的。

此时,可以通过快捷键Ctrl+F12清理并导出。或者直接把rec文件也删除掉,再使用F12导出。即可正常导出图集。


(
10)

 

10.如何在项目中使用图集中的小图

在项目中如果用到图集中的资源,则需先预加载图集资源,然后设置图片的皮肤(skin)属性值为原小图目录名/原小图资源名.png”

例如:上文中图6的资源打包后如图1所示,现在我们将图6ui目录下的小图monkey1.png在项目中通过图集的方式显示出来,示例代码如下:

Main.ts入口类:

1.   Laya.init(1334,750);
2.    
3.   //预加载图集资源ui.atlas,然后执行回调方法onLoaded
4.   Laya.loader.load("res/atlas/ui.atlas",Laya.Handler.create(this,this.onLoaded));
5.    
6.   function onLoaded():void{
7.       //创建Image实例
8.       var img:Laya.Image=newLaya.Image();
9.    
10.     //设置皮肤(取图集中小图的方式就是原小图目录名/原小图资源名.png
11.     img.skin ="ui/monkey1.png";
12.  
13.     //添加到舞台上显示
14.     Laya.stage.addChild(img);
15. }

 

11.从层级目录中将转换好的Box组件拖入到资源列表中,生成预设组件。如动图5所示:


(
5)

12.页面嵌套

在项目开发中,有时会有一个UI页面在多处使用的功能(不使用代码添加的情况下)。LayaAirIDE中可以直接一个UI页面拖拽到另外一个UI页面中去使用。

 

13.ViewStack组件主要用于多页面视图切换。它包含多个子页面,但默认只显示一个,可以通过子页面索引进行显示切换。一般情况我们用它与Tab标签组合制作标签切换页面。如动图1所示。


(动图1

14.Animation组件

Animation组件是动画组件,可以方便的创建图集动画或者使用LayaAirIDE创建的ani动画。支持以下几种创建Animation组件的方式:用序列帧图片创建、用图集文件创建、使用动画文件创建

创建Animation组件

Animation不是常用的UI组件,也不是容器组件。所以在创建Animation组件的时候,需要先从组件库里直接拖入Animation组件到IDE场景编辑器中。如动图2所示。

 

15.多线程worker

html5引入了worker的功能,通过使用Web Worker我们可以在浏览器后台运行JavaScript而不占用浏览器自身线程。Web Worker可以提高应用的总体性能,并且提升用户体验。线程可以执行任务而不干扰用户界面。

原生worker

web worker分为两种,专用线程dedicatedweb worker,以及共享线程shared webworkerDedicated web worker随当前页面的关闭而结束;这意味着Dedicated web worker只能被创建它的页面访问与之相对应的Sharedweb worker可以被多个页面访问但是web worker有些限制,并非所有的接口和方法都能使用。

·        Web Worker无法访问DOM节点;

·        Web Worker无法访问全局变量或是全局函数;

·        Web Worker无法调用alert()或者confirm之类的函数;

·        Web Worker无法访问windowdocument之类的浏览器全局变量;

workder 支持的函数 页面提供了一个 worker 支持的全局函数列表。开发者可以自己看下相应的方法

 

总结:webworker我们一般应用到解析加载大的文件,比如大的json文件,比较费时的计算,或者不需要即时加载的一些资源都可以放到后台线程来完成,这样用户基本感受不到主线程的卡顿。增强项目的流畅性。提高用户体验。


16.内存优化方式

通过对象池优化内存

对象池优化是游戏开发中非常重要的优化方式,也是影响游戏性能的重要因素之一。

在游戏中有许多对象在不停的创建与移除,比如角色攻击子弹、特效的创建与移除,NPC的被消灭与刷新等,在创建过程中非常消耗性能,特别是数量多的情况下。

对象池技术能很好解决以上问题,在对象移除消失的时候回收到对象池,需要新对象的时候直接从对象池中取出使用。

使用Handler.create

在开发过程中,会经常使用Handler来完成异步回调。Laya.Handler.create使用了内置对象池管理,因此在使用Handler对象时可使用Laya.Handler.create来创建回调处理器。以下代码使用Laya.Handler.create创建资源加载的回调处理器:

  1. Laya.loader.load(urls, Laya.Handler.create(this, this.onAssetLoaded));

我们在游戏中经常根据游戏逻辑和阶段分批加载资源,第一批资源加载完成,触发Laya.Handler.create()创建的complete事件回调方法后被对象池回收;当游戏进行到某个时候,需要加载第二批资源时,Laya.Handler.create()会首先在对象池中检索相同的回调方法处理器,如果找到就直接使用对象池中方法,从而节省了内存开销。

释放内存

JavaScript运行时无法启动垃圾回收器。要确保一个对象能够被回收,需要删除对该对象的所有引用。Sprite提供的destory()方法会帮助设置内部引用为null

例如,以下代码确保对象能够被作为垃圾回收:

  1. //创建一个Sprite实例
  2. var sp:Laya.Sprite = new Laya.Sprite();
  3. //sp内部引用设置为null
  4. sp.destroy();

资源卸载

游戏运行时总会加载许多资源,这些资源在使用完成后应及时卸载,否则一直残留在内存中。

 

17、图片/图集加载

在完成图片/图集的加载之后,引擎就会开始处理图片资源。如果加载的是一张图集,会处理每张子图片。如果一次性处理大量的图片,这个过程可能会造成长时间的卡顿。

在游戏的资源加载中,可以将资源按照关卡、场景等分类加载。在同一时间处理的图片越好,当时的游戏响应速度也会更快。在资源使用完成后,也可以予以卸载,释放内存。


18.所以,在微信小游戏发布的当天,LayaAir引擎也为开发者推出微信小游戏的适配库。自LayaAir 1.7.14版开始,开发者下载最新版本引擎或IDE只需要按照适配教程文档,初始化一下适配程序即可将HTML5游戏项目无缝适配为微信小游戏项目。

 

19.跨域的处理

在浏览器默认的情况下,如果加载一个本地文件,会出现交叉域访问的问题。这就是跨域

提示内容如下所示:

No ‘Access-Control-Allow-Origin’ headeris present on the requested resource. Origin ‘file://‘ is therefore not allowedaccess.

跨域分为两种。一种是文件请求跨域,一种是数据请求跨域

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/wangyihero8/article/details/80624173