Inputと"EventSystem"の2つのクラスがあります。EventSystemは、「内部アプリケーションイベント」を処理する内部(システムに依存しない)クラスです。入力は依存クラス(システム依存)であり、キー/ボタンイベントを処理し、それらをキーイベントと「EventSystem」の両方にマップします。現在データをどのように通過させているかをお見せします。内部は非常にきれいに見えますが、外部は非常に汚れています。カスタム値を渡すためのより良い方法、またはより簡単な方法を知っている人はいますか?
EventSystem:
// Raisable Events
public enum EventType { Action, Cancel };
// Base for custom arguments
public class EventArguments
{
public double time;
public EventArguments(double _time)
{
time = _time;
}
}
// Event Delegate (invoked on raise)
public delegate void Event(EventArguments eventArgs);
// full class
static class EventSystem
{
private static Dictionary<EventType, Event> eventMapping = new Dictionary<EventType, Event>();
public static void HookEvent(EventType eventType, Event _event)
{
if (eventMapping.ContainsKey(eventType))
{
eventMapping[eventType] += _event;
}
else
{
eventMapping.Add(eventType, _event);
}
}
public static void RaiseEvent(EventType eventType, EventArguments args)
{
if (eventMapping.ContainsKey(eventType))
{
eventMapping[eventType].Invoke(args);
}
else
{
// do nothing
}
}
}
私の入力引数は単にEventArgumentsを継承します。
// Inherits EventArguments (double time) and adds it's own, "bool pressed"
class KeyInputArguments : EventArguments
{
public bool pressed;
public KeyInputArguments(double time, bool _pressed) :
base(time)
{
pressed = _pressed;
}
}
キーが押されると、キー(入力)イベントが発生し、キーが内部イベントにマップされているかどうかを確認して発生させます。別のクラス(Config)は、キーをイベントにマッピング/バインドするためのすべての構成を処理します。
// Raise on press
EventSystem.RaiseEvent(eventType, new KeyInputArguments(time, true));
// [...]
// Raise on release
EventSystem.RaiseEvent(eventType, new KeyInputArguments(time, false));
最後に、イベントを発生させるために、イベントへのキーを登録する必要があります(これは「外部」コードです)
// Hook our "Enter" function into the Action event
EventSystem.HookEvent(EventType.Action, Enter);
// [...]
public void Enter(EventArguments eventArg)
{
if (((KeyInputArguments)eventArg).pressed == false)
{
Error.Break();
}
}
' ((( 'を見るまでは、すべてが素晴らしいです。これは、C#およびOOPプログラミング全般に関する私の限られた知識の醜い結果です。
イベントデリゲートは明示的にEventArgumentsを必要とするため、Enterメソッド引数を変更できません。(KeyInputArgumentsはそれを継承しますが?)。また、eventArgをKeyInputArgumentsにキャストするのにそれほど時間がかかる理由もわかりません。
最後に、これも試してみました(あまり好きではありませんが)
KeyInputArguments keyInputArguments = (KeyInputArguments)eventArg;
if (keyInputArguments.pressed == false)
カスタムデータが必要な理由は、ゲームパッドなどの複数の形式の入力から入力を受け取ることを計画しているためです。これは、システムに依存するデータ(ゲームパッドデバイス情報)を独立した引数に処理できることを意味します。これにより、システムに依存するデータがInputクラスに制限され、イベントシステムは内部的に独立したものとして活用されます。 私がしていることのためのより良い方法はありますか?