2012-04-12 50 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视图文件的