2011-01-10 55 views
1

對於我的比賽,我在做遊戲主視圖作爲普通的Flash/AS3類,類似:結束語一個Flash/AS3雪碧作爲一個Flex MXML組件

public class GameArena extends Sprite 

這簡直是在一個大的矩形哪些遊戲對象被繪製,所以不需要花哨的UI,並且我想要保持主遊戲引擎無Flex,所以我可以使用Sprites而不是較重的Flex組件。

然而,對於整個遊戲/應用程序,我仍然想使用Flex的GUI /佈局。所以我想我可以創建一個Flex類的子類UIComponent,其中有一個GameArena對象作爲一個孩子......現在我可以在MXML以此爲標準的Flex組件。

例如

public class ArenaView extends UIComponent 
    { 
    public var gameArena:GameArena; 
    override protected function createChildren():void 
    { 
     super.createChildren(); 
     if (!gameArena) 
     { 
      gameArena = new GameArena(); 
      gameArena.width = 200; 
      gameArena.height = 200; 
      addChild(gameArena); 
     } 
    } 
} 

然後,我在我的主應用程序MXML是一個簡單的一行:

<logic:Arena x="0" y="0" width="50%" height="100%" name="TestArenaPanel" /> 

但到目前爲止,而我的代碼編譯,閃存類是沒有得到呈現。也許這很簡單,但我想問問這是一種合理的方法,還是有更好的方法?

順便說一句:我已經有了「應該使用Flex」對話很多次。如果你想討論這個問題,請在評論中這樣做,但要保留主題的答案。

+1

在我看來,你所做的事情是有道理的,我看不出爲什麼它不起作用。 – 2011-01-10 12:09:38

+0

那麼這是有益的,至少有助於看到這個想法不愚蠢:) – 2011-01-10 12:27:54

+0

是的,它應該工作,可能還有其他錯誤 – 2011-01-10 13:31:29

回答

1

你沒告訴我們您的措施()的代碼,也沒有ArenaView Flex組件的updateDisplayList()代碼。您是否在measure()中設置measuredWidth和measuredHeight屬性?你是否在updateDisplayList()中定位並確定了gameArena的大小?

記住,父母總是負責在大小調整和定位它的孩子。我想你的組件並沒有給gameArena一個大小,有效地使它在零寬度和零高度時不可見。嘗試這樣的:

override protected function upldateDisplayList(unscaledWidth:int, unscaledHeight: int):void{ 
super.updateDisplayList(unscaledWidth, unscaledHeight); 
gameArena.setActualSize(unscaledWidth, unscaledHeight); 
gameArea.move(0,0); 
} 

這是我在瀏覽器中寫的代碼,但它應該適度接近。

許多Flex容器都會嘗試放置自己的孩子,但我不認爲如果組件沒有設置measuredWidth/measuredHeight propeties,則嘗試調整它們的大小。你擴展的UIComponent沒有這個代碼。

3

我認爲你是有點一種奇怪的方式去了解這一點。不要爲你的GameView類製作包裝,而要讓GameView擴展一個已經爲你製作的包裝:SpriteVisualElement。那麼你應該可以直接在mxml中使用你的GameView,而不必將它包裝在ArenaView中。

什麼可能會讓你感到困惑的是Flex的大小/佈局以及像Sprite和Shape這樣的低級別級別的大小之間的差異。您可能已經知道,當您在Sprite內繪製時,精靈的寬度將會反映您繪圖的最遠邊界。現在通過Flex,父母告訴孩子它應該是多大(通過setActualSize())。

然後,孩子可能會或可能不會要求父,「但我不希望是大小!我想成爲大小」,並從其measure()呈現給父值這樣做功能。

最後,父母仍然告訴孩子究竟應該是多大,但是作爲一個好父母,它允許孩子有一些自由去做它想要的新尺寸(所以孩子的updateDisplayList()被調用並且它可以將蠟筆拉出來,並根據其尺寸製作出漂亮的圖片)。

帶着這個小故事,你必須決定:我的GameView是否應該自己抽出來?或者,我的GameView應該根據可用的瀏覽器窗口大小等參數來繪製它需要的內容?