2011-12-08 34 views
1

我正在編寫一個通用圖形引擎,它將使用基爾希爾優勢在FP11上工作,並且還可以在FP10中使用舊軟件blitting工作。Flash Player不同版本的不同代碼

所以,我正在擺脫實現這個目標的最好方法是什麼?

首先,我認爲如果我將爲FP11編譯swf,並且如果播放器的版本不是11,將不會使用新類,那麼一切都會正常工作。但是我錯了。令我驚訝的是,如果我使用導入的FP11庫運行代碼,即使它們未被調用,也會出現「VerifyError:Error#1014。Couln't find class flash.display3D :: Context3D」錯誤。

我以爲FP只會在嘗試訪問一個缺席的課程時拋出這個信息,但這是不對的。它只是當我試圖運行時引發錯誤.swf

那麼,有沒有辦法做到這一點?我想使用預加載器加載不同的SWF,具體取決於版本,但是維護和編譯2個不同的SWF非常混亂。

還有其他方法嗎?

回答

2

如果您使用Flash(與Flex或其他工具相對),我相信您唯一的選擇可能是條件編譯。當我不得不在CS5中處理這個問題時,我找不到其他任何東西。

我最終做的是我爲各種配置定義了幾個常量,然後編譯了幾個版本的.swf。我根據瀏覽器中的播放器檢測代碼加載了正確的.swf文件。如果你想要在Newgrounds等地方使用.swf,那真的是一團糟。

1

flash apis不能向前兼容。如果你想要一個flash 11 api,你需要製作一個flash 11+ swf。原因是swf 10可以愉快地創建它自己的Stage3D類。如果它突然與swf 11中的內置類衝突,這將打破向後兼容性。所以你可以只有一個,向後或向前的兼容性。

1

編輯

對不起,我沒注意到你不想支持不同版本的庫。在這種情況下,沒有辦法 - 當FP處理SWF的字節碼並找到未知引用時,它會拋出VerifyError。當然,你可以使用getDefinitionByName()和動態訪問,但它的很慢,很慢。

爲了儘量減少單獨支持的代碼量,你可以使用與主要功能和主權財富基金與版本相關的功能的深港西部通道,所以在初始化階段的主類的lib將檢查FP版本並加載相應的SWF 。


這就是所謂的動態鏈接,並且有一種方法:

  1. 創建的所有播放器版本相關的功能(public interface MyInterface...)的接口。該接口不應包含對版本相關API的任何引用。編譯這個接口(它可能只是單個.as文件)到SWC中(讓它爲lib-intf.swc)。

  2. 創建兩個獨立該接口的實現;第一個將使用新的API,第二個不會(它可能只是一個佔位符,但也可能是一個替代實現)。之後我們需要將這些實現編譯爲SWF,所以我們需要擴展Sprite的主類。最簡單的方法是讓這些主類實現我們的接口(即public class MyImplementationA extends Sprite implements MyInterface...,以及MyImplementationB的相同)。它們將只是空的Sprites,但它們將包含接口方法。

  3. 編譯這兩種實現獨立地成單獨的SW ˚F S(lib-a.swflib-b.swf)。編譯時,將lib-intf.swc作爲外部庫(-external-library-path編譯器參數或IDE中的「外部」鏈接類型)。

  4. 現在,當編譯你的根應用程序時,包括lib-intf.swc和往常一樣的庫(-library-path編譯參數或「合併到IDE中的代碼」鏈接類型)。根本不包括與版本相關的類。因此,在根應用程序中,您只需引用與版本無關的接口。當您的應用程序啓動時,請檢查FP版本,並根據它使用Loader類加載適當的SWF。您必須將其加載到主應用程序域中,而不是它的子項(這是默認選項; more details)。

  5. 當SWF加載後,將其投射到界面:var versionDependentImpl:MyInterface = loader.content as MyInterface。請記住,我們的SWF的主要類實現MyInterface,所以此演員陣容將工作。

  6. 就是這樣 - 現在你可以使用你的實現:versionDependentImpl.someMethod()。當然,someMethod應該在MyInterface中定義。

所以,這裏的技巧是從一個SWF文件動態加載實現。雖然根應用程序不知道關於此SWF內部類的任何內容,但我們可以使用它的主類的方法,因爲我們使其實現了一個已編譯到根應用程序中的接口。

這種方法是可擴展的:例如,您可以定義具有返回其他接口的方法的主接口。您甚至可以將實現之間共享的具體類包含到lib-intf.swc中,只要它們不使用與版本相關的API。