【问题标题】:simple snake game - libgdx简单的蛇游戏 - libgdx
【发布时间】:2023-04-09 07:05:01
【问题描述】:

我正在尝试使用 libgdx 开发一个简单的蛇游戏。我的问题是,每次我想生成一些苹果(纹理,20px 宽 X 20px 高)时,它总是与蛇的身体重叠。 我试图避免这种情况,但它在游戏过程中不断发生。

蛇由部分组成-每个部分都是20px宽X 20px高的纹理(屏幕宽度为480px宽X 800px高)

这是我迄今为止尝试过的:

public void addApple() {
    accomplishedSnake = false;
    accomplishedApples = false;
    while (!accomplishedSnake && !accomplishedApples) {
        xApple = 20 * MathUtils.random(0, 23);
        yApple = 20 * MathUtils.random(20, 36);
        if (!accomplishedSnake) {
            for (int i = 0; i < snake.getSize(); i++) {
                if (snake.getPart(i).getX() <= xApple
                        && snake.getPart(i).getX() + 20 >= xApple
                        && yApple >= snake.getPart(i).getY()
                        && yApple <= snake.getPart(i).getY() + 20)
                    break;
                if (i == snake.getSize() - 1) {
                    accomplishedSnake = true;
                    break;
                }
            }
        }
        if (!accomplishedApples) {
            for (int i = 0; i < apples.size; i++) {
                if (apples.get(i).getX() <= xApple && apples.get(i).getX()+20 >= xApple
                        && yApple >= apples.get(i).getY() && yApple <= apples.get(i).getY()+20)
                    break;
                if (i == apples.size - 1) {
                    accomplishedApples = true;
                    break;
                }
            }
        }
    }
    apples.add(new Apple(xApple, yApple));
}

代码是不言自明的。每时每刻我的屏幕上都有 3 个不同的苹果。此代码尝试为新苹果抽奖 x-y 坐标,但在将苹果添加到屏幕并渲染之前,我想确保它不会与蛇或其他苹果的身体重叠。

我只是看不出这段代码有什么问题。

P.S 我尝试在 Rectangle 类中使用重叠方法,但它不起作用。

【问题讨论】:

    标签: libgdx coordinates overlap rectangles


    【解决方案1】:

    你的测试条件太简单了。每件蛇的身体部位/苹果都有大小,你需要考虑它们的轨迹。所以 [snake.X,snake.X+20] 和 [snake.Y,snake.Y+20] 被每个身体部位占用,你需要确保 apple.X 和 apple.X+20 不在范围内, 苹果也一样。Y

    【讨论】:

    • 我试图实现你所说的,但它也不起作用。我在这篇文章中添加了我的新代码。这个问题的原因可能是什么?
    【解决方案2】:

    试试这个..

    if (snake.getPart(i).getX() >= xApple
          && snake.getPart(i).getX() + 20 <= xApple
          && snake.getPart(i).getX() >= xApple+20
          && snake.getPart(i).getX() + 20 <= xApple+20
          && snake.getPart(i).getY() >= yApple 
          && snake.getPart(i).getY() + 20 <= yApple
          && snake.getPart(i).getY() >= yApple +20
          && snake.getPart(i).getY() + 20 <= yApple +20)
       break;
    

    您还需要确保在进入 while 循环之前和每次计算随机坐标之后都将 completedApple 和 completedSnake 设置为 false。 在您的代码中进一步建立 completedApple 时,您还需要模仿此逻辑。

    【讨论】:

    • 对不起,它不起作用。我试图实现你所说的,但苹果总是与蛇的身体重叠。
    • 在 if 之前放一个 fprintf 语句。检查那个条件,你可能需要 ||并将条件交换为苹果 >= 蛇。我编程的是 c 而不是 c#,所以我不能很容易地编译和测试。
    【解决方案3】:

    这个游戏应该是基于图块的。
    这意味着,游戏被组织成一个网格,其中每个单元格都具有相同的大小。
    这是通过使用相机完成的:
    OrthographicCamera cam = new OrthographicCamera(viewportWidth, viewportHeight) viewportWidthviewportHeight 定义了 xy 中应该有多少个单元格。
    当您使用 480*800px 的分辨率和 20*20px 大小的图片时,viewportWidth 应为 480/20=24,viewportHeight 应为 800/20 = 40。
    请注意,摄像机 P(0/0) 位于屏幕中间,您可以看到从 -12 到 12 (x) 和 -20 到 20 (y) 的对象。只需将相机的位置设置为 P(12/20) 并且 P(0/0) 是左下角,和往常一样。

    现在产卵很容易:
    我使用int[][] world,我存储的地方,如果有:

    • P(x,y) 处的 Snakepart (world[x][y] == 1)
    • Apple 在 P(x,y) (world[x][y] == 2)
    • 在 P(x,y) 处没有任何东西(world[x][y] == 0)

    这意味着,如果蛇离开一个格子,你需要将它的值设置为 0 (world[x][y] = 0) 并且它进入的每个格子都设置为 1 (world[x][y] = 1 )

    public void spawnApple() {
        boolean spawned = false;
        while(!spawned) {
             // The lower left corner is always an int-value
             int x = (int)MathUtils.random(0, 23);
             int y = (int)MathUtils.random(0, 40);
             if (world[x][y] == 0) {
                 // Add Apple at x,y
                 world[x][y] = 2;
             }
        }
    }
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的建议,但是我发现您的解决方案对我来说有点复杂,因为我已经以某种方式开发了我的游戏。我的代码很正常,应该可以工作。但是,条件和计算有问题。
    • @DavidLasry 你可以使用你的方式,但你应该绝对使用cameraviewport。一旦你理解了它,它真的很有帮助。那么计算也会更容易一些,因为您不再需要关心像素。
    【解决方案4】:
    private void checkAndPlaceApple() {
        if(!appleAvailable) {
            do {
                appleX = MathUtils.random(Gdx.graphics.getWidth / 20 - 1) * 20;
                appleY = MathUtils.random(Gdx.graphics.getHeight / 20 - 1) * 20;
                appleAvailable = true;
            } while(appleX == snakeX && appleY == snakeY);
        }
    }
    

    前面的代码显示了将苹果放在 屏幕。首先,我们检查是否需要放置一个苹果,然后我们随机挑选 屏幕上的位置,它是 20 的倍数,如果选择的位置包含蛇,我们会重新选择它。由于我们在 0 索引环境中工作,我们需要减去一个(1-20 变为 0-19,1-15 变为 0-14)。

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      相关资源
      最近更新 更多