2011-08-18 3 views
0

私は、ユーザーが賞としてボタン/バッジを獲得できるゲームに取り組んでいます。私は約500の賞がすべてあると推定しています。EventListeners/Handlersを1000個のボタンに対して処理する最も良い方法は?

私は、ユーザーが重複した/不要なバッジを銀行に売却し、銀行から新しいバッジを購入することを許可したいと考えています。

複数の特典フレームにバッジを表示しています。バッジの下には、「購入」ボタンと「売り」ボタンが表示されます。

私の質問は:何を処理するための最良の方法は、ほとんど購入する&ボタンを購入する? 1000 eventListenersと1000 eventHandlersをコーディングする方法はありますか?

"buy_mc1"、 "buy_mc2"などのように、マイボタンを段階的に名前を付けることもできます。この["buy_mc" + i]のリスナーを作成するループを作成します。しかし、私はこれらを賞に正しく結びつけているかどうかを確かめなければなりません。

現在、私のデータベースには、自分の.flaにムービークリップの名前を格納する「award_mc」フィールドがあります。これから、[db.award_mc + "_count"] .txtのように、カウントフィールドのような関連するアセットにアクセスすることができます。

残念ながら、このメソッドはループしたアクセスには適していません。

おそらく、購入/販売ボタンと同期しているムービークリップ名の配列を作成できます。例:

myArray = {aMissionAward、anotherAward、ubernessAward};

マイボタンは次のようになります。誰かがボタンをクリックするなど buy_0、buy_1、buy_2、

は、私はデータベースの「ubernessAward」を探して、その後、「ubernessAward」にbuy_2リンクすることができます。

ボタンから番号を取得する方法はありますか? eventListenersの設定をループすることができますが、正しいインデックス番号を処理するためにindividuatl eventHandlersを設定する必要がありますか?

私はこれを行う別の方法で提案しています。

--------------------------編集------------------- ---------

私の解決策です。私を正しい方向に向けるためのJens Struweの小道具。

ステージのボタンではこれを動作させることができませんでした。どうやら、ボタンは静的なクラスです。 MovieClipsは動的なので、MovieClipsを使用してこれを動作させることができました。ここに私がしたことがあります:

3つのムービークリップをステージに追加しました。 「mc0」、「mc1」、「mc2」と名前を付けました。私は、ムービークリップ名の配列にawardKeyを結ぶことができ、ここから

for (var i:Number=0; i<3; i++) 
{ 
    this["mc" + i].addEventListener(MouseEvent.CLICK, onMcClick); 
    this["mc" + i].awardKey = i; 
} 

function onMcClick(evt:MouseEvent):void 
{ 
    trace("MC ID = " +(evt.target).awardKey); 

    switch ((evt.target).awardKey) 
    { 
     case 0: 
      trace("  Do stuff for 0"); 
      break; 
     case 1: 
      trace("  Do stuff for 1"); 
      break; 
     case 2: 
      trace("  Do stuff for 2"); 
      break;  
    } 
} 

このAS3のコードを追加します。次に、MovieClipの名前を使用して自分のデータベースを読むことができます。

これは私が問題が発生したときに、私が最初にスタックオーバーフローに来る理由です。:)

答えて

6

  1. は、あなたの購入をしようと、ボタンのクリックイベントバブルを販売しています。

  2. は、各ボタンに、このようなmyButton.awardKey = "uberness";

  3. として一意の識別子を与える、あなたのすべてのボタンのコンテナに単一のイベントリスナーを登録します。

  4. クリックした実際のボタンはevent.targetで、賞のタイプはMyButton(event.target).awardKeyです。

+0

これはトリックでした!ステージ上のボタンに新しいプロパティを追加することができないことがわかりました。これは静的なクラスであるためです。 MovieClipは動的なので、代わりにMovieClipsを使用してこれを動作させることができました。私は元の投稿の終わりに私の解決策を掲載します。ありがとう。あなたは私に仕事のトンを救った! :) – user359519

+0

あなたの賞のすべての名前をつけるのが面倒ではない場合は、おそらくそれらをグリッドに設定して、xとyをクリックして適切な行/ col – divillysausages

0

これを処理するにはいくつかの方法があります。

カスタムイベントを使用しているのか、ネイティブのFlashイベントを使用しているのかは分かりません。バブル(あなたのイベントのドキュメントをチェックする)またはバブリングしているカスタムイベントを生成しているネイティブのFlashイベントを聞いている場合は、すべてのボタンを含む親DisplayObjectContainerを単に聞くことができます。次に、event.targetを使用して、実際にイベントを生成したボタンを特定します。あなたがこれを扱うことができる

もう一つの方法は、ハンドラ内でこのようなものを持って、その後、ADDED_TO_STAGEイベントをリッスンすることです:

protected function checkNewObject(e:Event):void { 
    if (e.target is YourButtonSubclass) { 
     var btn:YourButtonSubclass = e.target as YourButtonSubclass; 
     btn.addEventListener('SomeEvent', theHandler); 
    } 
} 

HTH。あなたは、ボタンのすべてを扱うことができる唯一のリスナー必要 エイミー

関連する問題