1

私はFlexを学び、練習用の簡単なRPGを作成しようとしています。画面を切り替えるためにビューステートを使用しています。現在、キャラクター情報を表示するHomeView.mxml、インベントリアイテムを表示するInventoryView.mxml、および装備アイテムを表示するEquipmentView.mxmlがあります。それぞれにそれぞれのビューステートがあります。

メインのmxmlファイルで、ゲーム内のキャラクターとアイテムのArrayCollectionのグローバル変数を作成します。在庫と機器のmxmlに2つのラベルを作成し、ラベルをクリックすると、currentState="EquipmentView"または"InventoryView"を設定するクリックハンドラーを呼び出します。

これが機能し、状態が変化し、それぞれのビューが正しく表示されます。

私の問題はEquipmentView状態にあります。初めて状態に入ると、機器の画像を表示し、クリックハンドラーを設定するcreationComplete関数があります。アイテムをクリックすると、アイテムが「装備解除」され、機器リストから削除され、画像が削除されます。これも問題なく機能しますが、インベントリビューに移動してアイテムを「装備」し、EquipmentViewに戻ると、画像が表示されません。私のequipmentList変数の長さをカウントするラベルがあり、ビューを切り替えたときに正確ですが、画像を再度表示することができません。

ビューが変更されたときに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

あなたがやりたいと私が信じていることを達成する方法はいくつかあります。

1つ目は、updateCompleteイベントを確認することです。ただし、creationCompleteは、コンポーネントの作成サイクルが完了した後、1回だけ実行されます。updateCompleteイベントは、コンポーネントが再描画されるたびに発生します。私は間違いなく、このイベントはあなたが望むことをするでしょう。ただし、コードを何度も実行する場合は注意が必要です。多くのことがコンポーネントの再描画を引き起こす可能性があり、非常に特殊なユースケースがあるように思われます。

次に注目するのはショーイベントです。これは、コンポーネントが表示されるたびに発生します。これは、状態がこのコンポーネントを示す状態に変化したときに発生するはずです。

あなたの特定の質問に答えるために; stageChangeCompleteイベントを使用すると、状態の変更が完了するたびにコードを実行できます。あなたの場合、これはショーイベントと同じように機能すると思います。しかし、あなたはさまざまな場所でそれを聞いているでしょう。stateChangeCompleteイベントは、状態を含むコンポーネントでリッスンするものです。ショーイベントは、インベントリを含むコンポーネントでリッスンするものです。これは、状態を制御するコンポーネントの子であると思います。

于 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 に答える