0

私はActionscript3で作業しており、MMOのようなゲームを構築しています。特に、UIを担当しています。私はワークフローの多くでイベントを使用していますが、パートナーは、代わりにUIアセットに直接関数呼び出しを使用することを提案していました。次に例を示します。

  1. ユーザーのアバターの一部に色を変更するために使用するColorChooserクラスを作成しました。
  2. 色をクリックすると、ColorChooserはクリックされた(カラースペクトル画像の)ピクセルを読み取り、イベント(ColorChooser.COLOR_CHOSEN)をディスパッチします。
  3. 私のAvatarDesignerクラスはこのイベントをリッスンしています。
  4. イベントがディスパッチされると、AvatarDesignerのハンドラーイベントはたとえば、ColorChooserとしてtarget).chosenColorを読み取り、その色をアバターの選択された部分に適用します。

私のパートナーは、代わりに私が次のことを提案していました。

  1. ColorChooserにその親AvatarDesignerオブジェクト(_avatarDesigner )のインスタンスを指定します。
  2. 色がクリックされたら、クリックされたピクセル(var selectedColor:uint)を読み取り、 ColorChooserオブジェクト内から_avatarDesigner.colorAvatar(chosenColor)を呼び出します。

現在、ほとんどのUIでイベントを使用しているため、ドロップダウンメニュー、ボタン、テキストエリアなどのアセットを分離して再利用できます。このColorChooserオブジェクトを他の用途(ObjectDesigner、WallpaperDesigner、BuildingDesigner)に再利用することを想像しています。彼は、ColorChooserを他の目的で使用するたびに、ColorChooser内に条件を追加する方がよいと言ったので、おそらく次のようになります。

private function colorClicked(e:MouseEvent):void {
    var chosenColor:uint = *the color chosen (bitmapdata.getpixel());*
    switch(parent){
        case AvatarDesigner:    (parent as AvatarDesigner).colorChosen(chosenColor); 
                                break;
        case ObjectDesigner:    (parent as ObjectDesigner).colorChosen(chosenColor); 
                                break;
        case WallpaperDesigner: (parent as WallpaperDesigner).colorChosen(chosenColor); 
                                break;
        case BuildingDesigner:  (parent as BuildingDesigner).colorChosen(chosenColor); 
                                break;
    }
}

またはそのようなもの(おそらく、親をチェックする代わりに、コンストラクターなどで文字列「type」をチェックします)。どこかで使用するたびに戻ってケースを追加する必要があるので、これは私には奇妙に思えます。一方、イベントの場合は、そのイベントを起動して、親が何であるかに関係なく、処理するかどうかを指定できます。彼の推論のいくつかは次のとおりです。

  • イベントは、非同期イベントまたは入力(マウス、キーボード)にのみ使用する必要があります
  • ディスパッチされたイベントとリスナーはより多くのCPUを使用します
  • 直接関数呼び出しは、現在のスレッドの一部であり、わずかに異なる時間にディスパッチおよび処理されないため、より高速です。
  • Actionscript3およびAway3D(3Dに使用)は、この方法でイベントを使用することはありません

イベントは次のような理由で適切だと思いますが、

  • オブジェクトを親から完全に独立させて、オブジェクトをより再利用可能にします
  • ディスパッチされたイベントとリスナーがCPUを消費することはないと思います(たとえば、特定のSpriteがENTER_FRAME、MOUSE_OUT、ADDED_TO_STAGEなどの特定の時間に多くのイベントをディスパッチしているため)。
  • 順序に依存するタスクがdispatchEventの後にリスナーで発生する場合、わずかな非同期性は重要ではありません。
  • Away3Dは、APIを少し掘り下げた後、このように使用していると思います。

誰かがこれに光を当てることができますか?このアセットを別のタイプの親で使用するたびに、たとえば「ShinyButton」の新しいロジック条件でハードコーディングする価値があるでしょうか。イベントやリスナーがCPUを使用している場合でも、このような条件を追加すると、少しスパゲッティっぽくなりませんか?

また、私の一生の間、イベントが良いか悪いか、そしてその理由についてのActionscript3のベストプラクティスを見つけることができません。また、イベントが低レベルでどのように使用されるかを知っている人がいたらいいのですが。

読んでくれてありがとう!

4

2 に答える 2

3

あなたのさまざまな意見は、本当の理由よりも習慣に基づいていると思います。

個人的には、私が考えている最もオープンで柔軟なソリューションである個人イベント モデルを使用します。

しかし、 に戻る必要なくコールバック関数を使用したい場合は、次のような必須メソッドをColorChooser使用して Interface like を作成できます(プログラミングのベスト プラクティスについて言えば、メソッド名は "たくさんを意味しない「colorChoen」のような形容詞や名前の代わりに「applyColor」または「choseColor」)IColorReceiverapplyColor(color:Color){};

次に、メソッドで が実装されcolorPicked(e:MouseEvent){}ていることを確認し、 を使用したテスト以外のテストを使用せずに呼び出します。従来の継承でも動作する可能性がありますが、柔軟性が低いため、より多くのコードが必要になります。parentIColorReceiverapplyColor(chosenColor);IColorReceiver

私はコードを提供しませんが、あなたは妥当なレベルを持っているようですので、私は自信を持っています. ;)

(私の英語が正しいことを願っています)

于 2012-12-21T08:35:25.137 に答える
1

短い答えですが、あなたは正しく、あなたの友人は間違っていると思います。認識されたパフォーマンスの向上は (もしあったとしても) ごくわずかであり、導入された密結合により、正しく予想されるように、他の状況でコンポーネントを再利用することが難しくなり、プロジェクト全体を維持することがより困難になります。

ActionScript はイベントベースの非同期言語であり、友人に反対するのではなく、それを受け入れるように勧めれば、友人に好意を示すことができます。

ActionScript 3.0 開発のベスト プラクティスに関するあなたの質問に答えるには、Flex フレームワークのいくつかのコンポーネントの構造を見るよりも悪いことがあると思います。これらはアドビのエンジニアによって開発されたものであり、ベスト プラクティスと見なされるもののデモンストレーションと見なすことができます。さまざまなコンポーネントまたはコンポーネント アクター間の密結合を回避するためにイベントを多用し、友人が提案するような悪臭を放つコードの使用を最小限に抑えます。

于 2012-12-21T13:47:18.037 に答える