我正在创建一个小游戏。引擎将有许多 GUI 可以订阅的事件。这些事件是:
- 球已选中
- 球取消选中
- 球动
- 球被移除
如果我只有一种类型的球,这一切都很好,但是有 X 种类型的球。它们都派生自一个抽象的 Ball 类。
每种球类型都有自己的动作,当该事件发生时会发生这些动作。他们都需要将不同的信息传递回 GUI。例如,我有这两种球类型(这里有更多只是减少信息量)。
- 弹跳球
- 球爆炸
BallBouncing 将需要告诉 GUI 它可能已经移动到了哪里,因此只需传回有关它自己的信息。
另一方面,BallExploding 会摧毁周围的球。所以它需要说出它是哪个球以及它摧毁的所有球。
这两种球类型都可以从同一个事件中触发,但具有不同的事件参数。我可以包含一个值字典,但这并不像每种类型都有一个自定义事件参数那样明确。
我还认为,如果我创建一个自定义事件 args,其中包含所涉及的球,然后为每种球类型从该事件继承,我可以将事件 args 回退。
public abstract class BallBaseEventArgs : EventArgs
{
public Ball ball;
}
public class BallExplodingEventArgs : BallBaseEventArgs
{
public IList<Ball> explodedBalls;
}
因此,在 GUI 事件处理程序中,它会通过知道所使用的球类型来投射事件 args。我也不太喜欢这个解决方案,因为它感觉很脏而且绑得太紧。
所以我想我在问有没有人有建议,想法如何解决这种情况。
谢谢
乔恩
编辑
好的,所以我想我会尝试更多地解释我的结构以澄清并了解它会将我们带到哪里:
我有一个Objects DLL,它具有Board 和ball 的接口,它有两个Enum,一个用于board 类型,一个用于Ball 类型(这主要用于工厂知道要创建哪种类型的对象)。DLL 还具有 Ball 类和 Board 类的各种实现。
抽象 Ball 类包含诸如颜色、其 X 和 Y 坐标、已选择和 BallType Enum 等信息。它有几个方法,Clone()(来自 ICloneable)和 CompareTo(带有 Equals 和哈希值位)。
我有一个实例管理器 DLL,它有一个控制对球板和游戏配置数据的访问的单例对象。该 DLL 还包含 BallFactory 和 boardFactory(不确定这些是否应该包含在 Objects DLL 中,因为它们不是可以说的对象,不确定这是否是一个很好的做法)。
然后我有引擎 DLL。这涉及游戏的所有逻辑。如何创建板和球,为什么创建它们以及如何使用它们。Ball 和 Board 类有一个 LogicFactory(所有这些工厂都使用 BallTypes 和 BoardTypes Enum 来决定使用哪个实现)。
逻辑类决定棋盘如何移动球并调用球的动作方法:
- 球已选中
- 球取消选中
- 球动
- 球被移除
这是在 Ball Logic 类中。
我没有将所有逻辑都放在它们本身的对象中的原因是我认为逻辑和功能应该与仅存储有关它的数据的对象分开(这可能是完全错误的)。BallLogic 贝司类中包含关于球如何移动/动作的大部分功能,每个派生类决定它调用的内容(所有方法都是虚拟的,因此如果需要也可以更改)。
感谢您的所有投入,它真的很受欢迎。我这样做是为了好玩,但主要是为了学习开发不同类型应用程序的正确(和错误)方法。