Java 播放器和互动程序之间的碰撞检测(2D)

Java 播放器和互动程序之间的碰撞检测(2D),java,collision-detection,Java,Collision Detection,我一直在做2D游戏,有点像,我已经到了准备进行碰撞检测的阶段。我自己也试过,但是。。。嗯,这很奇怪。我想知道是否有人能帮我。我将所有块存储在二维阵列中: Block[][] map = new Block[mw][mh]; 式中,mw是地图宽度,mh是地图高度,表示块数。每个块都是显示为16x16像素的图像。这就是我所尝试的,我知道这是错误的,但我真的不知道我需要做什么 private void checkCollision() { for(int x = -1; x <= 1

我一直在做2D游戏,有点像,我已经到了准备进行碰撞检测的阶段。我自己也试过,但是。。。嗯,这很奇怪。我想知道是否有人能帮我。我将所有块存储在二维阵列中:

Block[][] map = new Block[mw][mh];
式中,mw是地图宽度,mh是地图高度,表示块数。每个块都是显示为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){}
        }
    }
}

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

根据我曾经编写的几个JavaFX/Swing应用程序,检测碰撞的方法是始终跟踪对象的位置,并在其移动时检查是否为新位置旧+移动计数未超过地图的限制。如果是这样,您希望将其位置重置为限制上的正确位置,以便它可以向所有其他有效方向移动。如果你一直试图超出限制,那么它应该继续重置你的位置


假设页面的限制是500像素宽,你在位置495,每移动10次,下次你移动时,你会在位置505,所以这显然超出了范围。因此,您运行一个检查ifcurrentPosition>limit{reset position to limit},这样您的currentPosition将设置为500,正好在边界上,并且在限制范围内

你的速度有多大范围?因为在我看来,如果你的速度大于单个块体的大小,你就不会检测到碰撞。因为你的x/yblock变量跳过了你想要的块hitCasey aka Handedehro有一些关于基于平铺的游戏中碰撞检测的好教程,请注意,他将平铺贴图的整数索引转换为实际的世界坐标浮动,并对它们进行更精确的碰撞处理。重力变量为0.8确定,我会看一看,谢谢
public void tick(){
    xblock += velX;
    yblock += velY;
    velY += gravity;

    checkCollision();
}