OpenFL动画片段

时间:2015-08-29 06:20:21

标签: haxe openfl

UDATED

我该怎么做?

我是从Main.hx得到的:

function onMouseOver(e:MouseEvent){
     if(Std.is(e.currentTarget, MovieClip)){
         initializer (cast e.currentTarget,["scaleX",1.5,"scaleY",1.5])
     }
}

然后这是我的动画类中的指向函数

//here if i set mc:Dynamic everything goes great! but when this one

function initializer(mc:MovieClip, vars:Array<Dynamic>){
       var varsLength:Int = Math.round(vars.length/2);

       for(m in 0...varsLength){

            ini[m] = mc[vars[2*m]];

       }
}

然后当我编译它时,会出现错误:

  

错误:flash.display.MovieClip中不允许访问数组

如何解决此问题?

编辑:

vars:是MovieClip的属性,例如当我传递这些参数时:

initializer (mcClip1,["scaleX",1.5,"scaleY",1.5])

所以:

vars = ["scaleX",1.5,"scaleY",1.5]

和:

ini[m] will store "scaleX" and "scaleY"`

X-Ref:https://groups.google.com/forum/#!topic/haxelang/_hkyt__Rrzw

1 个答案:

答案 0 :(得分:3)

在AS3中,您可以使用[](数组访问)通过字符串名称访问对象的字段。这称为 Reflection

在Haxe,Reflection works differently - 您需要使用Reflect API

它被认为是不好的做法 - 它不是类型安全的,这意味着编译器可以做很少的事情来帮助你处理错误消息,而且它也很慢。这就是为什么用法非常明确地表明Reflection实际上正在进行(在AS3中,这个事实有些隐藏)。 考虑是否还有其他解决此问题的方法,不需要反思。

现在,回到你的例子,这里是Haxe的样子:

function onMouseOver(e:MouseEvent){
     if (Std.is(e.currentTarget, MovieClip)) {
         initializer(cast e.currentTarget, ["scaleX", 1.5, "scaleY", 1.5])
     }
}

function initializer(mc:MovieClip, vars:Array<Dynamic>) {
       for (m in 0...Std.int(vars.length / 2)) {
            ini[m] = Reflect.getProperty(mc, vars[2*m]);
       }
}

顺便说一句,你的循环运行的时间太长了,因为你只使用数组中的一半值 - 如果你不像我那样将它除以2,你最终会得到{{1而不是所需的[scaleX, scaleY, null, null]