1

我正在学习 Flex 并尝试制作一个简单的 RPG 来练习。我正在使用视图状态在屏幕之间切换。现在我有一个 HomeView.mxml 显示我的角色信息,InventoryView.mxml 显示我的库存物品,以及 EquipmentView.mxml 显示装备物品。他们每个人都有各自的视图状态。

在我的主 mxml 文件中,我为角色创建了一个全局变量,并为游戏中的项目创建了一个 ArrayCollection。它在 mxml 中为 Inventory 和 Equipment 创建 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 是我定义的一个类,它扩展了 Image 组件,并且只为它显示的 Item 设置了一个变量“item”,这样我就可以获得名称、类型(并最终更改图像源) 此外,equipGroup 只是我在其中定义的一个组用于保存设备项目的 mxml

任何帮助都会很棒,谢谢

4

2 回答 2

3

有几种方法可以完成我相信你想要的。

首先是查看updateComplete 事件。而 creationComplete 只会在组件的创建周期完成后执行一次;每次重绘组件时都会触发 updateComplete 事件。我毫不怀疑,这个活动会如你所愿;但是,您需要小心运行代码太多次。很多事情都可能导致组件重绘,听起来你有一个非常具体的用例。

要看的第二件事是演出活动。只要组件可见,就会触发;当状态更改为显示此组件的状态时应该触发。

回答您的具体问题;只要状态更改完成,您就可以使用stageChangeComplete事件运行代码。在您的情况下,我相信这可能与演出活动类似;但你会在不同的地方听它。stateChangeComplete 事件是您在包含状态的组件中监听的事件。show 事件是您在包含库存的组件中监听的事件;我假设它是控制状态的组件的子组件。

于 2012-04-12T20:35:05.820 回答
3

您还可以使用enterState由对象调度的事件State...您可以像这样在 MXML 中添加事件侦听器:

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

与 'updateComplete' 事件相比,更好的是FlexEvent.UPDATE_COMPLETE每次组件完成执行完整的“Flex 组件生命周期”时都会调度该事件。因此,根据您正在执行的操作,您可能会注意到该事件被分派(并且您的事件处理程序被触发)的次数超出了您的需要。

通过使用enterState事件处理程序,您的代码只会在进入该特定状态时执行:)

于 2012-04-13T03:14:46.173 回答