繁体   English   中英

播放器与图块之间的碰撞检测(2D)

[英]Collision detection between player and tiles (2D)

我一直在开发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();
} 

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

基于我曾经编写的少数JavaFX / Swing应用程序,要检测碰撞的方法是始终跟踪对象的位置,并在对象移动时检查其是否为新位置(旧+移动计数)为不超过地图的限制。 如果是这样,您希望将其位置重置为正确的极限,以便它可以沿所有其他有效方向运行。 如果您继续尝试超出限制,那么它应该继续重置您的头寸。

因此,假设页面的限制是500像素宽,您位于495位置,每次移动为10,那么下次移动时您将位于505位置,因此显然超出了范围。 因此,您运行了一个if(currentPosition> limit){将位置重置为限制},从而将currentPosition设置为500,这恰好在边界上并且在限制之内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM