我正在创建一个小游戏的过程。引擎将会有一些GUI可以订阅的事件。这些事件是:如何处理多个事件参数
- ballselected
- balldeselected
- ballmoved
- ballremoved
这都将是很好,如果我只有一个类型的球,但也有X个球类型。它们都来自一个抽象的Ball类。
每个球类型都有自己的动作发生,当他们发生这个事件。他们都需要将不同的信息传回给GUI。例如,我有这两种球类型(更多的只是减少信息量)。
- BallBouncing
- BallExploding
BallBouncing需要告诉它可能已经移动到了GUI,所以只会传回它自己的信息。
另一方面,BallExploding会破坏周围的球。所以它需要说出它是哪个球以及它被破坏的所有球。
这两种球类型都可以从同一个事件中触发,但具有不同的事件参数。我可以包含一个值的字典,但不是每个类型都有一个自定义事件参数。
我还认为,如果我创建了一个自定义事件参数,该参数包含了球并且从每个球类型继承而来,我可以将事件参数转换回来。
public abstract class BallBaseEventArgs : EventArgs
{
public Ball ball;
}
public class BallExplodingEventArgs : BallBaseEventArgs
{
public IList<Ball> explodedBalls;
}
因此,在GUI事件处理函数中,它会通过知道使用的球类型来投射事件参数。我不喜欢这个解决方案,因为它感觉很脏并且绑得太紧。
所以我想我是问有没有人有任何建议,想法如何解决这种情况请。
感谢
乔恩
编辑
OK,所以我想我会试着解释我的结构多一点澄清,看看它需要我们:
我拥有一个包含Board和Ball接口的Objects DLL,它有两个Enum的板类型和一个用于Ball类型(这主要用于工厂了解哪种类型的对象 创造)。该DLL还具有Ball类和Board类的各种实现。
抽象Ball类保存诸如颜色,其X和Y坐标等信息,并选择BallType Enum。它有几个方法,Clone()(来自ICloneable)和CompareTo(使用Equals和散列值位)。
我有一个Instance Manager DLL,它具有一个单例对象,用于控制对Ball的Board和Game Configuration Data的访问。这个DLL也包含BallFactory和boardFactory(不知道这些应该在Objects DLL中消失了,因为它们不是可以说的对象,不确定这是否是一种很好的做法)。
然后我有引擎DLL。这涉及游戏的所有逻辑。棋盘和球是如何创建的,为什么要创建它们以及如何使用它们。 Ball和Board类有一个LogicFactory(所有这些工厂都使用BallTypes和BoardTypes Enum来决定使用哪个实现)。
的逻辑类决定如何董事会到处移动球和调用球的动作方法:
- ballselected
- balldeselected
- ballmoved
- ballremoved
这是在球逻辑类。
我没有把所有的逻辑放在它们自己的对象中的原因是我认为逻辑和功能应该与存储关于它的数据的对象分开(这可能是完全错误的)。大多数有关Ball如何移动/操作的功能都包含在BallLogic低音类中,每个派生类决定它所调用的内容(所有方法都是虚拟的,因此如果需要也可以更改)。
感谢您的所有输入,它的确很成功。我这样做是为了好玩,但主要是为了学习正确(和错误)的方式来开发不同类型的应用程序。
这意味着您仅使用BallTypes层次结构来继承属性,并且操作不会被覆盖。由于弹跳球不会爆炸,而且爆炸球不会弹起,这意味着它们的不少属性也不相同,所以你在抽象类中保存了什么信息?顺便说一下,如果球可以属于一个层次结构,那么为什么不能有事件参数?在这个例子中,专业化并不好,因为如果你需要添加一个类型,你会怎么做?你如何通过向画布报告更新来增加新的代码? – 2009-12-16 13:22:42