基于Java 2D tile的游戏碰撞(TOP / BOTTOM / LEFT / RIGHT)

时间:2013-07-24 08:42:50

标签: java collision-detection game-physics rectangles collision

你好,所以我最近学习了Java,我正在制作一个基于2D平铺的游戏。我已经设置了游戏循环和所有基于瓷砖的东西,没有任何问题,但我一直在敲打我的头靠在墙上...这似乎很容易,但我有最困难的时间。我希望能够在四个方向上停止运动,但似乎无法正常工作。如果我这样使用它会上下停止但是一旦我添加了侧面碰撞,它就会向上移动,因为x< x如果有人有更好的解决方案或甚至算法,请告诉我!谢谢!

以下是有关我的设置的更多信息

我的主线程是我的游戏线程(游戏循环)。 游戏循环产生一个“房间”,房间是我的屏幕管理器。我有一个名为MapScreen的类,它扩展了房间,这个“房间”包含我的tiles数组和一个Player类。在MapScreen中处理碰撞的方法是覆盖房间更新方法,因此主游戏循环会更新所有内容。玩家时刻是在玩家类中的一个方法中控制我知道我可以将数组的引用传递给玩家然后只是检查移动,如果瓷砖没有被阻止我在我想尝试新的东西之前做了类似的事情。

这是我目前的代码:

for (int x = 0; x < 50;x++){
        for (int y = 0; y < 50; y++){
            if (player.rect.intersects(tiles[x][y].rect) && tiles[x][y].blocked == true ){
                //Top
                if (player.rect.y < tiles[x][y].rect.y){
                    player.rect.y -= 10;
                }
                if (player.rect.y > tiles[x][y].rect.y){
                    player.rect.y += 10;
                }

            }
        }
    }

例如,当我尝试在这里添加side(左)时:

                if (player.rect.y < tiles[x][y].rect.y){
                    player.rect.y -= 10;
                }

                if (player.rect.y > tiles[x][y].rect.y){
                    player.rect.y += 10;
                }

                if(player.rect.x < tiles[x][y].rect.x ){
                    player.rect.x -= 10;
                }

上面的代码有点工作然后它只是将它推到顶部。 -_-

2 个答案:

答案 0 :(得分:1)

我使用的速度矢量如下:

Class Player {
    public float x, y; // velocity of player

    public void updatePosition() {
        // set x and y based on user inputs
        for (int i; i<50; i++) {
            for (int j; j<50; j++) {
                if (player.rect.intersects...) {
                    if (player.rect.y > tiles[i][j]) {
                        this.y = 0;
                    }
                    ...
                }
            }
        }
        // translate player by final velocity vector
    }
    ...
}

答案 1 :(得分:0)

不要使用'&lt; ='使用'&lt;'如果它还在推顶。 另一个问题是你的游戏循环速度有多快?可能是你的游戏循环太慢而无法检测到变化,直到rect碰撞过来。 您可能需要指定rect的高度和宽度,并使用它来进行更准确的碰撞检测。