转换技巧与经验分享

发布时间:2015-10-29

  本篇就使用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.声音添加到时间轴上的资源,不支持从库里获取,要改成外部加载的方式才能使用。