我正在学习Flex并尝试制作一个简单的RPG来练习。我正在使用视图状态在屏幕之间切换。现在我有一个显示我的角色信息的HomeView.mxml,显示我的库存物品的InventoryView.mxml,以及显示配备物品的EquipmentView.mxml。他们每个人都有各自的观点状态。
在我的主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是我定义的一个类,它扩展了Image组件,只设置了一个变量&#34; item&#34;它显示的项目,所以我可以得到名称,类型(并最终更改图像源) equipGroup也只是我在mxml中定义的用于保存设备项目的组
任何帮助都会很棒,谢谢
答案 0 :(得分:3)
有几种方法可以实现我认为你想要的东西。
首先是查看updateComplete event。而创建完成只会在组件的创建周期完成后执行一次;每次重新绘制组件时,都会触发updateComplete事件。我毫不怀疑,这个活动会做你想做的事;但是你要小心多次运行你的代码。很多东西都可能导致组件重绘,听起来你有一个非常具体的用例。
要看的第二件事是show事件。只要组件可见,它就会触发;当状态更改为显示此组件的状态时应该触发。
回答您的具体问题;您可以使用stageChangeComplete事件在状态更改完成时运行代码。在你的情况下,我相信这可能与show事件类似;但是你会在不同的地方听它。 stateChangeComplete事件是您在包含状态的组件中侦听的事件。 show事件是您在包含库存的组件中侦听的内容;我假设它是控制状态的组件的子项。
答案 1 :(得分:3)
您还可以使用由enterState
对象调度的State
事件...您可以在MXML中添加事件侦听器,如下所示:
<s:states>
<s:State name="myState" enterState="myEventHandler()"/>
</s:states>
有什么比这更好的'updateComplete'事件是每次组件完成一个完整的“Flex组件生命周期”的执行时,FlexEvent.UPDATE_COMPLETE
将被调度。因此,根据您正在做的事情,您可能会注意到此事件被调度(并且您的事件处理程序被触发)的次数超过您的需要。
通过使用enterState
事件处理程序,您的代码只会在进入特定状态时执行:)