【问题标题】:Java 2D tile based game Collision (TOP/BOTTOM/LEFT/RIGHT)Java 2D tile based game Collision (TOP/BOTTOM/LEFT/RIGHT)
【发布时间】:2013-07-24 08:42:49
【问题描述】:

您好,我最近学习了 Java,并且正在制作一个基于 2D 瓷砖的游戏。我已经设置了游戏循环和所有基于瓷砖的东西,没有任何问题,但我一直在用头撞墙......这看起来很容易,但我最难过。我希望能够停止四个方向的运动,但它似乎无法正常工作。如果我以这种方式使用它,它将停止上下,但是一旦我添加侧面碰撞,它就会向上移动,因为 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;
                }

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

【问题讨论】:

  • 请不要在 this 网站上使用您不熟悉其含义的标签。每个标签都有一个出现的描述。这是一个“面向专业和爱好者程序员”的网站。专业程序员使用一种由 IBM 开发和发展的称为 RPG 的语言。它被悄悄地用于运行比大多数人意识到的更多的核心业务应用程序。
  • 你在这个网站上搜索过可用的方法吗? “我如何在 2D/基于图块的游戏中检测/处理碰撞?”是一个很常见的问题。您可能会找到您的解决方案,或者您更喜欢的方法。
  • 对于 RPG 标记感到抱歉,就像早上 5:40 一样,我正在寻找一种更好的算法来更好地检测侧面撞击并确定在角落发生撞击时选择哪一侧。

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


【解决方案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
    }
    ...
}

【讨论】:

  • 这让我有点困惑
【解决方案2】:

不要使用 '

【讨论】:

  • 所以我已经确定,在没有 '=' 的情况下,推送仍然发生,正如我所想的那样。它与瓷砖为 32x32 且玩家边界为 32x32 相关,当两条边线都发生时向上
  • 代码是否应该更像 if (player.rect.y
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
相关资源
最近更新 更多