我正在制作一款游戏,并尝试使用事件系统。这是它如何实现的主要思想:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Blocker2
{
public delegate void OnPlayerMoved(PlayerMovedEvent e);
public delegate void OnPlayerSpawned(PlayerSpawnedEvent e);
public delegate void OnBlockBreak(BlockBreakEvent e);
public delegate void OnBlockPlaced(BlockPlacedEvent e);
public static class EventHandler
{
private static List<OnPlayerMoved> _onPlayerMoved;
private static List<OnPlayerSpawned> _onPlayerSpawned;
private static List<OnBlockBreak> _onBlockBreak;
private static List<OnBlockPlaced> _onBlockPlaced;
static EventHandler()
{
}
public static void Subscribe()
{
}
// -------------------------- Player Related Events --------------------------
public static void OnPlayerMoved(PlayerMovedEvent e)
{
foreach (OnPlayerMoved del in _onPlayerMoved)
{
del(e);
}
}
public static void OnPlayerSpawned(PlayerSpawnedEvent e)
{
foreach (OnPlayerSpawned del in _onPlayerSpawned)
{
del(e);
}
}
// -------------------------- Block Related Events --------------------------
public static void OnBlockBreak(BlockBreakEvent e)
{
foreach (OnBlockBreak del in _onBlockBreak)
{
del(e);
}
}
public static void OnBlockPlaced(BlockPlacedEvent e)
{
foreach (OnBlockPlaced del in _onBlockPlaced)
{
del(e);
}
}
}
}
将会有更多的事件,我认为这个方法会使代码变得非常非常复杂。有更好的方法吗?(考虑代码的性能和可维护性)。提前感谢!对不起,我的英语不好。
为什么不使用标准的c#事件呢?它们将以相同的方式处理此问题,因为一个事件允许多个订阅者。
c#中的标准事件机制允许多个订阅者订阅一个事件,它看起来像:
public static event EventHandler<PlayerMovedEventArgs> PlayerMoved;
// Often, you'll have a method to raise the event:
public static void OnPlayerMoved(PlayerMovedEventArgs args)
{
var handler = PlayerMoved;
if (handler != null)
handler(null, args);
}
话虽这么说,我建议把它们放在相关的类中,而不是让它们都是全局/静态的。然后,您可以潜在地使该方法将事件引发为该类的私有事件,这将允许您保持设计更具可维护性。
例如,PlayerMoved
事件可能更适合在一些代表你的世界(或世界的一部分)的类中,并以非静态的方式出现在那里。