播放器和磁贴之间的碰撞检测(2D)

时间:2015-07-17 13:45:57

标签: java collision-detection

我一直在研究2D游戏,有点像Terraria,我已经到了准备进行碰撞检测的阶段。我自己尝试过,但它......很奇怪。我想知道是否有人可以帮助我。我将所有块存储在2D数组中:

Block[][] map = new Block[mw][mh];

其中mw是地图宽度,mh是地图高度(以块数表示)。每个Block是一个显示为16x16像素的图像。这是我尝试的,我知道这是错的,但我真的不知道我需要做什么。

private void checkCollision() {

    for(int x = -1; x <= 1; x++){
        for(int y = -1; y <= 2; y++){
            Rectangle obj = new Rectangle((int)Block.getXOnScreen(xblock+x), (int)Block.getYOnScreen(yblock+y), 16, 16);
            try{
                if(main.map[(int) (xblock+x)][(int) (yblock+y)].solid && obj.intersects(bounds()){
                    if(y <= -1 && velY > 0){
                        velY = 0;
                        System.out.println("Collision below");
                        onground = true;
                    }else if(y >= 2 && velY < 0){
                        velY = 0;
                        System.out.println("Collision above");
                    }
                    if(x <= -1 && velX < 0){
                        velX = 0;
                        System.out.println("Collision left");
                    }else if(x >= 1 && velX > 0){
                        velX = 0;
                        System.out.println("Collision right");
                    }
                }
            }catch(Exception e){}
        }
    }
}

我将这种方法称为每次滴答,但它不会与任何东西发生冲突,因此玩家就会摔倒。

public void tick(){
    xblock += velX;
    yblock += velY;
    velY += gravity;

    checkCollision();
} 

如果有人知道如何有效地进行碰撞检测,请与我分享。谢谢! :)

1 个答案:

答案 0 :(得分:-1)

基于我曾经写过的少数JavaFX / Swing应用程序,您想要检测碰撞的方式是始终跟踪对象的位置,以及何时移动检查以查看它是新位置(旧+运动)数量)不超过地图的限制。如果是这样,您希望将其位置重置为限制,以便它可以进入所有其他有效的方向。如果你继续试图超出极限,那么它应该继续重置你的位置。

所以说页面的限制是500像素宽,你在495位置,每次移动都是10,下次移动时你将位于505位置,这样就明显超出了范围。因此,您运行检查if(currentPosition&gt; limit){reset position to limit}因此您的currentPosition将设置为500,它位于边界上且在限制范围内。