长时间读者第一次发布海报。请温柔。
我热衷于在VB.net中创建游戏。作为一个业余爱好程序员,我免费赠送我的游戏。由于我是一个没有正式训练的爱好者,我确实尝试并教育自己正确的编程原则,并在编写OOP时遵循它们。然而,有些事情我很明显错过了自学,也许我会知道我是否接受过正规教育。
一旦真正成为我的祸根这样的问题是不同的类(从现在开始称为对象)如何“了解”彼此没有编程特定的互动(请留在这里......请...)
好的想象一下,你有太空游戏和以下物品
现在,这些对象中的每一个都有一个Health,X,Y和Z私有成员和属性,这些成员和属性都是为了参数而继承自clsSpaceEntity。现在,他们之间编程碰撞的一种方法是在主游戏循环中编写以下逻辑
船舶清单中的每艘船舶 检查列表中的每个clsMissile以查看它是否与它发生碰撞,如果是,则降低健康状况 检查列表中的每个clsAsteroid是否与它发生冲突,如果是,则降低健康状况 检查每个clsSpaceJunka列表以查看它是否与它发生冲突,如果是,则降低健康状况 ...等等每个对象 下
等...
现在,如果您谈论上面的简单示例,但是我的一些游戏中有几十个甚至几百个以这种基本方式交互的对象,那么这可能会接近。
现在我向有经验的程序员提问。
OOP中是否有办法执行以下操作...
从clsSpaceEntity继承的每个东西
检查继承此类型的所有其他对象(除了它自己)以及它们是否发生冲突然后降低健康状况
下
对于某种类型的对象/类或任何“了解”另一个对象以及它们如何相同/不同并相互作用的这种能力将节省我吨和吨和编码的TONNES。
对此的任何帮助/帮助或反馈都将非常感激。感谢您的时间,对不起,长期阅读。
答案 0 :(得分:7)
您应该制作一个包含所有实体的List(Of T)
,而不是为每个派生对象分别设置List(Of SpaceEntity)
。
然后,您可以创建一个嵌套For Each
循环,循环遍历每对实体并进行冲突检查。 (在If x <> y
检查后)
您可以通过SpaceEntity
MustOverride
函数来处理与其他对象的碰撞,从而进一步增强您的设计,而不会为每个实体使用单独的逻辑污染您的碰撞循环。
您应该使用visitor pattern来允许实体对与不同其他类型实体的冲突做出不同的反应。
请注意,每次碰撞都会被发送到两个单独碰撞的物体;你需要在你的逻辑中处理它。
答案 1 :(得分:2)
如果我正在编写处理单一船只或单一导弹,小行星等的逻辑,那么该逻辑应该明确属于相应的类别。
如果我正在编写处理多个对象的逻辑,甚至更糟糕的是,处理不同类型的多个对象,我倾向于将该逻辑放在代表更高级别概念的类中。
例如,您可能有一个包含SpaceEntity集合的Universe类。并且有一个Universe.FindCollisions()可以返回碰撞对象的集合。
public class Universe {
private IEnumerable<SpaceEntity> _entities;
public IEnumerable<Collision> FindCollisions() {
foreach(var e1 in _entities) {
foreach(var e2 in _entities) {
if (e1.CollidesWith(e2)) {
yield return new Collision(e1, e2);
}
}
}
}
}
解决它的另一种方法可能是让CollisionCalculator类在其构造函数中接受SpaceEntity的集合,并且是特定逻辑所在的位置。
public class CollisionCalculator {
public IEnumerable<Collision> Collisions {get; set;}
public CollisionCalculator(IEnumerable<SpaceEntity> entities) {
// logic to build the Collisions collection goes here
}
}