2012-10-20 57 views
1

我正在设计一个简单的游戏,您可以避免被我创建的AI所击中。简单的Java碰撞检测

我一直在寻找碰撞检测,我有一个问题。

我查过的所有信息似乎都涉及到使用相当多的代码。

我在想,为什么不能简单:

if(AI.xDirection == x || AI.yDirection == x || AI.xDirection == y || AI.yDirection == y){ 
     System.out.println("Collision"); 

用于此?

正如你所看到的,我已将它设置为打印到控制台,它似乎为我工作。

这是否有缺点?

回答

1

您的代码假定所有的客户端都关心是否存在冲突。可能有游戏和其他客户希望在某些情况下以某些方式处理碰撞的情况(例如,前段时间我制作了一个程序,可以在随机障碍物之间来回跳动球,并且取决于哪一方是首先命中,它不得不朝那个方向反弹)。

这个名单继续讨论客户在碰撞后希望发生什么,但是如果你想要的只是显示一个碰撞,那么嘿,为它做人。

+1

我不是那么简单,但我的意思是最初检测到碰撞。 所以......本质上来说,使用你的球弹跳的例子,我不能让代码反射到对象的简单IF语句中,类似于我正在使用的代码吗? – Sawyer05

+0

是的,在最简单的情况下,你拥有的是正确的。我只是说你应该认识到这样一个事实:对于处理碰撞的更复杂的程序,所使用的对象不能简单地转换为具有X和Y变量的东西,因此代码更多/涉及的逻辑 – yiwei

+0

我明白了,我只是测试了一些其他的形状,我看到哪里会需要更高级的编码。感谢您的帮助! – Sawyer05

2

不知道你的代码实际上在做什么,但如果它工作并且对你来说是可以理解的,那么我不明白为什么你应该改变它!

+0

同意。这对我来说没有意义,但如果它漂浮在你的船上,就把它运出去。 –

+0

对不起!,x和y是基于我在屏幕上移动的对象的坐标,而AI.xDirection是一个随机移动的矩形。 我只是抬头看着碰撞检测,希望结果能像我想的那么容易,而且对我来说他们是显而易见的! – Sawyer05

0

你违背封装这种做法。

Prefer定义了一个自定义对象,例如:AIPosition(可能是不可变的),专用于封装AI坐标。包含方法

AIPositionboolean doesCollideWith(AIPosition anotherPosition)

AI将包含委托方法:

public boolean doesCollideWith(AI anotherAi){ 
    aiPosition.doesCollideWith(anotherAi.getAIPosition()); 
} 

你的呼叫将是:if(ai1.doesCollideWith(ai2))

因此,如果以后坐标涉及第三元件(像z),您的客户代码不需要更改。

+0

是的,它是我查找时发现的代码。我仍然是Java新手,起初我猜想我正在使用if语句。 只是想知道为什么它不是更常用。 感谢您的信息! – Sawyer05

+0

@ Sawyer05好的。因此,您的代码越有条件越好。为什么?检查开放/封闭原则http://en.wikipedia.org/wiki/Open/closed_principle和什么是真正封装的代码(不限于getter和setter) – Mik378