我正在创建一个小游戏。该引擎将具有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的用于板类型,一个用于Ball类型(这主要用于工厂知道要创建哪种类型的对象) 。 DLL还具有Ball类和Board类的各种实现。
抽象Ball类包含颜色,X和Y坐标等信息,以及BallType Enum。它有两种方法,Clone()(来自ICloneable)和CompareTo(带有Equals和hash值位)。
我有一个Instance Manager DLL,它有一个单例对象,可以控制对Ball的Board和Game Configuration Data的访问。这个DLL还包含BallFactory和boardFactory(不确定它们是否应该在Objects DLL中,因为它们不是因为它们不是对象所以可以这么说,不确定这是不是很好用)。
然后我有Engine DLL。这涉及游戏的所有逻辑。如何创建板和球,创建它们的原因以及它们的使用方式。 Ball和Board类有一个LogicFactory(所有这些工厂都使用BallTypes和BoardTypes Enum来决定使用哪种实现)。
逻辑课决定董事会如何移动球并调用球的动作方法:
Ball Logic课程中的内容。
我没有将所有逻辑放在对象中的原因是我认为逻辑和功能应该与仅存储有关它的数据的对象分开(这可能是完全错误的)。关于Ball如何移动/动作的大部分功能都包含在BallLogic bass类中,每个派生类决定它所调用的内容(所有方法都是虚拟的,因此如果需要也可以更改)。
感谢您的所有输入,它真的很适合。我这样做很有趣,但主要是为了学习开发不同类型应用程序的正确(和错误)方法。
答案 0 :(得分:0)
你确定你的设计没问题吗?
我的意思是,为什么你有'BallExploding'类型和'BallBouncing'?这不是球的操作吗? (球可以爆炸,球可以反弹)?或者它是否会导致'BallExploding'无法弹跳,并且BallBouncing无法爆炸?