gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:38 27 4
gpt4 key购买 nike

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

所有游戏对象都有包含它们在 JPanel 上渲染位置的 (x,y) 坐标的实例变量,它们还有上次渲染位置的前一个 (x,y) 坐标的实例变量框架。我的碰撞检测算法本质上是在每次刷新屏幕时检查玩家对象是否与网格中存在的一堵墙相交——这可以在下面的代码中看到:

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

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

enter image description here

这个想法很不靠谱,尤其是在角落里,很难判断碰撞是从哪一边来的。所以,我的问题是,如何使用 swing 在 java 中可靠地确定矩形的哪一侧与另一个矩形发生碰撞?或者,您是否有比我的碰撞检测方法更好的替代方法? p>

请注意,玩家移动是完全自由的,我的实现不会将角色从一个贴图移动到另一个贴图。并且图 block 之间的距离是 32x32 像素,而玩家是 30x30 像素。

谢谢你的帮助。如果您对我的实现有任何其他问题,请告诉我。

最佳答案

一个非常简单的解决方案(考虑到您已经编写的内容)是将 Test-and-Move 的代码拆分为两个检查。

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

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

关于java swing - 如何确定两个矩形之间碰撞的一侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26781899/

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