我试图用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类中使用重叠方法,但它不起作用。
答案 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)
viewportWidth
和viewportHeight
定义了x
和y
中应该有多少个单元格。
当您使用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
,我存储的地方,如果有:
这意味着,如果蛇离开瓷砖,则需要将其值设置为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)。