[]Laya中的宏编译要怎么用啊

flash模式下用                                                
/*[IF-FLASH]trace("layabox")*/
h5模式下用
//[IF-SCRIPT]alert("layabox")
区域编译宏,只会在h5模式下生效
/*[IF-SCRIPT-BEGIN]trace("hello-h5")[IF-SCRIPT-END]*/
//代码直译方法,直接调用h5的方法
__JS__("alert(100)");//直译的意思就是括号里写什么就翻译什么
教程里有这些内容,具体flash模式和h5模式指的是什么呢?不是同一套代码吗?我在代码里要怎么写?有例子吗?
已邀请:

charley

赞同来自: WLDragon layabox

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.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]作用等同即可。

layabox

赞同来自: WLDragon jayoooo

问题


__JS__("alert(100)");//直译的意思就是括号里写什么就翻译什么


解答:
__JS__是LayaFlash提供的直译方法,这里核心在于直译,顾名思义,所谓直译就是把这个方法中传入的字符串,不经任何改变,直接编译到JS文件中,因此,不要被__JS__的命名迷惑,__JS__方法内可以编写任何你想编写的代码。当然,你要考虑清楚后果,编写的代码运行环境会不会支持。所以对于HTML5项目开发来讲,还是以引用JS代码为主要目的。

通过__JS__这个方法 ,开发者可以直接在AS3项目中写JavaScript代码,从而实现JS代码和AS3代码混合编写的目的。由于__JS__()中引用的代码在AS3项目中并不生效,仅是编译成JS代码时在浏览器或LayaPlayer运行器中被运行,对于想同时发布Flash和HTML5版本等多版本的开发者,请谨慎使用。

下面通过代码示例,看一下具体用法:
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;

public class Main extends Sprite
{
public function Main():void
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;

__JS__Test();
}

private function __JS__Test():void
{
__JS__("window.alert('__JS__语句把我召唤出来了')");
}
}
}
 上面的代码AS3中不会有任何效果,编译成JS后,在Chrome下的执行效果如下:

要回复问题请先

商务合作
商务合作