2012-03-25 79 views
3

我是AS3的新手,想了解外部加載的SWF如何在AS3中工作。自Flash 4/5以來,通常在Flash Web項目中有一個主SWF文件,然後將其他SWF文件加載到其中,通常用於網站或Web項目的各個「部分」。在主文件中,我們將使用蒙版動畫製作容器動畫片段(其中加載了外部片段/ SWF文件),並在動畫和轉場隨着片段完成加載並顯示加載的內容時播放。加載和使用SWF文件

在AS3中,我使用Loader類加載和顯示外部文件,我的主要問題是在與加載內容溝通,調用它的函數,或調用它根本職能。

在AS2中,我們可以使用someMovieClip.loadMovie(「ExternalContent.swf」)並將ExternalContent文件加載到someMovieClip中。您可以使用someMovieClip.function();訪問「External.swf」主時間軸上的函數。在「ExternalContent.swf」中,我們可以使用_root.function()來訪問正在加載的ExternalContent主文件中的函數。在AS3中這樣做看起來很奇怪和神經質,我覺得我在這裏錯過了一些相當基本的東西。

//Loading in ExternalContent.swf into the sprite 
//ExternalContent has a movieclip called "boxes" on it's main timeline 
//boxes has a boxesPrompt() function in it's timeline. 

var sprite:Sprite = new Sprite(); 
addChild(sprite); 

var loader:Loader = new Loader(); 
loader.load(new URLRequest("ExternalContent.swf")); 

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded); 

function onLoaded(event:Event):void 
{ 
    sprite.addChild(event.target.content); 

     sprite.boxes.boxesPrompt(); 
     //Flash gives the following compiler error at the above 
     //Scene 1, Layer 'Layer 1', Frame 1, Line 21 1119: Access of possibly undefined property boxes through a reference with static type flash.display:Sprite. 

     //But when I comment out sprite.boxes.boxesPrompt() and use this, it works: 
     event.target.content.boxes.boxesPrompt() 
} 

裏面的「ExternalContent.swf」只是跟蹤它的父,宏偉的父母,和偉大的盛大母公司的boxesPrompt()函數 - 跟蹤(this.parent.parent.parent);.當我使用「event.target.content.boxes.boxesPrompt()」在onLoaded事件處理程序中調用該函數時,它顯示Boxes對象(位於External.SWF的主時間軸上)具有父級動作片段,一個grand-parent sprite和一個偉大的祖父對象mainTimeline。

我想重新養育加載的內容到精靈將允許爲使用loadMovie()曾經是我的輕鬆訪問加載的內容 - 訪問加載的內容就像是它在加載的剪輯中直接存在的,但這根本不起作用。

所以要改一下,我的問題是:

  • 如何從主「裝載機」的SWF文件進行通信,與在加載的內容我不想使用event.target溝通.content。{etc},因爲那樣我只能解決Loader的event.complete事件處理程序中加載的內容。

  • 如何「重新加載」加載的內容,因此我可以將它放在加載器文件的主時間軸上的某個movieclip/sprite內,而不是使用一些真正漫長的複雜方式。

  • 如何從加載內容到主/加載程序文件進行通信。之前,我們會使用_root.functionName()來執行一些操作,例如播放從當前外部加載的「部分」跳轉到另一部分的動畫。我怎麼去做這件事。

回答

2

AS2 & AS3有很大的不同。但是你將不得不承認AS3已經發展爲AS2的改進。所以你做的任何轉換也是更好的。

對於例如:The _root在AS2允許全局對象&變量來訪問&隨時隨地改變,這是一個不好的做法&導致非維護的代碼中的一個項目。

說了這麼多,讓我解決您的問題:

  • 如果你能夠獲得訪問加載的內容與 event.target.content ...你應該保存它裏面,說類 變量&以後可能會在其他地方訪問它的類。

    你必須明白,你將只能 加載它後訪問的內容,所以必須等待它完成反正& event.complete處理程序可能是你最好的選擇。

  • 我懷疑,如果你可以選擇從加載的SWF &重新父它隨機內容到當前swf.As解釋你可能不會有很長的曲路。

  • 訪問家長可以通過多種方式來實現。您可以使用.parent或實際調用從通過其引用到子父SWF的功能。


var sprite; 
addChild(sprite); 

var loader:Loader = new Loader(); 
loader.load(new URLRequest("ExternalContent.swf")); 

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded); 

function onLoaded(event:Event):void 
{ 
     sprite = event.target.content; 

     //This should work 
     sprite.boxes.boxesPrompt(); 
} 

this example獲取更多信息。

+0

感謝您的幫助。這件事並不能安靜工作,但你的改變提供了有用的見解。 後精靈= event.target.content;正如你所建議的那樣,我必須再次添加Child()來顯示它。儘管之前將精靈添加到顯示列表中,但當它指向event.target.content(不在顯示列表上的東西)時,它並未顯示。 盒的母公司仍是SWF‘盒子’的‘根’影片剪輯坐在,並加載到精靈後,精靈包含一個影片剪輯(加載SWF的根)和影片剪輯包含框。我無法到達盒子,因爲我不知道root的名字。 – Qasim 2012-03-26 06:49:57