Java libGDX 俄罗斯方 block 碰撞

标签 java libgdx collision-detection

我正在开发俄罗斯方 block 游戏,我已经从碰撞部分开始。目前第一行工作正常,碰撞按预期进行。当我得到第二行时,它停止工作。我仍在将矩形添加到数组中,代码中似乎没有任何问题。我经常使用调试器,但找不到问题。这是我做过的第一个编程项目。现在已经学习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();
    }

}

最佳答案

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

例如,您可以使用带有 boolean 值或整数值的二维数组来表示某个位置是否存在正方形:

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

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

  • 仅当该操作所产生的位置不会导致任何方 block 与游戏区域中已有的方 block 重叠并且位于游戏区域边界(20 行和 10 列)内时,才允许旋转或移动。<
  • 如果当前 Activity block 上的任何方 block 到达底行或位于同一列且已填充方 block 上方的一行,则该 block 已到达其最终目的地。
  • 如果当一个方 block 第一次出现在屏幕上时,它的一些方 block 已经占据了位置,那么游戏就结束了。
  • 等等

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

澄清:当我说 block 时,我指的是四格骨牌,即从顶部落下的整个物体。每个俄罗斯方 block block 包含四个不同排列的方 block 。

关于Java libGDX 俄罗斯方 block 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26755790/

相关文章:

java - 如何构建 netty-transport-native-epoll-4.0.32.Final-linux-x86_64.jar?

java - 如何将信息存储在 float 中并使其可重复使用?

java - 无法使用 libgdx 创建正确的表

java - libGDX Sprite 渲染失败

flash - 优化 Actionscript 3 中的碰撞检测。

java - 谁能解释一下这个 Java Mergesort 行为解释?

java - 使用 BufferedReader 按任意键

java - 检查连接到服务器的Android应用程序是否是您制作的应用程序

Swift/SpriteKit 访问对象的变量 + 删除节点

javascript - 需要碰撞检测的 Javascript 和 Canvas "engine"