Java游戏Hitbox检测与测试;圆角

Java游戏Hitbox检测与测试;圆角,java,swing,intersection,rectangles,Java,Swing,Intersection,Rectangles,我正在用Java、swing和无框架开发一个简单的2D游戏。我有一个长方形播放器,用户可以四处移动。在地图上有一些玩家不能通过的障碍。为此,我为玩家和每个障碍物及其边界创建了一个新的矩形对象。但我不确定这样做是否正确。它可以工作,但玩家的动作并不是真正的用户友好。如果玩家想要通过两个障碍物,他们必须在完美的坐标上才能通过 用一个矩形物体检查玩家和障碍物之间的交叉点是一个好主意,还是我应该用另一种方法 现在回答我的第二个问题: 我想用相同的击键替换矩形的击键,但是要用圆角,这样玩家可以更容易地传球

我正在用Java、swing和无框架开发一个简单的2D游戏。我有一个长方形播放器,用户可以四处移动。在地图上有一些玩家不能通过的障碍。为此,我为玩家和每个障碍物及其边界创建了一个新的矩形对象。但我不确定这样做是否正确。它可以工作,但玩家的动作并不是真正的用户友好。如果玩家想要通过两个障碍物,他们必须在完美的坐标上才能通过

用一个矩形物体检查玩家和障碍物之间的交叉点是一个好主意,还是我应该用另一种方法

现在回答我的第二个问题:
我想用相同的击键替换矩形的击键,但是要用圆角,这样玩家可以更容易地传球


这就是启用Hitboxs后游戏的外观

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

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
            }
        }
}
返回玩家/障碍物的点击框的函数:

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

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

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


如果这是一个障碍,他们不能去那里,就这么简单。请注意,这将允许玩家部分移动到障碍物中,但许多游戏都是这样做的,而且玩家肯定已经习惯了这种行为,尤其是在2D游戏中,图形设计成等距投影(我将您的类视为等距投影)。另一种方法是简单地将玩家碰撞矩形变小(比如说半块瓷砖,再次以玩家精灵的胸部或脚为中心)。

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

你的情况更简单,因为你在瓷砖上移动。。。因此,要么你(按照评论中的建议)维护一组“移动/不移动”牌并检查,要么你只是检查你的玩家的位置是否在“禁止”矩形内,即障碍物内。如果是,则必须将角色的位置重置为障碍物的“外部”(明显减去角色的边界框)


我强烈建议使用平铺方式:只允许上/下/左/右移动,并检查给定平铺位置的“禁止”移动集。如果你真的想要“自由”的移动,那么就不要使用圆圈(边界框/圆圈),因为它们很容易推理,很容易进行位置重置(在发生碰撞的情况下)并且非常适合你的情况(每个瓷砖都可以包含一个圆圈,无论是障碍物还是玩家。)

我想你可以让碰撞基于一个类似于平铺贴图的系统。@GiantTree这就是我创建贴图的方式。但这一切都是自我编码的。瓷砖贴图检测有什么不同吗?只是澄清一下:你是在瓷砖贴图上移动还是自由移动。如果你的玩家正在一张平铺地图上移动,你可以检查你想要移动的平铺是否可以通过,然后相应地移动。@GiantTree我有不同的障碍类型。有些人认为球员不应该传球,而另一些人则充当场地/背景。我想绕过玩家应该碰撞的障碍物碰撞框的角落。你可以使用a作为碰撞框,但文档中指出,
intersects()
方法只是一种近似方法,因为逻辑太复杂,无法进行精确检查。此外,它只能检查
矩形是否与之相交。