【问题标题】:Java libGdx: FreeTypeFontGenerator is not working (Black screen)Java libGdx:FreeTypeFontGenerator 不工作(黑屏)
【发布时间】:2015-12-15 11:56:22
【问题描述】:

我添加了一个自定义字体 Aller_light.ttf,当我尝试运行程序时没有错误地绘制字体,屏幕是黑色的,所以我不确定它是在屏幕外的其他地方渲染还是在全部。
如果你能捐出你的 2 美分,那对我来说会很有价值。

编辑 现在它说我有一个 nullPointerExeption

Exception in thread "LWJGL Application" java.lang.NullPointerException
    at com.mygdx.finis.states.MenuState.draw(MenuState.java:43)
    at com.mygdx.finis.states.GameStateManager.draw(GameStateManager.java:31)
    at com.mygdx.finis.Main.render(Main.java:36)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)

This is what should be happening:

MenuState 类

package com.mygdx.finis.states;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.mygdx.finis.Assets;
import com.mygdx.finis.Main;

public class MenuState extends GameState{

    private SpriteBatch sb;

    private BitmapFont font;

    private int currentItem;
    private String[] menuItems;

    protected MenuState(GameStateManager gsm) {
        super(gsm);
    }

    public void init() {

        sb = new SpriteBatch();

        FreeTypeFontGenerator gen = new FreeTypeFontGenerator(
            Gdx.files.internal(null));

        font = gen.generateFont(20);

        menuItems = new String[]{
            "Play"
        };
    }

    public void update(float dt) {
        handleInput();
    }

    public void draw() {
        sb.setProjectionMatrix(Main.cam.combined);//*** This is where the null pointer starts *********

        sb.begin();
            font.draw(sb, "Quack", Main.WIDTH / 2, Main.HEIGHT / 2);//*** This does not work *******************
        sb.end();

    }

    public void handleInput() {

    }

    public void dispose() {

    }

}

主类

package com.mygdx.finis;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.mygdx.finis.states.GameStateManager;

public class Main implements ApplicationListener{

    public static int WIDTH;
    public static int HEIGHT;

    public static OrthographicCamera cam;

    private GameStateManager gsm;

    public void create(){
        WIDTH = Gdx.graphics.getWidth();
        HEIGHT = Gdx.graphics.getHeight();

        cam = new OrthographicCamera(WIDTH, HEIGHT);
        cam.translate(WIDTH / 2, HEIGHT / 2);
        cam.update();

        gsm = new GameStateManager();
    }

    public void render(){
        Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

        gsm.update(Gdx.graphics.getDeltaTime());
        gsm.draw();//****** THIS IS WHERE THE ISSUE ENDS ******
    }

    public void resize(int width, int height){}
    public void pause(){}
    public void resume(){}
    public void dispose(){}
}

【问题讨论】:

    标签: java android error-handling libgdx desktop-application


    【解决方案1】:

    您的SpriteBatch sb 很可能为空。你确定 init() 被调用了吗?

    唯一的另一种选择是Main.cam 为空。

    它必须是其中之一。

    顺便说一句,这对我来说很奇怪......

    Gdx.files.internal(null));
    

    你为什么要这么做?

    【讨论】:

    • 它不再为空了,但它以前是因为我摆弄东西。现在真正的问题是 nullpointerexeption
    • 我如何确保 init() 被调用?
    • 这是你的代码,所以你最清楚!但猜测一下,可能就在你在 Main 类的 create() 方法中实例化它之后。
    • 顺便说一句 - 当我说“确保调用 init()”时,我的意思是你应该从我上面提到的地方调用它。
    • 谢谢,我会告诉你进展如何。目前我正在重新开始,因为这让我很生气,而且我认为我对这一代人做错了。
    猜你喜欢
    • 2012-04-07
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2014-04-02
    • 2015-01-12
    相关资源
    最近更新 更多