LayaFlash宏编译

发布时间:2015-10-28

1、什么是LayaFlash宏编译?
  LayaFlash宏定义了一个代表特定内容的标识符,它们包括“//[IF-SCRIPT] ”、//[IF- SCRIPT-BEGIN]”、“//[IF-SCRIPT-END] ”、“/*[IF-FLASH]*/ ”、“/*[IF-FLASH-BEGIN]*/”、“/*[IF-FLASH-END]*/”。LayaCompiler编译器在编译时会把源代码中出现的宏标识符替换成编译器定义的代码。


2、为什么要使用宏编译
  由于Flash AS3与JavaScript存在语言级的差异,LayaCompiler无法正确编译的时候,通过宏的标识,编译器可准确识别,达到开发者需求的结果。

  比如LayaFlash宏在使用的过程中,“/*[IF-FLASH]*/”宏并不影响在该标识之后的AS3代码执行,但是该行代码经过编译器识别后,在JavaScript中会被注释掉,不会运行。而“//[IF-SCRIPT]”宏在AS3项目运行时作为注释代码并不被执行,但是该代码被编译后,会删除掉注释代码,在JavaScript中获得正常的执行。

  本文中将会通过实例代码,加深LayaFlash开发者对宏编译的理解。

3、宏编译示例代码 

3.1 LayaFlash单行宏编译写法

private function byteArrayReadIntTest():void
{
    var byteArray:ByteArray = new ByteArray();
    byteArray.writeInt(100);
    byteArray.position = 0;
    var value:int;
    /*[IF-FLASH]*/value = byteArray.readUnsignedInt();
    //[IF-SCRIPT]value = byteArray.readInt();
}


单行宏用法说明

  1、AS3项目中 value = byteArray.readUnsignedInt(); 被正常执行,编译后JS中不被执行

  2、AS3项目中 value = byteArray.readInt(); 视为注释代码不被执行,编译时会去掉注释,JS中被正常执行

  3、在AS3类文件的第一行添加/*[IF-FLASH]*/,这个AS3类将不被编译到H5项目中。


3.2 LayaFlash多行宏的写法

private function multiLineMacroCompilationTest():void
{
    var flag:Boolean;
    var msg:String;
    var result:int = 0;
    /*[IF-FLASH-BEGIN]*/
    if (!flag)
    {
        msg = "AS3";
        flag = true;
    }
    /*[IF-FLASH-END]*/
    if (flag)
    {
        result = 100;
    }
    /*[IF-SCRIPT-BEGIN]
       else {
       msg = "JS";
       }
     [IF-SCRIPT-END]*/
    trace(msg + ", let's go! Result is " + result);
}


多行宏写法说明

    1、/*[IF-FLASH-BEGIN]*/ 与/*[IF-SCRIPT-BEGIN] 代表多行宏的开始

    2、/*[IF-FLASH-END]*/ 与[IF-SCRIPT-END]*/ 代表多行宏的结束

    3、/*[IF-FLASH-BEGIN]*/与/*[IF-FLASH-END]*/ 之间的代码在Flash中被正常运行,在编译后的JS中不被执行

    4、/*[IF-SCRIPT-BEGIN] 与[IF-SCRIPT-END]*/ 之间的代码在Flash中被视为注释代码,在编译时会去掉注释,JS中被正常执行


4、额外的说明:

由于旧的教程里//[IF-JS]也用于单行宏编译,作用与//[IF-SCRIPT]等同,因此,LayaFlash宏继续保持了对//[IF-JS]的支持。但是由于/*[IF-JS-BEGIN] 与[IF-JS-END]*/的写法是被禁止的,对于新的LayaFlash开发者容易混淆,因此新版教程里,已经不再重点介绍/[IF-JS]的作用,开发者知晓其与//[IF-SCRIPT]作用等同即可。