我正在玩俄罗斯方块游戏,我从碰撞部分开始。当前第一行工作正常,碰撞完成了预期的工作。当我得到第二行时,它停止工作。.我仍在将矩形添加到数组中,代码中似乎没有任何错误。我已经使用调试器很多,但是我找不到问题。这是我做过的第一个编程项目。现在学习Java大约3个月了,所以这肯定是一个菜鸟问题。这是我的创建和渲染方法。感谢您的阅读。
@Override
public void create () {
camera = new OrthographicCamera();
camera.setToOrtho(false, WIDTH, HEIGHT);
blocks = new Array<Blocks>();
boxes = new Array<Rectangle>();
block = new Block();
}
@Override
public void render () {
Gdx.gl.glClearColor(0, 0, .2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
block.getRenderer().setProjectionMatrix(camera.combined);
block.draw();
// Update
block.drop(Gdx.graphics.getDeltaTime());
isFalling = true;
Rectangle box = block.getBox();
// Collision
for(Rectangle r: boxes) {
if(box.overlaps(r)) {
isFalling = false;
System.out.println("collision");
block.setY(r.height);
boxes.add(box);
blocks.add(block);
System.out.println("Block added. creating new block..");
block = new Block();
break;
}
}
// Borders
if(box.x < 0) box.x = 0;
if(box.x > WIDTH - box.width) box.x = WIDTH - box.width;
if(box.y < 0) {
isFalling = false;
System.out.println("not falling");
box.y = 0;
boxes.add(box);
blocks.add(block);
System.out.println("Block added. creating new block..");
block = new Block();
}
// Controls
if(Gdx.input.isKeyJustPressed(Keys.LEFT) && isFalling)
block.stepLeft();
if(Gdx.input.isKeyJustPressed(Keys.RIGHT) && isFalling)
block.stepRight();
if(Gdx.input.isKeyJustPressed(Keys.DOWN))
block.setDown();
for(Blocks b: blocks) {
b.draw();
}
}
最佳答案
俄罗斯方块块的位置谨慎。它的游戏区高20行,宽10列。可能不需要标准的碰撞检测。
例如,您可以使用具有布尔值或整数值的2D数组,这些值表示某个位置上存在正方形:
int[][] squares = new int[20][10];
然后,您可以使用此信息来确定是否存在冲突:
仅当该动作产生的位置不会导致任何正方形与游戏区域上已经存在的正方形重叠并且在游戏区域边界内(20行和10列)时,才允许旋转或移动。
如果当前活动块上的任何正方形到达底部行或在同一列中且已填充正方形的上方一行,则表明该块已到达其最终目的地。
如果当一个方块第一次出现在屏幕上时,它的某些方块已经处于占据位置,那么游戏结束了。
等等。
几年前,我使用libgdx制作了俄罗斯方块克隆,请检查一下是否对您有帮助。您可以看到一些图像here,并从here获取源。
澄清:当我说“障碍”时,我的意思是一个Tetromino,整个物体从顶部掉落。每个俄罗斯方块块包含四个不同排列的正方形。