Java 游戏 Hitbox 检测和圆角
Java Game Hitbox Detection & Rounded Corners
我正在开发一个简单的 2D 游戏 Java,swing,没有框架。我有一个矩形播放器,用户可以四处移动。地图上有一些玩家无法通过的障碍。我通过为玩家和每个障碍物及其边界制作一个新的矩形对象来做到这一点。但我不确定这是否是正确的方法。它有效,但玩家的动作并不是真正的用户友好。如果玩家想通过两个障碍,他们必须在完美的坐标上才能通过。
用矩形对象检查玩家和障碍物之间的交点是个好主意还是我应该换一种方式?
现在是我的第二个问题:
我想用相同的碰撞框替换矩形碰撞框,但圆角让玩家可以更轻松地通过。
这是启用碰撞盒后的游戏外观。
检查玩家和障碍物是否相交的代码:
for (Player p : this.getPlayerArray()) {
Rectangle recPlayer = p.playerBounds();
for (Obstacle kiste : obstacleArray) {
Rectangle recKiste = kiste.obstBounds();
if (recPlayer.intersects(recKiste)) {
p.setX(100); //Not actual code here
}
}
}
returns玩家/障碍物碰撞箱的功能:
public Rectangle obstBounds() {
return new Rectangle(this.getX(),
this.getY(), image.getImage().getWidth(null),
image.getImage().getHeight(null));
}
有很多方法可以进行碰撞检查,但我认为一种简单的方法就可以很好地满足您的用例。
首先从您的屏幕截图来看,瓷砖要么是障碍物,要么是可通过的,但绝不是两者的一半。在这种情况下,最简单的方法是检查角色的 center(或脚,选择看起来最好的)在哪个图块上。
如果这是一个障碍,他们可以t 去那里,就这么简单。请注意,这将允许玩家部分移动 进入 障碍物,但许多游戏都是这样做的,玩家肯定已经习惯了这种行为,尤其是在图形设计看起来像的 2D 游戏中等轴测投影(我希望你的 class 作为)。对此的一种变体是简单地使玩家碰撞矩形更小(比如半个瓷砖,再次以玩家精灵的胸部或脚为中心)。
很多年前,我写了一个 Khepera 模拟器作为我本科生最后一年项目的一部分。我开始像你一样做碰撞检测,那是相交区域......我的主管让我注意到,因为我的机器人的形状是一个圆形,所以我可以检查机器人的中心是否在另一个形状内,如果是是不是发生了碰撞
你的情况更简单,因为你在瓷砖上移动......所以你要么(按照评论中的建议)维护一组 "move/no move" 瓷砖并检查它,要么你只检查位置您的播放器是否在 'forbidden' 矩形内,即障碍物。如果是,则必须将角色的位置重置为障碍物的 'outside'(显然减去角色的边界框)
我强烈建议以拼贴方式进行:只允许 up/down/left/right 移动并检查给定拼贴位置的 'forbidden' 一组移动。如果你真的想要 'freedom' 的运动而不是圆圈(边界 boxes/circles),因为它们很容易推理,很容易进行位置重置(在发生碰撞的情况下)并且非常适合你的情况(每个tile 可以包含一个圆圈,无论是障碍物还是玩家。)
我正在开发一个简单的 2D 游戏 Java,swing,没有框架。我有一个矩形播放器,用户可以四处移动。地图上有一些玩家无法通过的障碍。我通过为玩家和每个障碍物及其边界制作一个新的矩形对象来做到这一点。但我不确定这是否是正确的方法。它有效,但玩家的动作并不是真正的用户友好。如果玩家想通过两个障碍,他们必须在完美的坐标上才能通过。
用矩形对象检查玩家和障碍物之间的交点是个好主意还是我应该换一种方式?
现在是我的第二个问题:
我想用相同的碰撞框替换矩形碰撞框,但圆角让玩家可以更轻松地通过。
这是启用碰撞盒后的游戏外观。
检查玩家和障碍物是否相交的代码:
for (Player p : this.getPlayerArray()) {
Rectangle recPlayer = p.playerBounds();
for (Obstacle kiste : obstacleArray) {
Rectangle recKiste = kiste.obstBounds();
if (recPlayer.intersects(recKiste)) {
p.setX(100); //Not actual code here
}
}
}
returns玩家/障碍物碰撞箱的功能:
public Rectangle obstBounds() {
return new Rectangle(this.getX(),
this.getY(), image.getImage().getWidth(null),
image.getImage().getHeight(null));
}
有很多方法可以进行碰撞检查,但我认为一种简单的方法就可以很好地满足您的用例。
首先从您的屏幕截图来看,瓷砖要么是障碍物,要么是可通过的,但绝不是两者的一半。在这种情况下,最简单的方法是检查角色的 center(或脚,选择看起来最好的)在哪个图块上。
如果这是一个障碍,他们可以t 去那里,就这么简单。请注意,这将允许玩家部分移动 进入 障碍物,但许多游戏都是这样做的,玩家肯定已经习惯了这种行为,尤其是在图形设计看起来像的 2D 游戏中等轴测投影(我希望你的 class 作为)。对此的一种变体是简单地使玩家碰撞矩形更小(比如半个瓷砖,再次以玩家精灵的胸部或脚为中心)。
很多年前,我写了一个 Khepera 模拟器作为我本科生最后一年项目的一部分。我开始像你一样做碰撞检测,那是相交区域......我的主管让我注意到,因为我的机器人的形状是一个圆形,所以我可以检查机器人的中心是否在另一个形状内,如果是是不是发生了碰撞
你的情况更简单,因为你在瓷砖上移动......所以你要么(按照评论中的建议)维护一组 "move/no move" 瓷砖并检查它,要么你只检查位置您的播放器是否在 'forbidden' 矩形内,即障碍物。如果是,则必须将角色的位置重置为障碍物的 'outside'(显然减去角色的边界框)
我强烈建议以拼贴方式进行:只允许 up/down/left/right 移动并检查给定拼贴位置的 'forbidden' 一组移动。如果你真的想要 'freedom' 的运动而不是圆圈(边界 boxes/circles),因为它们很容易推理,很容易进行位置重置(在发生碰撞的情况下)并且非常适合你的情况(每个tile 可以包含一个圆圈,无论是障碍物还是玩家。)