为什么我的碰撞检测方法不起作用?

时间:2017-08-07 11:12:34

标签: java collision-detection

我理解碰撞检测的基础,并且已经开发了我的方法(据我所知)用于碰撞检测。但是,它似乎没有起作用。我所做的不是在精灵,形状和其他物体周围绘制完整的矩形,而是简单地制作了在物体的所有侧面(左,右,顶部和底部)绘制线条(非常细的矩形)的方法。

在指定精灵的左,右,顶部和底部绘制细长方形的方法。这可能不是碰撞的最佳方式,但这就是我所拥有的,并且对所有想法和不同解决方案持开放态度!

注意:(int)(x-Game.getCamera()。getX()),(int)(y + height -Game.getCamera(。。getY()),仅适用于相机,所以玩家移动,树木(在我的情况下是我要碰撞的物体)不随身携带

public Rectangle getBounds() {
return new Rectangle((int)(x-Game.getCamera().getX()),
        (int)(y + height - Game.getCamera().getY()),width,height-height);
}

public  Rectangle getBoundsTop() {
return new Rectangle((int)(x-Game.getCamera().getX()),
        (int)(y- Game.getCamera().getY()),width,height-height);
}

public  Rectangle getBoundsRight() {
return new Rectangle((int)(x + width -Game.getCamera().getX()),
        (int)(y - Game.getCamera().getY()),width - width,height);

}

public  Rectangle getBoundsLeft() {
return new Rectangle((int)(x -Game.getCamera().getX()),
        (int)(y- Game.getCamera().getY()),width - width,height);

    }

实际碰撞CHECKING(在玩家类中) -

if(getBounds().intersects(treeTile.getBoundsTop())) {
    //What happens when they collide
    //When the bottom of the player collides with the top of the tree.
    }
if(getBoundsTop().intersects(treeTile.getBounds())) {
    //What happens when they collide
    //When the top of the player collides with the bottom of the tree

    }
if(getBoundsRight().intersects(treeTile.getBoundsLeft())) {
    //What happens when they collide
    //when the right side of the player collides with the left of the 
    //tree
    }
if(getBoundsLeft().intersects(treeTile.getBoundsRight())) {
    //What happens when they collide
    //When the left of the player collides with the right of the tree
    }

我感谢所有得到的帮助

这是碰撞和移动代码 -

for (int i = 0; i < handler.object.size(); i++) {
        Square handle = handler.object.get(i);
    if (getBounds().intersects(treeTile.getBoundsTop())) {
            handle.setvelY(-1);

    }
    if (getBoundsTop().intersects(treeTile.getBounds())) {
            handle.setvelY(0);

    }
    if (getBoundsRight().intersects(treeTile.getBoundsLeft())) {
            handle.setvelX(0);
    }
    if (getBoundsLeft().intersects(treeTile.getBoundsRight())) {
            handle.setvelX(0);

    }
    }

运动 -

    public void keyPressed(KeyEvent e) {

    int code = e.getKeyCode();



    for (int i = 0; i < handler.object.size(); i++) {
        Square handle = handler.object.get(i);

        if (handle.getId() == ObjectId.Zelda) {


            if (code == KeyEvent.VK_D) {
                handle.right();
            }
            if (code == KeyEvent.VK_A) {
                handle.left();
            }
            if (code == KeyEvent.VK_W) {
                handle.up();
            }
            if (code == KeyEvent.VK_S) {
                handle.down();
            }
 }

我的新碰撞想法 -

boolean walkRight = true;
boolean walkLeft = true;
boolean walkDown = true;
boolean walkUp = true;
public void tick() {

    if(walkRight == true) {
        velX = 2;

    }if(walkLeft == true) {
        velX = -2;

    }if(walkDown == true) {
        velY = 2;

    }if(walkUp == true) {
        velY = -2;
    }


if (getBounds().intersects(treeTile.getBoundsTop())) {
       walkDown = false;

}
if (getBoundsTop().intersects(treeTile.getBounds())) {
        walkUp = false;
}
if (getBoundsRight().intersects(treeTile.getBoundsLeft())) {
        walkRight = false;

}
if (getBoundsLeft().intersects(treeTile.getBoundsRight())) {
        walkLeft = false;

} 

这样的东西,不完全是,它只是一个例子。

1 个答案:

答案 0 :(得分:1)

您是否尝试使用1代替宽度 - 宽度和高度 - 高度?

我认为这些宽度/高度评估为0会导致交叉函数失败。

修改

我认为你已经过度复杂了。如果你只有一个大碰撞盒,而不是四个小碰撞盒,那么无论你在哪里移动你的玩家,你都可以

// Square previousPosition = currentPosition
// do move player code, which presumably updates the currentPosition
// loop through all the trees you have
//    if the player is colliding with a tree
//        currentPosition = previousPosition

这应该可以处理玩家与树的任何一侧发生碰撞,因为我们只是将它们移回原来的位置。