我有两个类,Input 和“EventSystem”。EventSystem 是处理“内部应用程序事件”的内部(非系统相关)类。Input 是一个依赖类(依赖于系统)并处理键/按钮事件并将它们映射到键事件和“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 编程的一般知识有限的一个丑陋结果。
我无法更改 Enter 方法参数,因为事件委托明确需要 EventArguments。(即使 KeyInputArguments 继承了它?)。我也不明白为什么要将 eventArg 转换为 KeyInputArguments 需要这么多。
最后,我也试过这个(虽然我不太喜欢它)
KeyInputArguments keyInputArguments = (KeyInputArguments)eventArg;
if (keyInputArguments.pressed == false)
我需要自定义数据的原因是我计划接收来自多种输入形式的输入,例如游戏手柄。这意味着我可以将系统相关数据(游戏手柄设备信息)处理成独立的参数。这将系统相关数据限制为我的 Input 类,同时在内部独立地利用我的事件系统。 我正在做的事情有更好的方法吗?