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参考:https://groups.google.com/forum/#!topic/haxelag/_hkyt_Rzw
在AS3中,您可以使用[]
(数组访问(通过对象的字符串名称访问对象的字段。这被称为反射。
在Haxe中,Reflection
的工作方式不同——您需要使用Reflect API。
这被认为是一种糟糕的做法——它不是类型安全的,这意味着编译器在处理错误消息方面几乎无能为力,而且速度也很慢。这就是为什么该用法非常明确地表明反射实际上正在进行(而在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]);
}
}
顺便说一句,循环运行的时间太长了,因为你只使用了数组中一半的值——如果你不像我那样把它除以二,你最终会得到[scaleX, scaleY, null, null]
,而不是所需的[scaleX, scaleY]
。