Java libGDX俄罗斯方块冲突

时间:2014-11-05 11:12:49

标签: java libgdx collision-detection

我正在制作俄罗斯方块游戏,我从碰撞部分开始。目前第一行工作正常,碰撞做了它应该做的事情。当我得到第二行它停止工作..我仍然将矩形添加到数组并且代码中似乎没有任何错误。我一直在使用调试器,但我找不到问题。这是我做过的第一个编程项目。一直在学习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();
    }

}

1 个答案:

答案 0 :(得分:2)

俄罗斯方块拥有谨慎的位置。它的游戏区域高20行,宽10列。可能不需要标准的碰撞检测。

例如,您可以使用具有布尔值或整数值的二维数组来表示某个位置上正方形的存在:

int[][] squares = new int[20][10];

然后,您可以使用此信息来确定是否存在冲突:

  • 只有当该动作的结果位置不会导致任何方块与游戏区域中已存在的方块重叠并且位于游戏区域范围内(20行和10列)时,才允许旋转或移动。
  • 如果当前活动块上的任何方块到达底行或者在同一列中并且已经填充了一个方块上方的一行,则该块已到达其最终目的地。
  • 如果屏幕上首次出现一个区块,其中一些方格已经处于占用位置,那么它就是游戏结束。

几年前我使用libgdx制作了一个俄罗斯方块克隆,如果您认为它可能对您有所帮助,请查看它。您可以看到一些图片here并从here获取来源。

澄清:当我说块时我的意思是一个tetromino,整个物体从顶部落下。每个俄罗斯方块都有四个不同排列的方块。

相关问题