8

这是我当前在我的 Libgdx 游戏中的关卡上的渲染方法。我正在尝试在关卡的右上角绘制一个 BitmapFont,但我得到的只是一堆白框。

 @Override
    public void render(
            float delta ) {
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        this.getBatch().begin();

            //myScore.getCurrent() returns a String with the current Score
        font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500);
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();
        this.getBatch().end();
        }

我想将乐谱字体添加到某种演员中,然后执行 scene.addActor(myScore) 但我不知道该怎么做。我按照 Steigert 的教程创建了在 AbstractLevel 类中实例化场景字体的主游戏类,然后由该级别扩展。

到目前为止,我没有使用任何自定义字体,只是空的 new BitmapFont(); 使用默认 Arial 字体。后来我想用我自己的更花哨的字体。

4

4 回答 4

12

尝试将 font.draw 移到 stage.draw 之后。将它添加到演员将非常简单,只需创建一个新类并像这样扩展演员

import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;

public class Text extends Actor {

    BitmapFont font;
    Score myScore;      //I assumed you have some object 
                        //that you use to access score.
                        //Remember to pass this in!
    public Text(Score myScore){
        font = new BitmapFont();
            font.setColor(0.5f,0.4f,0,1);   //Brown is an underated Colour
    }


    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
         font.draw(batch, "Score: 0" + myScore.getCurrent(), 0, 0);
         //Also remember that an actor uses local coordinates for drawing within
         //itself!
    }

    @Override
    public Actor hit(float x, float y) {
        // TODO Auto-generated method stub
        return null;
    }

}

希望这可以帮助!

编辑1: 也尝试System.out.println(myScore.getCurrentScore());确保这不是问题。你可以让它返回一个浮点数或一个整数,当你这样做时,"Score:"+它会将它本身变成一个字符串

于 2012-11-10T04:42:27.037 回答
3

好吧,在这种情况下,您可能需要先打电话 this.getBatch().end。像这样:

mSpriteBatch.begin();
mStage.draw();
mSpriteBatch.end();
//Here to draw a BitmapFont
mSpriteBatch.begin();
mBitmapFont.draw(mSpriteBatch,"FPS",10,30);
mSpriteBatch.end();

我不知道为什么,但它对我有用。

于 2013-03-27T02:18:09.223 回答
2

我通过在开始绘图阶段之前关闭批次解决了与白框类似的问题。这是因为 stage.draw() 启动了另一个批次,并使未以 end() 结束的前一个批次无效。

因此,在当前示例中,我将在绘图阶段之前移动this.getBatch().end() :

    ...
    font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500);
    this.getBatch().end();
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
    }
于 2014-01-11T12:01:48.247 回答
-2

如果您使用的是 Scene2D,请尝试使用舞台和演员。不用写长代码,找MTX插件,非常好用。你可以创造一个很棒的用户体验

http://moribitotechx.blogspot.co.uk/

于 2013-06-09T07:04:45.410 回答