我有两个类,Input和“EventSystem”。 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
}
}
}
我输入ARGS只是继承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方法参数,因为事件委托明确需要EventArgum经济需求。 (即使KeyInputArguments继承它?)。我也不明白为什么要将eventArg投入到KeyInputArguments。
最后,我也试过这个(虽然我不喜欢那么多)
KeyInputArguments keyInputArguments = (KeyInputArguments)eventArg;
if (keyInputArguments.pressed == false)
我需要自定义数据的原因是,我打算从多形式的输入,如游戏手柄的接收输入。这意味着我可以将系统相关数据(游戏手柄设备信息)处理为独立参数。这将系统相关数据限制在我的Input类中,同时将我的事件系统作为独立的内部使用。 我在做什么有更好的方法吗?
你可以看看使用“as”操作符。 http://msdn.microsoft.com/en-us/library/cscsdfbt(v=vs.100).aspx – 2012-08-06 04:52:43
不能直接回答你的问题,但你可以看看棱镜的事件聚合器,我认为做你需要什么http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.20%29.aspx – 2012-08-06 05:46:43