私はActionscript3で作業しており、MMOのようなゲームを構築しています。特に、UIを担当しています。私はワークフローの多くでイベントを使用していますが、パートナーは、代わりにUIアセットに直接関数呼び出しを使用することを提案していました。次に例を示します。
- ユーザーのアバターの一部に色を変更するために使用するColorChooserクラスを作成しました。
- 色をクリックすると、ColorChooserはクリックされた(カラースペクトル画像の)ピクセルを読み取り、イベント(ColorChooser.COLOR_CHOSEN)をディスパッチします。
- 私のAvatarDesignerクラスはこのイベントをリッスンしています。
- イベントがディスパッチされると、AvatarDesignerのハンドラーイベントは(たとえば、ColorChooserとしてtarget).chosenColorを読み取り、その色をアバターの選択された部分に適用します。
私のパートナーは、代わりに私が次のことを提案していました。
- ColorChooserにその親AvatarDesignerオブジェクト(_avatarDesigner )のインスタンスを指定します。
- 色がクリックされたら、クリックされたピクセル(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のベストプラクティスを見つけることができません。また、イベントが低レベルでどのように使用されるかを知っている人がいたらいいのですが。
読んでくれてありがとう!