Java Game Hitbox Detection&圆角

时间:2015-05-12 18:20:26

标签: java swing intersection rectangles

我正在开发一个简单的2D游戏,包括Java,swing和没有框架。我有一个矩形播放器,用户可以四处移动。在地图上是玩家不应该经历的几个障碍。我通过为玩家制作一个新的矩形对象以及每个障碍物来实现这一点。但我不确定这是否是正确的方法。它有效,但玩家的动作并不是真正的用户友好。如果玩家想要传递两个障碍物,他们必须在完美的坐标上通过。

使用Rectangle对象检查玩家与障碍物之间的交叉点是否是一个好主意,还是应该采用另一种方式?

现在提出我的第二个问题:
我想用相同的hitbox替换矩形的hitbox,但是有圆角,这样玩家可以更轻松地通过。

My game with hitboxes enabled
这就是启用了hitbox的游戏。

检查玩家和障碍物是否相交的代码:

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
            }
        }
}

返回播放器/障碍物的hitbox的功能:

public Rectangle obstBounds() {
    return new Rectangle(this.getX(), 
    this.getY(), image.getImage().getWidth(null), 
    image.getImage().getHeight(null));
}

2 个答案:

答案 0 :(得分:0)

有许多方法可以进行碰撞检查,但我认为一种简单的方法可以很好地用于您的用例。

首先从截图的外观来看,瓷砖既可以是障碍物,也可以是可通行的,但不是每个的一半。在这种情况下,最简单的方法就是检查角色的中心(或者脚,选择看起来最好)的哪个区块。

如果它是一个障碍,他们可以 t 去那里,就这么简单。请注意,这将允许玩家将部分移动到障碍物,但许多游戏都是这样做的,并且玩家肯定会习惯这种行为,特别是在2D游戏中,图形设计看起来像等距投影(我会把你的课程称为)。其中一个变化就是简单地让玩家碰撞矩形更小(比如半个牌,再次以玩家精灵的胸部或脚为中心)。

答案 1 :(得分:0)

许多年前,我写了一个Khepera模拟器,作为我本科生最后一年项目的一部分。我开始做你正在做的碰撞检测,那是交叉区域......我的主管让我注意到,由于我的机器人的形状是一个圆圈,我只能检查机器人的中心是否在另一个形状内,如果是是发生碰撞的情况。

你的情况甚至更简单,因为你移动瓷砖...所以你要么(如评论中所建议的)保持一组“移动/不移动”瓷砖并检查,或者你只是检查位置你的玩家是否在“禁止”的矩形内,即障碍物。如果是,那么你必须将角色的位置重置为障碍物的“外部”(显然减去角色的边界框)

我强烈建议以瓦片的方式进行:仅允许上/下/左/右运动,并检查给定瓦片位置的“禁止”运动组。如果你真的想要“自由”的动作而不是圆圈(边框/圆圈),因为它们易于推理,很容易进行位置重置(如果发生碰撞)并且非常适合你的情况(每个瓷砖都可以包含一个圈子,无论是障碍还是玩家。)