Search code examples
javaopengllwjglslick2d

lwjgl fps drawing issue


I'm having some troubles while trying to trace FPS on the screen using LWJGL. What's wrong in my code?

I've got this all the time:

Exception in thread "main" java.lang.NullPointerException
    at TheGame.renderFont(TheGame.java:66)
    at TheGame.start(TheGame.java:48)
    at TheGame.main(TheGame.java:88)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Process finished with exit code 1

The code is here, it's pretty simple - it basically opens the window and counts FPS, and FPS is alright if tracing to the Title, but how do I draw the string without an error?

import java.awt.Font;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.Sys;

import org.newdawn.slick.Color;
import org.newdawn.slick.TrueTypeFont;
import org.newdawn.slick.util.ResourceLoader;

public class TheGame
{ 
    int fps;
    long lastFPS;
    TrueTypeFont font;
    boolean antiAlias = true;

    public void start()
    {
        try
        {
            Display.setDisplayMode(new DisplayMode(800,600));
            Display.create();
            initFont();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        // init OpenGL here

        lastFPS = getTime(); // call before loop to initialise fps timer

        while (!Display.isCloseRequested())
        {
            // render OpenGL here

            updateFPS();
            Display.update();
        }

        Display.destroy();
    }

    public void initFont()
    {
        Font awtFont = new Font("Times New Roman", Font.BOLD, 24);
        TrueTypeFont font = new TrueTypeFont(awtFont, antiAlias);
    }

    public void updateFPS()
    {
            if (getTime() - lastFPS > 1000)
            {
                font.drawString(100, 50, "THE LIGHTWEIGHT JAVA GAMES LIBRARY", Color.yellow);
                fps = 0; //reset the FPS counter
                lastFPS += 1000; //add one second
            }
            fps++;
    }

    public long getTime()
    {
        return (Sys.getTime() * 1000) / Sys.getTimerResolution();
    }

    public static void main(String[] argv)
    {
        TheGame displayExample = new TheGame();
        displayExample.start();
    }
}

Solution

  • The problem is you are redeclaring font in the initFont method. Change initFont to:

    public void initFont()
    {
        Font awtFont = new Font("Times New Roman", Font.BOLD, 24);
        font = new TrueTypeFont(awtFont, antiAlias);
    }