2010-12-11 58 views
0

使用AS3/Flash CS4運行時加載的swf中的調用函數

好的感謝所有閱讀此內容的人。我的問題具體是我正在設計一個帶有控件的用戶界面。 5個按鈕向左旋轉,向右旋轉,放大,縮小和自動旋轉。界面本身工作正常,我可以跟蹤按鈕點擊,切換自動旋轉按鈕等...

我的程序讀取一個XML文件。加載一些圖像,爲每個圖像填充一個包含鏈接的數組,並在點擊圖像時,加載程序從URL加載swf並將其顯示在屏幕上。沒問題。

現在我原來在runtime_loaded.fla庫中有縮放控件用戶界面,鼠標偵聽器在同一個鏈接文檔類中。當它在相同的代碼中時,該接口與runtime_loaded.swf中的movieClip協同工作。

現在爲了實踐良好的編碼,我決定從runtime_loaded.fla中刪除UI並將其添加到Main.fla中。這是非常重要的,因爲主要處理可能的100個圖像/對象,每個圖像/對象都有自己獨特的swf鏈接。如果我決定改變界面的外觀,但讓函數調用保持不變,我可以根據自己的需要添加儘可能多的main.fla來代替runtime_loaded.fla,這對於每一個對象都是必須的。

文件結構

Main.fla <- interface in the library. 5 mouse event functions. Inside each function calls 
      a property of loaded_swf (loaded_swf.rotateLeft, loaded_swf.rotateRight) etc... 
Runtime_loaded.fla <- links specificObject.as in properties (AS3/CS4) 
specificObject.as <- has 5 public static functions{ rotateRight, rotateLeft, zoomIn, zoomOut, toggleAutoRotate } 

守則

//showFlashBox 
function showFlashBox(temp_string:String):void { 
if(!flash_box_on){ 
var temp_top:uint = numChildren; 
addChildAt(FlashBoxContainer,temp_top); 
newXButton.addEventListener(MouseEvent.CLICK, flashBoxXClick); 

1. addChild(new_loader); 
2. var url:URLRequest = new URLRequest(temp_string); 
new_loader.x = 0; 
new_loader.y = 0; 
new_loader.load(url); 
3. new_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotSwf); 

flash_box_on = true; 
} 
} 

function gotSwf(e:Event){ 
4. //loaded_swf = e.target.content; 
    trace(e.target.content); 
5. new_zoom_controls.button_minus.addEventListener(MouseEvent.CLICK, zoomOutFunction); 
    new_zoom_controls.button_plus.addEventListener(MouseEvent.CLICK, zoomInFunction); 
    new_zoom_controls.button_left.addEventListener(MouseEvent.CLICK, rotateLeftFunction); 
    new_zoom_controls.button_right.addEventListener(MouseEvent.CLICK, rotateRightFunction); 
    new_zoom_controls.button_rotate.addEventListener(MouseEvent.CLICK, toggleRotateFunction); 
    function rotateRightFunction(e:MouseEvent){ 
6. //loaded_swf.rotateRight(); 
    } 
    function rotateLeftFunction(e:MouseEvent){ 
    //loaded_swf.rotateLeft(); 
    } 
    function zoomInFunction(e:MouseEvent){ 
    //loaded_swf.zoomIn(); 
    } 
    function zoomOutFunction(e:MouseEvent){ 
    //loaded_swf.zoomOut(); 
    } 
    function toggleRotateFunction(e:MouseEvent){ 
    //loaded_swf.toggleAutoRotate(); 
    if(new_zoom_controls.button_rotate.currentFrame == 1){ 
    new_zoom_controls.button_rotate.gotoAndStop(2); 
    } 
    else new_zoom_controls.button_rotate.gotoAndStop(1); 
    } 
    new_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, gotSwf); 
} 

如果按照步驟1-6你看我加載瑞士法郎,鼠標事件偵聽器的步驟,然後單擊處理程序,然後調用var loaded_swf:Object;

public static function rotateLeft():void 
    { 
    object.yaw(animation_turning_speed); 
    } 

    public static function rotateRight():void 
    { 
    object.yaw(-animation_turning_speed); 
    } 

如果我運行main.fla並嘗試單擊按鈕。有時候是這樣的。

ReferenceError: Error #1069: Property rotateRight not found on ThreedsKU39web and there is no default value. at MethodInfo-82() ReferenceError: Error #1069: Property rotateLeft not found on ThreedsKU39web and there is no default value. at MethodInfo-83()

回答

0

我在完成提交之前偶然發現了答案,因爲我通過代碼複製它。但是,在昨天晚上花了幾個小時令人沮喪的時刻之後,我會發布它,以確保下一個傢伙不會遇到同樣的消亡。

答案在於運行時加載的swf類的功能。

public static function rotateRight():void 
{ 
    object.yaw(-animation_turning_speed); 
} 

原來它只需要是公共職能,而不是公共靜態。 主要是人爲錯誤,因爲文件正在工作之後,我試圖將代碼複製到所有其他對象文件中,並以某種方式靜態回到那裏並將其搞亂。所以爲了將來在外部swf中加載時的參考,公共函數應該做到這一點。 *請注意,我的很多變量在聲明爲公共靜態之前都會返回錯誤。

相關問題