【发布时间】:2020-03-15 03:09:27
【问题描述】:
我正在用 Java 编写一个简单的小行星游戏。并找到这个问题(不是真正的问题,我的解决方案效果很好,但看起来很难看)。我只想知道有没有办法简化我的代码。
我的游戏中有一些对象。船、流星、子弹和硬币。它们都是 GameObject 的子类。为了处理碰撞,在 MyGame 类中我有这些函数。
private void ship_hit_meteor(Ship ship, Meteor meteor){}
private void bullet_hit_meteor(Bullet bullet, Meteor meteor){}
private void ship_hit_coin(Ship ship, Coin coin){}
//...and so on
为了进行碰撞检查,我将所有对象放在 1 个大 objArray 中。 然后我迭代数组以检查冲突。我就是这样做的:但是想象一下,如果我有 100 种类型的对象。
//inside the collision loop
GameObject a = objArray[i];
GameObject b = objArray[j];
if(a instanceof Ship && b instanceof Meteor ){
ship_hit_meteor((Ship)a, (Meteor)b);
}
else if(a instanceof Meteor && b instanceof Ship){
ship_hit_meteor((Ship)b, (Meteor)a);
}
else if(a instanceof Bullet && b instanceof Meteor){
bullet_hit_meteor((Bullet)a, (Meteor)b);
}
else if(a instanceof Meteor && b instanceof Bullet){
bullet_hit_meteor((Bullet)b, (Meteor)a);
}
//... end of the loop
有什么办法可以简化吗?
谢谢。
【问题讨论】:
-
我想这应该是正确的地方codereview.stackexchange.com
-
Bullet击中Meteor和Meteor击中Bullet的区别在哪里? -
您可以在 GameObject 中拥有一个名为 collision() 的抽象方法,每个子类都实现该方法。让它获取另一个 GameObject,然后在实现中处理每个对象。 IE。在
Ship.collision(GameObject a)中,您可以有一个用于 a 的 switch 语句 -
不管谁打谁,我都不会在你的
GameObject类中创建 100 个方法,而是在你的每个类中实现一些简单的hit(GameObject object)方法。然后你可以超载它们。在你的Ship类中说你可以实现hit(Meteor meteor){...}或者hit(Bullet bullet)。然后你决定是否摧毁这艘船或减少它的生命值或其他什么。您可以通过调用a.hit(b)来简单地触发它,而无需在运行时实际“知道”a或b是什么类。 -
如果您的代码有效,那么这里就离题了,应该像 Tony 前面提到的那样在代码审查时询问。
标签: java android libgdx game-development