0

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

这是有关我的设置的更多信息

我有我的主线程午餐我的游戏线程(游戏循环)。游戏循环产生了一个“房间”,这个房间是为我的屏幕管理器准备的。我有一个名为 MapScreen 的类,它扩展了房间这个“房间”包含我的瓷砖数组和一个 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;
                }

            }
        }
    }

例如,当我尝试在此处添加边(左)时:

                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;
                }

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

4

2 回答 2

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
    }
    ...
}
于 2013-07-24T09:58:30.423 回答
0

不要使用 '<=' 使用 '<' 如果它仍然超过顶部。另一个问题是你的游戏循环有多快?可能是您的游戏循环太慢而无法检测到更改,直到矩形发生碰撞。您可能需要指定矩形的高度和宽度,并使用它来进行更准确的碰撞检测。

于 2013-07-24T09:29:45.403 回答