本篇就使用LayaFlash编译现有的AS3项目为H5项目会遇到的问题, 总结一些转换经验,让大家在JS调试时可以迅速判断问题产生的原因,降低转换现有项目的时间成本。
1.switch...case语句编译到JS的注意事项
某些情况下,AS3的switch...case语句被编译成JS,如果判断中用到了整数类型的变量,需要做强制转换。何时需要这种强制转换目前还没有更多细致的分析办法,但如果在JS的调试中的报错是在switch...case代码被执行之后,则可以先在swtich...case代码块中设置断点,查看运行至此处时条件中变量的值是否变成了浮点型的值,如果是,可以先修改将判断条件的变量强制转换为整数类型后再继续调试,试试报错能否解决。修改后的switch...case代码示例:
switch (int(type))//强制转换 { case 0: trace("value 0"); break; case 1: trace("value 1"); break; case 2: trace("value 2"); break; case 3: trace("value 3"); break; }
2.__JS__()方法
使用__JS__()的时候,传递的参数如果是引用类文件,必须加包路径,不然遇到有两个相同类名会出问题。
3.AS3语句编译到JS的注意事项
如遇到AS3做类型检查的语句,需要看是否有连续使用的情况,例如:
(mc as Sprite).addChild(b);
这种情况要将语句分成两部分编写,否则会在LayaFlash编译时发生编译报错:
var m:Sprite = mc as Sprite; m.addChild(b);
4.推荐在修改过的代码附近加上包含有特定关键字的注释,方便今后回溯问题时可以快速找到曾经修改过的内容。
5.不要使用LoaderInfo对象做Dictioinary的键名。
使用LoaderInfo对象作为Dictionary的键名会在需要用到这个键名的时候取不到值的问题。遇到这种情况,推荐改用LoaderInfo对象对应的Loader对象作为键名。
6.使用 if(value in {object}) 语句判断Dictoinary对象是否存在某个属性
if(value in {object})语句判断Dictionary对象某个属性是否存在的代码示例:
var value:Dictionary = new Dictionary(); var key:Object = {}; value[key] = "yes"; if(key in value){};
需要改用普通的判断条件:
if(value[DICKEY(key)] != null) { };
7.如果服务端传回数据大于1K,服务器请改成WebSocket。
8.要去掉位图的黑框,修改位图的混合模式为:blendMode = "add" 可以解决。
9.JSON类的版本需要使用Adobe原生版的JSON类,而非com包下的JSON类。
10.不支持SWC文件,若要使用SWC文件中定义的素材请改用应用域ApplicationDomain方式获取。
11.声音添加到时间轴上的资源,不支持从库里获取,要改成外部加载的方式才能使用。