当前位置: 首页 > 知识库问答 >
问题:

java swing-如何确定两个矩形之间的碰撞边

郭修平
2023-03-14

我正在构建一个自上而下的2D滚动使用java swing与经典游戏Bomberman非常相似的游戏,玩家可以在所有4个基本方向移动角色。

所有的游戏对象都有实例变量,其中包含它们在JPanel上呈现的(x,y)坐标,它们也有用于它们在最后一帧中呈现的前一个(x,y)坐标的实例变量。我的碰撞检测算法本质上是在每次刷新屏幕时检查播放器对象是否与网格中的墙相交--这可以在下面的代码中看到:

if (playerRectangle.intersects(wallRectangle)) {
  player.restorePreviousPosition();
}

restorePreviousPosition()方法将播放器的(x,y)坐标设置为碰撞发生前的坐标。这种方法很有效,它防止玩家穿过物体。然而,控制似乎非常参差不齐,因为如果玩家试图在接触墙壁时向左向上移动,角色仍然保持不动。换句话说,角色不能碰到一面墙,仍然与它平行移动。为了解决这个问题,我创建了四个矩形绘制在播放器对象的顶部,我使用这些矩形来确定与另一个对象碰撞的边,这样,我可以根据碰撞的边恢复x或y而不是恢复(x,y)坐标。例如,如果我知道顶部正在与某物碰撞,那么我可以恢复y位置,并允许x自由变化。下面您可以看到播放器对象的图片,上面画着矩形:

这种想法是非常不可靠的,特别是在很难确定碰撞来自哪一边的角落。所以,我的问题是,如何使用Swing在java中可靠地确定一个矩形的哪一边与另一个矩形发生冲突?或者,你有比我更好的方法来检测碰撞吗?

请注意,玩家的移动是完全自由的,我的实现不会从一个瓷砖到另一个瓷砖。瓷砖之间的距离为32x32像素,播放器为30x30像素。

谢谢你的帮助。如果你对我的执行有任何额外的问题,请让我知道。

共有1个答案

曹渝
2023-03-14

一个非常简单的解决方案(考虑到您已经编写的内容)是将用于测试和移动的代码拆分为两个检查。

//update.player.x.position
if (playerRectangle.intersects(wallRectangle)) {
  player.restorePreviousPosition();
}

//update.player.y.position
if (playerRectangle.intersects(wallRectangle)) {
  player.restorePreviousPosition();
}
 类似资料:
  • 在我的自上而下游戏中,当我的玩家通过婴儿床时,我该如何让他发生碰撞?我用的是交叉矩形。 这是我的密码 更新方法 在渲染方法中 这是完整的代码 谁能告诉我矩形碰撞检测的正确实现是什么?没有重叠,我是这个框架的新手。致谢和预付款:)

  • 我正在做一个游戏,在这个游戏中,玩家必须用一个碗来接住掉落的物品。我有一些列表中项目的图像和一个用来捕捉项目的碗的图像。这些项目会持续下降,如果它们到达边界(底部边缘),则会重置到屏幕顶部。我完成了这个逻辑,允许物品落下,但我不知道如何检测碗和物品之间的碰撞。 我的代码:

  • 你会怎么做?我试图有一个直线,比较角度,使用面具,但我无法得到一个解决方案的工作。 感谢您抽出时间!

  • 我已经在这里呆了2-3周了,我仍然无法进行适当的碰撞检测。我用矩形创建了一个迷宫。我希望我的对象(在矩形中)每当我的对象与任何墙壁碰撞时停止,并能够移动到任何地方(或滑下墙壁)。我的墙壁(矩形)具有负坐标,如下所示: 我目前正在使用SO中发现的重叠方法。以下是我的CollisionManager类中的方法: 我有一个功能可以保存对象所做的所有位置移动。因此,当发生碰撞时,对象会恢复到最后一次移动之

  • 我一直在尝试在Libgdx中找到/创建矩形的碰撞检测,但似乎什么都做不到。我有一个叫bucket的矩形,宽度和高度为64,还有一个叫wall的矩形,宽度和高度为64。我试着让玩家不穿过矩形,可以在粘墙的同时继续移动,而不需要通过相位或随机传送。我的方法在有1个块的情况下有效,但当有多个块的时候,它就会中断,不起作用。 我知道这种方法很难看但这只是实验 如果有人能给我指出正确的方向或分享一些对我有帮

  • 我有一个问题,碰撞检测一个圆和一个矩形。我曾尝试用勾股定理来解决这个问题。但所有查询都不起作用。矩形与圆的矩形包围盒发生碰撞。