2013-07-01 50 views
0

首先,我是一個交易的動畫師,而不是程序員,並且只使用動作腳本,這樣對我來說只有兩天光禿禿的。刪除從私人函數調用的視頻類的孩子

我正在做一個測驗類型的工作動畫,點擊答案時會播放與您選擇的內容相關的簡短動畫FLV文件。正如我讀的所有內容都指向AS3是OOP,我決定製作一個包含FLV播放器的MovieClip,並將其鏈接到名爲FLV_Player.as的AS3文件。這樣我每次需要播放視頻時都可以創建FLV_Player的新實例。以下是該文件中的代碼,這似乎很好地工作:

package 
    { 
import fl.video.VideoEvent; 
import flash.events.VideoEvent; 
import flash.display.MovieClip; 

public class FLV_Player extends MovieClip 
{ 

    public function FLV_Player(NextVideo:String) 
    { 
     animation_player.source=(NextVideo); 
     animation_player.addEventListener(VideoEvent.COMPLETE, vcompleted); 
    } 

    private function vcompleted(e:VideoEvent):void 
    { 
     nextFrame(); 
    } 

} 

}

在DocumentClass.as

現在我的文件有這樣的代碼:

private function NewVideo(videoname:String) 
    { 
     var nextvideo:FLV_Player = new FLV_Player(videoname); 
     addChild(nextvideo); 
     nextvideo.x = 0; 
     nextvideo.y = 0; 
    } 

所以,當你點擊一個按鈕,轉到下一幀或任何提示符,它會調用NewVideo函數並傳遞接下來要播放的任何視頻的名稱。

NewVideo("Introduction.flv"); 

現在我敢肯定,我會在運行其他問題以後的路線,因爲我真的不知道什麼,我所做的是它是如何應該做的,但唯一的問題,我似乎在這個時間點正在移除視頻並轉到下一個(或前一個)框架來回答另一個問題。我試過了:

nextFrame();  
removeChild(newVideo); 

但它沒有奏效。好吧,它可能已經到了下一幀,但是視頻佔據了整個窗口,很難看到它是否存在。

那麼如何刪除我創建的視頻?主要的問題似乎是因爲我必須在私有函數中創建一個FLV_Player類的新實例,所以孩子在本地定義爲「var」,而不是「public」或「private」var,所以我不能再引用它。它告訴我,你只能在文檔類中創建一個「私有變量」,但如果我在那裏創建一個「私有變量」,它會在加載時創建類,而不是從函數傳遞視頻名稱參數。在加載時,我不知道我需要播放哪些視頻?

無論如何,我認爲寫這個讓我更困惑。如果任何人都可以提供幫助,我將非常感謝,謝謝。

+0

你可以聲明私有函數的外部變量沒有初始化它(所以只是'私人變種nextvideo :FLV_Player;'),然後在'NewVideo()'中簡單地設置它:'nextvideo = new FLV_Player(videoname);'。 –

回答

1

removeChild()必須從它所添加的同一個對象中調用。在這種情況下,您的DocumentClass。你現在要做的是告訴FLV_Player刪除它自己,由於幾個原因和代碼中的錯誤,這將不起作用。

正確做事情的方法是讓FLV_Player對象調度一個您的DocumentClass偵聽的自定義事件。您需要創建一個從Event繼承的新類來創建您的自定義事件。我會稱之爲「PlayerEvent」。在DisplayClass功能,你可以這樣做:

nextVideo.addEventListener(PlayerEvent.PLAYBACK_FINISHED, onPlaybackFinished); 
addChild(nextVideo); 

然後,你需要創建onPlaybackFinished方法:

private function onPlaybackFinished(event:PlayerEvent):void { 
    nextVideo.removeEventListener(PlayerEvent.PLAYBACK_FINISHED, onPlaybackFinished); 
    removeChild(nextVideo); 
} 

的FLV_Player類裏面,vcomplete功能應更改爲:

dispatchEvent(new Event(PlayerEvent.PLAYBACK_FINISHED)); 

或者,您可以將DocumentClass的指針傳遞給FLV_Player對象,但這非常混亂,會導致嚴重的問題,而且根本不符合OOP的精神。但如果你想懶惰,這是一個快速解決方案。

事件是一個極其 Actionscript 3的重要組成部分,我建議你閱讀它們。下面是一些很好的參考:
http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7fca.html
http://www.blog.mpcreation.pl/actionscript-3-0-basics-custom-events-part-1/

+0

我明白你的意思,但不是在實踐中。 是放在新的類文件PlayerEvent.as中的代碼的兩個最重要的片段?所以PlayerEvent類既添加也刪除了孩子?如果這是什麼時候該課程知道何時添加視頻,以及如何知道要添加哪個「nextVideo」? 我讀了一些關於自定義事件,並瞭解主要,但我不明白,我怎麼會運用到這種情況?這個答案很好,但已經打開了更多的問題! 對不起,我現在仍然是在我的第三天試圖讓我的頭周圍的這一切。 – user2527557

+0

是的,在玩過你的答案後,我只是困惑了。現在我不知道我在哪裏放置什麼。我不知道你列出的代碼在哪裏。 – user2527557

0

我認爲你是正確的,你的第一個問題是根本如何引用新的視頻,所以對我的評論擴大一點:你可以聲明變量而不分配一個值,因此您的NewVideo函數內不需要有var nextvideo。一類級別的變量代替,之後就可以引用你設置nextvideo,當你要刪除的視頻:

public class DocumentClass { 

    private var nextvideo:FLV_Player; 

    private function NewVideo(videoname:String) 
    { 
     nextvideo = new FLV_Player(videoname); 
     addChild(nextvideo); 
    } 

    private function removeVideo():void 
    { 
     removeChild(nextvideo); 
     nextvideo = null; 
    } 

}