2012-04-12 49 views
1

我正在學習Flex並試圖製作一個簡單的RPG來練習。我正在使用視圖狀態在屏幕之間切換。現在我有一個顯示我的角色信息的HomeView.mxml,顯示我的庫存項目的InventoryView.mxml,以及顯示裝備項目的EquipmentView.mxml。他們每個人都有自己的觀點狀態。當視圖狀態改變時運行一個函數Flex

在我的主要mxml文件中,我爲遊戲中的角色和物品的ArrayCollection創建了一個全局變量。它在mxml中爲庫存和設備創建了2個標籤,當我點擊標籤時,它會調用一個設置currentState =「EquipmentView」或「InventoryView」的點擊處理程序。

這個工作原理和狀態發生變化,各個視圖顯示正確。

我的問題是在我的EquipmentView狀態。當我第一次進入狀態時,它有一個creationComplete功能,它爲我的設備顯示圖像並設置點擊處理程序。當我點擊該項目時,它會「解開」它並將其從設備列表中刪除並移除圖像。這也可以正常工作,但是當我進入我的庫存視圖並「裝備」一件物品並返回到EquipmentView時,圖像不顯示。我有一個標籤,它可以計算我的設備列表變量的長度,當我切換視圖時它是準確的,但我不能讓圖像再次顯示。

當視圖改變時,有沒有辦法調用我的displayEquippedItems()函數(它最初是在creationComplete上調用的)?

這裏是我的功能:

protected function displayEquippedItems():void 
     { 
      Alert.show("Displaying Items"); 
      for (var i:int = 0; i<c.equippedItems.length; i++) 
      { 

       var item:Item = c.equippedItems.getItemAt(i) as Item; 
       switch (item.type) 
       {      
        case 'Weapon': 
         var il:ItemImage = new ItemImage(item); 
         il.source = "../assets/sword.gif"; 
         il.scaleX=.25; 
         il.scaleY=.25; 
         il.horizontalCenter=-80; 
         il.verticalCenter=-30; 
         il.addEventListener(MouseEvent.CLICK, equippedItemClicked); 
         equipGroup.addElement(il);       
         break; 
        default: 
         Alert.show("Didnt find a weapon"); 
         break; 
       } 
      } 
     } 

ItemImage是我定義的擴展圖像組件,只設置一個變量「項目」,以它會顯示這樣我就可以得到名稱的項目,鍵入一個類(並最終改變圖像源) 還equipGroup只是我在MXML定義爲持有設備項目

任何幫助將是巨大的一個羣體,由於

回答

3

有幾種方式來完成我相信你想至。

首先是看updateComplete event。而creationComplete只會在組件的創建週期完成後執行一次;每次組件重繪時,updateComplete事件都會觸發。我毫不懷疑,這個事件會做你想做的事情;然而,你會想要多次小心地運行你的代碼。許多事情可能會導致組件重繪,而且這聽起來像您有一個非常具體的用例。

第二件要看的事件是show事件。只要組件可見,就會觸發;當狀態改變到顯示這個組件的狀態時它應該觸發。

要回答您的具體問題;只要使用stageChangeComplete事件完成狀態更改,就可以運行代碼。在你的情況下,我相信這可能與展會活動類似。但你會在不同的地方聆聽它。 stateChangeComplete事件是您在包含狀態的組件中偵聽的內容。展示事件是您在包含廣告資源的組件中傾聽的內容;我認爲這是控制狀態的組件的孩子。

+0

updateComplete是完美的,當你的代碼將只執行,太感謝你了! 我曾經使用stateChangeComplete,但無法讓它工作,因爲我沒有在正確的地方聽它。 updateComplete似乎正在做我所需要的,我也會嘗試顯示以及 – Aheinlein 2012-04-12 20:45:18

3

您還可以使用由State對象調度的enterState事件...您可以在MXML中添加事件偵聽器是這樣的:

<s:states> 
    <s:State name="myState" enterState="myEventHandler()"/> 
</s:states> 

什麼是這個更好的那麼「updateComplete」事件是FlexEvent.UPDATE_COMPLETE將獲得每次出動組件完成一個完整的「Flex組件生命週期」的執行。所以,根據你在做什麼,你可能會注意到這個事件被調度(並且你的事件處理程序被觸發)的次數超過了你需要的次數。

通過使用enterState事件處理程序,進入該特定狀態:)

+0

我一直在考慮這個答案,並看到它;並決定我必須回來給它+1。好答案。 – JeffryHouser 2012-04-13 05:13:41

+0

謝謝你的回覆Sunil D.不幸的是,enterState並不適合我的特殊情況(這可能是我剛剛嘗試過的錯誤)。我的問題是我的事件處理程序在我的mxml視圖文件的