在Libgdx的屏幕内的场景中绘制字体

时间:2014-07-15 20:47:31

标签: java libgdx

我正在尝试创建一个将一些文本绘制到屏幕的Actor。这个演员在一个屏幕内。我的主要课程很简单:

package com.culture.jamiefearon;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Culture extends Game {
   public SpriteBatch batch;
   public BitmapFont font;

   public void create () {
       batch = new SpriteBatch();
       font = new BitmapFont(); // Use LibGDX's default Arial font.

       // Start the introScreen.
       this.setScreen(new IntroScreen(this));
   }
   public void render () {
      super.render();
   }
   public void dispose() {
      batch.dispose();
      font.dispose();
   }

}

我的屏幕类定义为:

package com.culture.jamiefearon;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class IntroScreen implements Screen {

final Culture game;
OrthographicCamera camera;
private int viewWidth = 800;
private int viewHeight = 480;
private Stage stage;

public class MyActor extends Actor {
    public void draw(SpriteBatch batch, float parentAlpha){
        batch = game.batch;
        game.font.draw(batch, "Culture", viewWidth / 2, viewHeight / 2);
    }
}

public void create() {        
    stage = new Stage();
    MyActor myActor = new MyActor();
    stage.addActor(myActor);
}


public IntroScreen(final Culture gam) {
    game = gam;
    camera = new OrthographicCamera();
    camera.setToOrtho(false, viewWidth, viewHeight);
}

public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0.2f, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    camera.update();
    game.batch.setProjectionMatrix(camera.combined);
    stage.draw();
}

@Override
public void resize(int width, int height) {
}

@Override
public void show() {

}

@Override
public void hide() {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public void dispose() {

}
}

当我运行该程序时,游戏就崩溃了。

2 个答案:

答案 0 :(得分:0)

您实例化了没有SpriteBatch的舞台,因此它创建了自己的舞台。然后,您的MyActor会忽略该SpriteBatch,并尝试使用game中没有调用它的begin()

相反,您的舞台应使用game中的SpriteBatch进行实例化,而MyActor应仅使用传递给其绘制方法的batch

这可能不是你得到的崩溃,但你没有发布你的堆栈跟踪。

答案 1 :(得分:0)

从未调用的IntroScreen的创建方法因此未初始化并在IntroScreen类的render方法中使用。