gpt4 book ai didi

java - 突破碰撞检测

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:12 24 4
gpt4 key购买 nike

我正在尝试一个简单的 Break Out 克隆,以了解游戏状态、游戏循环等。

我遇到的困难之一是碰撞检测。

我有一个由 Ball、Brick 和 Paddle 扩展的 GameItem 类。在此类中,我有一个 getBounds() 方法来返回对象的边界矩形,一个碰撞(GameItem item) 方法来确定 2 个 GameItem 对象是否发生碰撞,以及 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;
}

其调用方式如下:

ball.checkBallCollisions(paddle);

如您所见,如果它碰到 4 个边缘之一,x/y 方向就会相应反转。

但是,这不起作用。分析代码似乎有一个明显的问题,我无法理解解决方案。

下面的 3 张图像从上方、下方和右侧显示了球与物体的碰撞。

enter image description here enter image description here enter image description here

按照原样的代码,它首先根据边界矩形和 intersects() 方法检测碰撞。然后它确定它击中了哪一侧。如果它从上面击中,它就会起作用。但是,当它从底部或右侧击中时,hitTop() 将返回 true,因为 getY()+getHeight()>=item.getY() 对于这两种情况都是 true(即球的底部边缘的 y 值大于与其碰撞的对象的顶部边缘)。

我缺少哪些条件来解决此问题并进行完美的碰撞检测?

最佳答案

对于圆,您使用圆的半径而不是边界,因为边界是一个矩形。我相信在java中有一些方法可以做到这一点,但我还不知道它们,所以应该做一些研究。

此外,对于高级碰撞,人们倾向于使用 vector ,同样我以前从未摆弄过它们,所以你也必须研究它。

这里有一些可以让你继续前进的东西:

Java area and intersection

关于java - 突破碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28194834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com