0

我认为使用 libGDX 制作俄罗斯方块克隆会很酷。我很快就想出了如何制作一个落块并将其保持在屏幕内。我的下一个挑战是在当前区块落地后立即“生成”一个新区块。我看了几个教程,但他们设计的代码与我不同,这让我很难弄清楚。我知道我必须将对象添加到数组中,然后继续在屏幕上绘制它们,但这是我卡住的地方。

这是我编写的 Block 类的一部分。

public void spawnBlock(float delta) {

        box = new Rectangle();
        box.width = 40f;
        box.height = 40f;
        this.setPosition(TetrixGame.WIDTH / 2 - box.width / 2, TetrixGame.HEIGHT);

        boolean isFalling = true;

        for(int i = TetrixGame.HEIGHT; i > 0; --i) {
            box.y -= (fallSpeed * delta);

            if(Gdx.input.isKeyJustPressed(Keys.LEFT) && isFalling) {
                stepLeft();
            }
            if(Gdx.input.isKeyJustPressed(Keys.RIGHT) && isFalling) {
                stepRight();
            } 
            if(Gdx.input.isKeyPressed(Keys.DOWN)) {
                setDown();
            }

            if(box.x < 0) box.x = 0;
            if(box.x > TetrixGame.WIDTH - box.width) box.x = TetrixGame.WIDTH - box.width;
            if(box.y < 0) {
                box.y = 0;
                isFalling = false;
                blocks.add(box); 



            }
        }
    }

public class TetrixGame extends Game {

public static final int WIDTH = 480;
public static final int HEIGHT = 800;
public static final String TITLE = "TetriX";


private Block block;
private ShapeRenderer renderer;
private OrthographicCamera camera;




@Override
public void create() {

    block = new Block();


    renderer = new ShapeRenderer();
    camera = new OrthographicCamera();
    camera.setToOrtho(false, 480, 800);
}



@Override
public void render() {
    super.render();

    Gdx.gl.glClearColor(0, 0, .2f, .8f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.setProjectionMatrix(camera.combined);

    camera.update();

    block.spawnBlock(Gdx.graphics.getDeltaTime());





    renderer.begin(ShapeType.Filled);

     //I know this part should be in a loop but it´s not working

    renderer.rect(block.getX(), block.getY(), block.getWidth(), block.getHeight());

    renderer.end();



}
4

1 回答 1

0

简而言之,我可以向您推荐这种方法。

创建 Block.java 类并将所有函数从 spawnBlok 和 render() 函数移到其中。从垃圾代码中清除您的主类很有帮助。然后那样做

{ 
  Block myBlock;

  void onCreate() {
     myBlock = new Block();
     // .....
  }

  void createBlock() {
     myBlock = new Block();
  }

  render() {
    myBlock.render;
  }
}

最后,当您的块到达底部时,您需要从 Block.java 调用 createBlock()。

    if(this.y < 0) {
        myGame.createBlock(); 
    }

我认为最好重新创建您的 Block 以不使用一项。稍后您可以创建多个同时落下的块(只需创建 Block[] 大量块)以使您的游戏复杂化。这不是一个确切的工作代码,但我认为你可以在几分钟内完成它。问你是否有一些问题

于 2019-02-14T16:03:59.033 回答