【问题标题】:Java libGDX tetris collisionsJava libGDX 俄罗斯方块冲突
【发布时间】:2014-11-05 11:12:48
【问题描述】:

我正在开发一款俄罗斯方块游戏,我从碰撞部分开始。目前第一行工作正常,碰撞完成了它应该做的事情。当我得到第二行时它停止工作..我仍在将矩形添加到数组中,代码中似乎没有任何问题。我一直在使用调试器,但我找不到问题。这是我做过的第一个编程项目。已经学习了大约 3 个月的 Java,所以这肯定是一个菜鸟问题。这是我的创建和渲染方法。感谢您的阅读。

@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();
    }

}

【问题讨论】:

    标签: java libgdx collision-detection


    【解决方案1】:

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

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

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

    然后您可以使用此信息来确定是否存在碰撞:

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

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

    澄清:当我说块时,我的意思是一个四联体,从顶部掉下来的整个物体。每个俄罗斯方块块包含四个不同排列的正方形。

    【讨论】:

    • 不错的俄罗斯方块游戏!看起来不错,但是..我认为我需要按照我想象的方式解决这个问题。否则我只会复制别人的代码,这不会让我成为一个更好的程序员。我已经将我的项目分解为小问题,每个问题都应该让我更接近完成的游戏。目前这是我需要解决的碰撞部分。但再次感谢 =)
    • @Sociopaten 你不需要使用不同的方法,你只需要考虑其他人使用的方法,而不是复制它。如果您了解该方法,您可能可以将它(或稍微更改的版本)用于其他问题,如果您只是复制它,您甚至无法再次使用此方法。在俄罗斯方块的情况下,collision detection 只是检查一个单元格,我的俄罗斯方块对象是否占用,如果它已经被其他人占用,则存在冲突。
    • @Sociopaten 请考虑到标准碰撞检测在某些情况下可能会导致问题,例如当您尝试将一个正方形放入两个正方形之间的一个插槽中时,甚至在一些更常见的情况下 - 您在不应该发生碰撞的情况下可能会发生碰撞。此外,这种方法不是我发明的——我想我是从某个地方偷来的 :)
    • 是的。这对我来说现在更有意义了。谢谢,你很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多