简单的蛇游戏 - libgdx

时间:2014-09-17 07:35:15

标签: libgdx coordinates overlap rectangles

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

蛇是由零件编制而成 - 每个部分都是20px宽X高20px的纹理(屏幕宽度为480px宽度×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类中使用重叠方法,但它不起作用。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

试试这个..

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;

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

答案 2 :(得分:0)

这个游戏应该是基于平铺的 这意味着,游戏被组织成一个网格,每个单元格都具有相同的大小 这是通过使用相机完成的:
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,我存储的地方,如果有:

  • Sn(P,x,y)(世界[x] [y] == 1)
  • Apple at P(x,y)(world [x] [y] == 2)
  • P(x,y)(世界[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;
         }
    }
}

希望它有所帮助!

答案 3 :(得分:0)

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)。