我尝试使用简单的Break Out克隆来了解游戏状态,游戏循环等。
我遇到困难的一件事是碰撞检测。
我有一个GameItem
类,由Ball,Brick和Paddle扩展。在这个类中,我有一个getBounds()
方法来返回对象的边界Rectangle,一个碰撞(GameItem
item)方法来确定2 GameItem
个对象是否已经碰撞,以及{ {1}},hitTop()
,hitBottom()
和hitLeft()
确定对象与另一方相撞的一面。
这些方法如下:
hitRight()
球类有一个名为public Rectangle getBounds()
{
return new Rectangle(x, y, width, height);
}
public boolean collision(GameItem item)
{
return getBounds().intersects(item.getBounds());
}
public boolean hitTop(GameItem item)
{
return getY()+getHeight()>=item.getY();
}
public boolean hitLeft(GameItem item)
{
return getX()+getWidth()>=item.getX();
}
public boolean hitBottom(GameItem item)
{
return getY()<=item.getY()+item.getHeight();
}
public boolean hitRight(GameItem item)
{
return getX()<=item.getX()+item.getWidth();
}
的方法来确定球何时击中另一个物体。具体如下:
checkBallCollissions(GameItem item)
其名称如下:
public boolean checkBallCollisions(GameItem item)
{
if(this.collision(item))
{
if(this.hitTop(item))
{
this.setVY(-1*this.getVY());
return true;
}
else if(this.hitBottom(item))
{
this.setVY(-1*this.getVY());
return true;
}
else if(this.hitLeft(item))
{
this.setVX(-1*this.getVX());
return true;
}
else if(this.hitRight(item))
{
this.setVX(-1*this.getVX());
return true;
}
return false;
}
return false;
}
如您所见,如果它碰到4个边中的一个,则x / y方向会相应地反转。
然而,这不起作用。分析代码似乎是一个明显的问题,我无法通过解决方案来解决问题。
下面的3张图片显示了球与上方,下方和右方的物体碰撞。
使用代码,它首先根据边界矩形和intersects()方法检测碰撞。然后它确定它击中了哪一侧。如果它从上面击中就有效。然而,当它从底部或右边撞击时,ball.checkBallCollisions(paddle);
将返回true,因为hitTop()
对于这两种情况都是正确的(即球的底部边缘具有比顶部边缘更大的y值。反对它与之碰撞。
我缺少什么条件来解决这个问题,并且有完美的碰撞检测?
答案 0 :(得分:0)
对于圆圈,您使用圆的半径而不是边界,因为边界是一个矩形。 我相信有一些方法可以在java中完成,但我还不知道它们,所以应该做一些研究。
另外,对于高级碰撞,人们倾向于使用矢量,我再也没有摆弄它们,所以你也必须研究它。
这是让你前进的事情:
答案 1 :(得分:0)
这里的问题是你提到的
&#34; hitTop()
将返回true,因为getY()+getHeight()>=item.getY()
对于这两种情况都是正确的(即,球的下边缘具有比其碰撞的对象的上边缘更大的y值。用)&#34。
为了解决这个问题,你还需要检查以确保圆圈的y位置小于游戏对象的y位置+游戏对象的高度(也可能减去它的一些偏移量)。
哪个应该是这样的(不要担心偏移):
public boolean hitTop(GameItem item)
{
return getY() + getHeight() >= item.getY() &&
getY() < item.getY() + item.getHeight();
}
您需要为所有碰撞执行此操作。