OpenFL 影片剪辑不允许数组访问
Array access not allowed on OpenFL movieclips
已更新
我该怎么做?
我从 Main.hx
得到这个:
function onMouseOver(e:MouseEvent){
if(Std.is(e.currentTarget, MovieClip)){
initializer (cast e.currentTarget,["scaleX",1.5,"scaleY",1.5])
}
}
那么这就是我动画中的指向函数Class
//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]];
}
}
然后编译的时候出现错误:
Error: Array access is not allowed in 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"`
参考文献:https://groups.google.com/forum/#!topic/haxelang/_hkyt__Rrzw
在 AS3 中,您可以使用 []
(数组访问)通过字符串名称访问对象的字段。这叫做反射。
在 Haxe,Reflection
works differently - you need to make use of the 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]
.
已更新
我该怎么做?
我从 Main.hx
得到这个:
function onMouseOver(e:MouseEvent){
if(Std.is(e.currentTarget, MovieClip)){
initializer (cast e.currentTarget,["scaleX",1.5,"scaleY",1.5])
}
}
那么这就是我动画中的指向函数Class
//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]];
}
}
然后编译的时候出现错误:
Error: Array access is not allowed in 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"`
参考文献:https://groups.google.com/forum/#!topic/haxelang/_hkyt__Rrzw
在 AS3 中,您可以使用 []
(数组访问)通过字符串名称访问对象的字段。这叫做反射。
在 Haxe,Reflection
works differently - you need to make use of the 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]
.