2015-08-29 24 views
1

UDATED不允許OpenFL數組訪問動畫片段

我怎麼去呢?

我得到這個從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中不允許數組訪問

我該如何解決?

編輯:

瓦爾:是的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

你在做什麼/什麼是ini,什麼是vars?你來自AS3嗎?如果這就是你想要做的,反思在Haxe中不會這樣工作。 – Gama11

+0

我來自AS3,具有基本知識 –

回答

3

在AS3中,可以使用[](數組訪問)通過字符串名訪問對象的字段。這叫做反射。您需要使用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]); 
     } 
} 

順便說一句,你的循環中運行太久,因爲你只用一半的值的數組中 - 如果您不像我那樣將其分成兩份,您將以[scaleX, scaleY, null, null]而不是所需的[scaleX, scaleY]結束。

+0

我做了一個編輯。在我的原始代碼中,vars.length除以2,仍然導致錯誤。反射可能只是我的編碼中的偶然,我想盡可能避免它。我該如何解決錯誤並避免反思。它使用mc:Dynamic對mc:MovieClip解決了這個問題,但它不會跨平臺兼容導出到html5。 –

+0

看來我的代碼看起來像反射,有沒有解決不使用反射? –

+0

嗨,我想你已經正確回答我的問題,避免反射是另一個問題,我試圖做的是放大所有「重要」的電影剪輯在舞臺上的鼠標懸停。自那以後我還沒有解決。 –

相關問題