我正在使用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自由变化 . 下面你可以看到播放器对象的图片,上面画着矩形:
这种想法非常不可靠,特别是在难以确定碰撞来自哪一侧的角落 . 那么,我的问题是, how can I reliably determine which side of a rectangle is colliding with another rectangle in java using swing? 或者,您是否有更好的替代方法来检测碰撞?
请注意,玩家移动是完全免费的,我的实现不会将角色从一个拼贴到另一个拼贴 . 并且瓷砖之间的距离为32x32像素,播放器为30x30像素 .
感谢您的帮助 . 如果您对我的实施有任何其他疑问,请告诉我 .