新手问题

LayaAir下是否支持手机振动功能?

       layaAir官方暂时还没有提供类似接口,不过开发者可以直接调用js下的原生方法去实现。请参考:如何添加第三方js文件

addChild的资源使用removeChild是否会释放内存?

        removeChild只是移除,如果外部没有引用的话,会在某些时候回收掉(不是立即,js下的垃圾回收机制是自动的,会在内存紧张时自动回收),如果彻底不用,建议调用Spritedestroy方法,这样释放的会更快更彻底。

多个swf是否可以打成一张图集?

        多个swf可以打成一张图集,图集没有界限。

IDE下的TextArea可以实现滚动效果吗?

    IDE下的TextArea没有滚动条设置,如果文本不是很大的话,建议可以使用Panel实现。

LayaAir是否支持AR和VR?

     现阶段已经支持VRAR之后也会支持。分享:Layabox引擎推出H5行业首款3D RPG游戏及VR DEMO

f12发布IDE下已经打包过图集的部分是否会被重复执行?

        不会重新打图集,如果没有变化,已经打包过图集的部分将不会再重新打图集。

LayaAir时如何进行内存控制的?

     显存layaAir引擎会自动控制,内存需要开发者自己来控制。

编译生成的js下Laya.字符代表什么?

        这是LayaAir编译后自动生成的特殊字符。凡是Laya的类,在js下均可通过Laya.xxx进行访问,譬如:Laya.Sprite。

LayaAir下是否支持pureMVC的使用?

        支持pureMVC,开发者只需对原生框架做很少量的修改即可在项目中正常使用(已有开发者测试成功)

支持,可以使用XmlDom类来实现,同原生XML。

    支持,可以使用XmlDom类(XML适配类)来实现,XmlDom类只用于适配js原生XML接口,在AS环境下提供对应的代码提示,代码真正执行时执行原生jsXML代码。

LayaAir发布后的代码能否通过第三方工具进行检测和压缩?

        LayaAir发布后的代码就是标准的html5代码了,可以使用第三方的工具进行检测和压缩。

LayaAir下是否支持P2P的功能?

        LayaAir下没有直接提供P2P的相关接口,开发者可以通过调用JS下的原生方法去实现。

LayaAir下是否支持[Bindable]标签和PropertyChangeEvent事件?

        不支持[Binable]标签和PropertyChangeEvent事件的使用,因为该事件一旦创建,就会对绑定的属性值进行持续监听,严重影响性能。建议可以换种方式实现,譬如:自定义事件。

LayaAir下是否支持第三方的SWC文件引入?

        除了LayaAir内部提供的SWC文件外,不支持其他第三方的SWC文件的引用。

LayaAir是否支持Base64类库的使用?

        Base64暂时不支持,由于此类库太大,不适合集成到引擎库里,今后这种需求将以插件的形式提供。

IDE 的层级处是否可以对组件进行重命名?

        层级不再是图层,不能直接在层级处对组件进行重命名操作。名称可以在属性面板设置name属性实现。

Text类中text和changeText属性有何区别

        changeText是高效率的文字更改接口,如果不更改颜色、宽高等排版信息,只是更改文本,建议用changeText,高性能。

LayaAir是否支持SharedObject?

        我们提供了类似方法LocalStorage类,可以实现SharedObject的功能。

LayaAir是否支持判断当前设备类型?

        layaAir下已经支持该功能,通过Browser类的静态属性可以访问到,如下所示

/**浏览器代理信息*/
        public static const userAgent:String = /*[STATIC SAFE]*/ __JS__("navigator.userAgent");
        /** @private */
        private static const u:String = /*[STATIC SAFE]*/ userAgent;
        /**ios设备*/
        public static const onIOS:Boolean = /*[STATIC SAFE]*/ !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
        /**移动设备*/
        public static const onMobile:Boolean = /*[STATIC SAFE]*/ !!u.match(/AppleWebKit.*Mobile.*/);
        /**iphone设备*/
        public static const onIPhone:Boolean = /*[STATIC SAFE]*/ u.indexOf("iPhone") > -1;
        /**ipad设备*/
        public static const onIPad:Boolean = /*[STATIC SAFE]*/ u.indexOf("iPad") > -1;
        /**andriod设备*/
        public static const onAndriod:Boolean = /*[STATIC SAFE]*/ u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
        /**Windows Phone设备*/
        public static const onWP:Boolean = /*[STATIC SAFE]*/ u.indexOf("Windows Phone") > -1;
        /**QQ浏览器*/
        public static const onQQBrowser:Boolean = /*[STATIC SAFE]*/ u.indexOf("QQBrowser") > -1;
        /**移动端QQ或QQ浏览器*/
        public static const onMQQBrowser:Boolean = /*[STATIC SAFE]*/ u.indexOf("MQQBrowser") > -1;
        /**微信内*/
        public static const onWeiXin:Boolean = /*[STATIC SAFE]*/ u.indexOf('MicroMessenger') > -1;
        /**PC端*/
        public static const onPC:Boolean = /*[STATIC SAFE]*/ !onMobile;


LayaAir下如何实现ADD_TO_STAGE和REMOVE_FROM_STAGE?

        Event.DISPLAY相当于ADD_TO_STAGE

        Event.UNDISPLAY相当于REMVOE_FROM_STAGE


LayaAir针对大地图打图集是如何处理的?

        开发者可以根据自己的实际需求手动设置图集大小,但是依然会有限制,超过限制尺寸,编辑器将不会对大图进行切片处理也不会将大图打包进图集,而是会自动复制到导出目录,可以正常加载,无需开发者手动对大图进行切片处理。

LayaAir下如何操作二进制数据(ByteArray)?

        LayaAir下提供了Byte(laya.utils.Byte)类,来替代原生下ByteArray类的使用。

LayaAir下最轻量级的显示对象容器是?

        LayaAir下最轻量级的显示对象容器是Sprite(Sprite类是基本显示列表构造块,一个可显示图形并且也可包含子项的显示列表节点)

Label和Text、TextInput和Input类有何区别?

        Text(laya.display.Text)和Input(laya.display.Input)是核心包里的类,包含文本的基础功能,Label(laya.ui.Label;)和TextInput(laya.ui.TextInput)是UI包里的类,提供了皮肤以及相对布局等拓展功能。



LayaAir编辑器下是否支持swf的播放?

        LayaAir编辑器下目前暂时不支持SWF格式的播放,现阶段的操作主要是针对位图的,后续可能会支持,但是不建议开发者大量使用,会影响性能。



开发问题

如何判断事件是否被命中?

       某个对象想被点击中,需要符合两个条件:mouseEnabled=true,有宽高或者hitArea属性,默认精灵是不设置宽高的,但Laya自带的UI系统会自动计算宽高,所以一般无需设置宽高。

类似as3的getQualifiedClassName方法是否支持?

         在layaAir下我们提供了类似方法,getClass(ClassName:String),根据名字返回类对象。具体请参考laya.utils.ClassUtils.as).

IDE下的combobox组件最多可显示几个option?

        combobox组件默认有6个可视化option,可以通过设置visibleNum值获取或设置没有滚动条的下拉列表中可显示的最大行数。

getTimer在LayaAir下如何实现?

        getTimer()我们提供了类似方法Browser.now()来替代实现。

IDE组件的url属性在IDE和代码中分别设置是否会导致重复加载

      会导致加载2次,url属性会立即执行,有些属性会延迟执行,执行时间不一样。

手机端如何实现横竖屏控制?

        Laya.stage.screenMode=Stage.SCREEN_VERTICAL//自动竖屏

        Laya.stage.screenMode=Stage.SCREEN_HORIZONTAL;//自动横屏


LayaAir下是否支持ENTER_FRAME事件?

        支持,LayaAir下的ENTER_FRAME事件只有在播放MovieClip的时候才会生效,其他情况下如有需求,可以通过Laya.timer.frameLoop方法实现

如何实现动画播放?

 目前有三种方案可以实现动画播放

        a、swf动画:使用MovieClip,直接对swf进行加载播放(layaAir下不支持SWF文件链接类的获取

   b、图集动画:导出位图序列帧,使用layaAir编辑器F12发布,自动打包图集。使用Animation对序列帧进行播放控制(有规律的fla可以使用jsfl工具导出序列帧)。

       c、dragonbones骨骼动画

    注意:目前mc的定义主要为过场动画不建议使用mc做战斗等游戏主要内容,性能不高。   


LayaAir下是否支持像素级碰撞?

        类似原生下的bitmapData.hitTest()方法我们不支持,但是我们提供了替代方法hitTesPoint()

Laya.loader.load()方法如何传递多个url路径信息?

        传递单个参数:

load(url:String, complete:Handler = null, progress:Handler = null, type:String = null, priority:int = 1, cache:Boolean = true):LoadManager

        参数多个传递:

load([{url:xx,type:xx},{url:xx,type:xx}], complete:Handler = null, progress:Handler = null, type:String = null, priority:int = 1, cache:Boolean = true):LoadManager


LayaAir下如何做适配?

        针对项目的适配,LayaAir提供了一套完整且详细的适配方案,开发者可根据项目的实际需求,进行合理适配。

        sizeMode:针对画布大小,stage大小和画布一起变化

        scaleMode:针对屏幕缩放,stage大小不变

        screenMode:针对横竖屏

        useHDRendering:针对渲染像素

        alighH:针对canvas水平对齐方式

        alighV:针对canvas垂直对齐方式

        具体请参见LayaAir API Stage类下详细注解


如何在JS下快速定位问题所在?

        快速定位JS的方法很多,看个人开发习惯而定,譬如

        a、添加debugger,代码执行到添加debugger的地方,会自动断点

        b、增加trace输出,在浏览器的输出位置末尾,单击会自动跳转到对应代码

        c、代码搜索,在chrome调试窗口下,Ctrl+F搜索类名或关键字


Uncaught Reference:int is not defined

        JS下没有int类型,当出现类似 int.MAX_VALUE 或 int(4.56)类似写法时,发布h5后会导致报错int is not defined,这种情况下:

        int.MAX_VALUE可以使用Number.MAX_VALUE替代(AS3下可以使用Math取整)。int(4.56)可以使用parseInt(4.56+"")方法替代。



LoadImage后显示对象无法获取宽高?

        loadImage的加载是异步的,当你刚调用完loadImage方法就立刻去获取Sparite的宽高,这时候资源还未加载完毕,宽高肯定会获取失败。

       通过回调函数获取

package 
        {
            import laya.display.Sprite;
            import laya.resource.Texture;
            import laya.utils.Handler;
             
            public class xxx 
            {
                private var sp:Sprite;
                public function xxx()
                {
                    Laya.init(550,400);
                    sp=new Sprite();
                    sp.loadImage("xxx.png",0,0,100,100,Handler.create(this,onLoaded));
                     
                }
                 
                private function onLoaded():void
                {
                    // TODO Auto Generated method stub
                    Laya.stage.addChild(sp);
                    trace(sp.width,sp.height)
                }
            }
        }


如何开启webGL模式?

        webGL模式默认是关闭的

         AS下开启WebGL模式:

          Laya.init(Browser.width,Browser.height,WebGL);

         JS和TS下开启WebGL模式:

          Laya.init(Browser.width,Browser.height,Laya.WebGL)

        开启WebGL模式后,项目在浏览器端运行会优先使用WebGL,当发现该浏览器不支持WebGL模式时会自动切换到canvas模式。

需注意:开启WebGL模式性能会得到提升,但生成的JS包体积会增大,是否使用,还请开发者自行取舍。



addChild()和show()有何区别?

        addChild()只是将对象添加到舞台上,以舞台左上角(0,0)为原点进行显示对象的添加,对话框Dialog是show(),会居中显示,如果addChild和show的对象同为view的话,则两者相同。

LayaAir下空项目报错:iflash is not defined

        该报错大多数是因为LayaAir项目类中出现了继承原flash下的类,譬如flash.display.Sprite等

需要将

package
{
    import flash.display.Sprite;
 
    public class XXX extends Sprite
    {
        public function XXX()
        {
        }
    }
}

改为

package
{
    public class XXX 
    {
        public function XXX()
        {
        }
    }
}


网络交互问题

Error:... 'texImage2D' on 'WebGLRenderingContext':The cross...

        此报错是由于项目中html文件和资源文件不在同一个域内导致的跨域问题,WebGL不能跨域加载,目前有两种解决方案

        a、把你的图片资源下载到本地,让html文件和图片资源文件按保持在同一域下

        b、搭建server环境,解决跨域

  



转换项目

常见调试问题

项目性能与优化

LayaAir下drawCall如何进行优化?

       a、对复杂静态内容设置cacheAs,能大量减少DrawCall。

       b、尽量保证同图集的图片渲染顺序是挨着的,如果不同图集交叉渲染,会增加DrawCall数量。

       c、尽量保证同一个面板中的所有资源用一个图集,这样能减少提交批次。


超出屏幕外部的图片layaAir如何渲染?

        WebGL模式下会对超出屏幕外部的图片进行裁剪,canvas模式下还未做出优化,建议直接移除或者visible=false,之后可能会做出相应的优化,出于性能考虑,建议开发者最好还是自己掌控图片的尺寸。



zOrder和setChildIndex相比哪个效率更快?

        设置zOrder之后会引起一次排序和重绘(cache的时候是不重绘的,但在webGL模式的某些情况下可能影响较大),建议:间隔使用,zOrder虽然做了优化,但频繁使用依然会有性能瓶颈。

         由于zOrder是乱序排序,setChildIndex是有目的排序。如果每个子对象都调一次,zOrder效率会比setChildIndex高;如果一个对象调一次,setChildIndex效率会比zOrder高。

        请开发者根据自己的需求合理使用。


类似btn.clickHandler事件如何移除监听?

        clickHandler事件属于内部监听,无需开发者手动移除。

LayaAir引擎的是以什么方式渲染的?

        LayaAir默认是按照物理像素渲染的,显示会更加清晰;如果不想使用,可以通过设置Laya.stage.userHDRendering=false将该渲染模式关闭。

如何针对项目做出合理优化?

浏览器支持与产品对接问题