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
答案 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]
。