java - 获取矩形碰撞的方向

标签 java collision

我正在制作一款平铺游戏。我想检查平铺从玩家开始的方向,何时发生碰撞。

static public boolean intersectRectangles(Rectangle rectangle1, Rectangle rectangle2, Rectangle intersection) {
    if (rectangle1.overlaps(rectangle2)) {
        intersection.x = Math.max(rectangle1.x, rectangle2.x);
        intersection.width = Math.min(rectangle1.x + rectangle1.width, rectangle2.x + rectangle2.width) - intersection.x;
        intersection.y = Math.max(rectangle1.y, rectangle2.y);
        intersection.height = Math.min(rectangle1.y + rectangle1.height, rectangle2.y + rectangle2.height) - intersection.y;
        return true;
    }
    return false;
}   

如果没有碰撞,我希望这个函数返回 0

1 = rect1 在左侧

2 = rect1 在右边

3 = rect1 位于底部

4 = rect1 位于顶部

喜欢这张照片:

enter image description here

我尝试这样做

// if there is a collision between player and tile
float xdif = player.x + 40 - j * 40;
float ydif = player.y + 40 - i * 40;
Direction direction = Direction.RIGHT;
if (Math.abs(xdif) > Math.abs(ydif)) {
    if (player.y > i * 40)
        direction = Direction.DOWN;
    else
        direction = direction.UP;

} else {
    if (player.x > j * 40)
        direction = Direction.LEFT;
    else
        direction = direction.RIGHT;
}

但是不起作用..

最佳答案

这假设左下原点坐标系(x→,y↑)

static public int intersectRectangles(Rectangle player, Rectangle tile) {
    if(!player.overlaps(tile))
        return 0;      

    Double pL = player.x,             //left
           pR = pL + player.width,    //right
           pT = player.y,             //bottom
           pB = pT + player.height;   //top

    Double tL = tile.x,               //left
           tR = tL + tile.width,      //right
           tT = tile.y,               //bottom
           tB = tT + tile.height;     //top

    Double inf = Double.MAX_VALUE;
    List<Double> intersect_diffs = new ArrayList<Double>(new Double[] {inf,inf,inf,inf});

    if(pR > tL && pL < tL)             // Player on left
        intersect_diffs[0] = pR - tL;
    if(pL < tR && pR > tR)             // Player on Right
        intersect_diffs[1] = tR - pL;
    if(pT > tB && pB < tB)             // Player on Bottom
        intersect_diffs[2] = pT - tB;
    if(pB < tT && pT > tT)             // Player on Top
        intersect_diffs[3] = tT - pB;

    // return the closest intersection
    return intersect_diffs.indexOf(Collections.Min(intersect_diffs));
}

关于java - 获取矩形碰撞的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652416/

相关文章:

java - Bukkit 和 Vault : Is there a way to loop through every single player's balance?

swift - 防止具有相同 Catagorymask 的 Spritekit 节点发生碰撞

java - 泛型的使用是子类

java - java中是否有相当于while(scanf()==1)的函数?

javascript - 对象与 Canvas 上对象矩阵之间的碰撞

python - Pygame - 矩形并排碰撞

algorithm - 超过大空间的给定碰撞概率所需的项目数

礼品卡代码算法

java - 如何在 hibernate 中通过 ArrayList 保存多个对象?

java - 如何将 String 数组转换为 Json 数组