【问题标题】:Unable to Draw Sprite after Camera.Update in LibGDX在 LibGDX 中的 Camera.Update 之后无法绘制 Sprite
【发布时间】:2017-04-17 08:54:19
【问题描述】:

我是 Libgdx 开发的新手,我正在开发类似 Candy Crush 的游戏。我有一个背景板,在该板上方有许多不同颜色的硬币,用户可以在其中拖动和播放。除了一个问题外,所有代码都运行良好,我创建了一个逻辑,在该逻辑中用户达到了多个点和级别,此时我想显示一个弹出窗口,说 Level Up + NumberOfLevel。我用背景图像和字体组合创建了该弹出窗口。但我无法绘制它,因为我在 camera.update() 之后调用它。

这是我的整个逻辑代码:

private void initLevelLogic() {

    if (baseLevel == 0) {
        baseTime = 180;
        basePoint = 400;

        gameTime = baseTime;

        progressBar = new ProgressBar(0, baseTime, 1, false, progressBarStyle);
        progressBar.setValue(baseTime);

        baseScoreToMinus = 0;

        baseLevel++;
    } else {
        Log.d("Runnable", "RUNNABLE CALLED");

        initLevelUpAnimation(baseLevel);

        Timer.schedule(new Task() {
            @Override
            public void run() {
                baseTime -= 10;

                basePoint = basePoint + (100 * baseLevel);

                /**
                 * Game time will be used to calculate in render() method which is going to be in float.
                 */
                gameTime = baseTime;

                progressBar = new ProgressBar(0, baseTime, 1, false, progressBarStyle);
                progressBar.setValue(baseTime);

                baseScoreToMinus = 0;

                baseLevel++;
                delayTime = 0;


                stopGameObjects = false;
            }
        }, 5.0f);
    }
}

private void initLevelUpAnimation(int level) {
    levelUp = new Sprite(levelUpBG);
    levelUp.setSize(250, 250);
    levelUp.setPosition(gamePlayBG.getWidth() / 2 - levelUp.getWidth() / 2,
            gamePlayBG.getHeight() / 2 - levelUp.getHeight() / 2);

    stopGameObjects = true;
}

我使用了带有延迟的布尔值 stopGameObjects,因此我可以在 render() 方法上绘制精灵。

这是我的 render() 方法代码:

public void render(float delta) {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    game.batch.begin();

    game.batch.setProjectionMatrix(camera2.combined);

    game.batch.draw(gamePlayBG, 0, 0);

    if (gameOver != true) {
        //Log.d("render------------", "render: "+ delta);

        progressBar.draw(game.batch, 1);

        progressBar.setPosition(115, 700);
        progressBar.setHeight(15);
        progressBar.setWidth(270);

        game.gameTopFonts.draw(game.batch, "Level " + baseLevel + " - ", 140, 750);
        game.gameTopFonts.draw(game.batch, (basePoint - baseScoreToMinus) + " Points to Go", 225, 750);

       if (score == 0) {
            game.scoreFonts.draw(game.batch, score + "", 300, 810);
        } else if (score < 100) {
            game.scoreFonts.draw(game.batch, score + "", 280, 810);
        } else if (score < 1000) {
            game.scoreFonts.draw(game.batch, score + "", 260, 810);
        } else {
            game.scoreFonts.draw(game.batch, score + "", 245, 810);
        }
    }

    //Writing this here will give output shown in the screenshot
    if (stopGameObjects) {
        levelUp.draw(game.batch);

        game.levelUpFont.drawMultiLine(game.batch, "Level " + baseLevel + 1 + "\n" + "KEEP GOING", gamePlayBG.getWidth() / 2,
                gamePlayBG.getHeight() / 2);

    }

    camera.update();

    game.batch.setProjectionMatrix(camera.combined);

    if (lineHud.size > 1) {
        for (Sprite sprite : this.lineHud) {
            sprite.draw(game.batch);
        }
    }

    for (int i = 0; i < gameObjects.size; i++) {
        gameObjects.get(i).draw(game.batch);
    }

    for (Sprite sprite : this.scoreHud) {
        sprite.draw(game.batch);
    }
}

render 方法中的这段代码用于绘制弹出窗口:

if (stopGameObjects) { 
    levelUp.draw(game.batch);
    game.levelUpFont.drawMultiLine(game.batch,
            "Level " + baseLevel + 1 + "\n" + "KEEP GOING",
            gamePlayBG.getWidth() / 2,
            gamePlayBG.getHeight() / 2); 
}

如果我将此代码放在 camera.update() 上方,我会得到屏幕截图中显示的输出。弹出窗口位于硬币后面。为了在硬币上方显示它,我需要将它放在绘制 gameobject 的 for 循环之后,但它不起作用。请给出您的建议,因为我坚持了 3 天。

【问题讨论】:

    标签: android opengl-es libgdx sprite


    【解决方案1】:

    这是因为您将游戏的其余部分绘制在文本之上。

    要解决此问题,您可以在绘制所有其他精灵之后将文本的绘制向下移动。记得再拨打setProjectionMatrix()。

    if (stopGameObjects) {
        game.batch.setProjectionMatrix(camera2.combined);
    
        levelUp.draw(game.batch);
        game.levelUpFont.drawMultiLine(game.batch,
                "Level " + baseLevel + 1 + "\n" + "KEEP GOING",
                gamePlayBG.getWidth() / 2,
                gamePlayBG.getHeight() / 2); 
    }
    

    【讨论】:

    • 非常感谢。你是一个救生员:)
    • 我非常感谢@Vallentin 的帮助。我还需要一个人情。我也在尝试为这个弹出窗口制作动画:stackoverflow.com/questions/43465424/… 如果可以的话,请给你的建议。
    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多