私は小さなゲームを作成中です。エンジンには、GUIがサブスクライブできるいくつかのイベントがあります。イベントは次のとおりです。
- ボール選択
- balldeselected
- ボールムーブ
- ボールが削除されました
ボールの種類が1つしかない場合は問題ありませんが、X個のボールの種類があります。それらはすべて抽象的なBallクラスから派生しています。
各ボールタイプには、このイベントが発生したときに発生する独自のアクションがあります。それらはすべて、異なる情報をGUIに返す必要があります。たとえば、私はこれら2つのボールタイプを持っています(ここでは情報量を減らすだけです)。
- BallBouncing
- BallExploding
BallBouncingは、GUIに移動先を通知する必要があるため、GUI自体に関する情報を返すだけです。
一方、BallExplodingは、周囲のボールを破壊します。したがって、それがどのボールであり、それが破壊したすべてのボールであるかを言う必要があります。
これらの2つのボールタイプは両方とも同じイベントから発射される可能性がありますが、イベント引数は異なります。値のディクショナリを含めることもできますが、タイプごとにカスタムイベント引数を使用することはそれほど明確ではありません。
また、関与するボールを含むカスタムイベント引数を作成し、ボールタイプごとにそれを継承すると、イベント引数をキャストして戻すことができると思いました。
public abstract class BallBaseEventArgs : EventArgs
{
public Ball ball;
}
public class BallExplodingEventArgs : BallBaseEventArgs
{
public IList<Ball> explodedBalls;
}
そのため、GUIイベントハンドラーでは、使用されたボールの種類を知ることでイベント引数をキャストします。私はこの解決策もあまり好きではありません。それは汚れていて、きつく縛られすぎているように感じるからです。
ですから、このような状況に対処するための提案やアイデアはありますか?
ありがとう
ジョン
編集
OK、それで私は自分の構造をもう少し説明して、それが私たちをどこに連れて行くのかを明確にして見ることを試みると思いました:
ボードとボールのインターフェイスを持つオブジェクトDLLがあり、ボードタイプ用とボールタイプ用の2つの列挙型があります(これは主に、作成するオブジェクトのタイプを知るために工場で使用されます)。DLLには、BallクラスとBoardクラスのさまざまな実装もあります。
抽象Ballクラスは、色、そのX座標とY座標、選択されたBallType列挙型などの情報を保持します。これには、Clone()(ICloneableから)とCompareTo(Equalsとハッシュ値ビットを使用)の2つのメソッドがあります。
ボールのボードとゲーム構成データへのアクセスを制御するシングルトンオブジェクトを持つインスタンスマネージャーDLLがあります。このDLLは、BallFactoryとboardFactoryも保持します(これらがObjects DLLに含まれるべきかどうかはわかりません。そうでない理由は、いわばオブジェクトではないためです。これが優れた方法かどうかはわかりません)。
次に、エンジンDLLがあります。これは、ゲームのすべてのロジックを扱います。ボードとボールの作成方法、作成理由、使用方法。BallクラスとBoardクラス用のLogicFactoryがあります(これらのファクトリはすべて、BallTypesとBoardTypes Enumを使用して、使用する実装を決定します)。
ロジッククラスは、ボードがボールをどのように動かすかを決定し、ボールのアクションメソッドを呼び出します。
- ボール選択
- balldeselected
- ボールムーブ
- ボールが削除されました
これはBallLogicクラスにあります。
自分自身のオブジェクトにすべてのロジックを配置しなかった理由は、ロジックと機能を、それに関するデータを格納するだけのオブジェクトから分離する必要があると考えたためです(これは完全に間違っている可能性があります)。Ballがどのように移動/動作できるかに関するほとんどの機能はBallLogicベースクラスに含まれており、各派生クラスはそれが呼び出すものを決定します(すべてのメソッドは仮想であるため、必要に応じて変更することもできます)。
あなたのすべての入力に感謝します、それは本当にappriacatedです。私はこれを楽しみのためにやっていますが、主にさまざまな種類のアプリケーションを開発するための正しい(そして間違った)方法を学ぶためです。