无法在Java中加载纹理(lwjgl)

时间:2013-12-25 18:25:31

标签: java textures lwjgl

过去3个小时我一直在谈论这个问题。 我正在尝试使用lwjg库在Java中制作2D策略游戏,对于初学者来说,我已经陷入了为对象加载纹理(Farmer)。 它给了我这个:

Exception in thread "main" java.lang.NullPointerException
    at _2nd_Branch.Farmer.render(Farmer.java:42)
    at _1st_Branch.CoreGame.render(CoreGame.java:30)
    at _1st_Branch.Game.GameLoop(Game.java:33)
    at _1st_Branch.Game.main(Game.java:13)

这是我一直在研究的代码(作为组织事物的一种方式。来自youtube上的某个人解释了一些关于lwjgl的内容):

Game.java:

package _1st_Branch;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;

public class Game {

private static CoreGame coreGame;

public static void main(String [] args)
{
    CD();   
    createGame();
    GameLoop();
    CleanUp();
}

private static void CD()
{
    Window.create(800, 600);
}
private static void createGame()
{
    coreGame = new CoreGame();
}

public static void GameLoop()
{
    while(!Window.isCloseRequested())
    {
        Window.Clear();
        coreGame.input();
        coreGame.logic();
        coreGame.render();
        Display.update();
        if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
        {
            Display.destroy();
            System.exit(0);
        }
    }
}
private static void CleanUp()
{
    coreGame.dispose();
    Window.Destroy();
}
}

CoreGame.java:

package _1st_Branch;
import _2nd_Branch.Farmer;
import _2nd_Branch.Player;
public class CoreGame {

public final static int TILE_SIZE = 64;

private static Player player;   
private static Farmer farmer;   

public CoreGame()
{

    farmer = new Farmer();
}

public void input()
{

}

public void logic()
{

}

public void render()
{

    farmer.render();
}

public void dispose()
{


}

}

Window.java:

package _1st_Branch;


import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;


import static org.lwjgl.opengl.GL11.*;


public class Window {

public static void create(int width, int height)
{
    try 
    {
        Display.setDisplayMode(new DisplayMode(width, height));
        Display.setTitle("Artyas RTS");
        Display.create();
        initGL();
        initInput();

    } 
    catch (LWJGLException e) 
    {
        e.printStackTrace();
    }
}


public static void initGL()
{
    glClearColor(0.5f, 0.5f, 1, 1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, Display.getWidth(), 0, Display.getHeight(), -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glLoadIdentity();

}

private static void initInput()
{
    try 
    {
        Keyboard.create();
    } 
    catch (LWJGLException e) 
    {
        e.printStackTrace();
    }
}

public static void Clear()
{
    glClear(GL_COLOR_BUFFER_BIT);
}

public static void Destroy()
{
    Keyboard.destroy();
    Display.destroy();
    System.exit(0);
}

public static void update()
{
    Display.update();
    Display.sync(60);
}

public static boolean isCloseRequested()
{
    return Display.isCloseRequested();
}

}

Farmer.java:

//CIVILIAN UNIT
package _2nd_Branch;


import java.io.IOException;

import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class Farmer {


public Farmer() {};
private Texture texture;

public void init() {



    try {

    // load texture from PNG file

    texture = TextureLoader.getTexture("PNG",     ResourceLoader.getResourceAsStream("Farmer.png"));


    } catch (IOException e) {

    e.printStackTrace();

    }

    }

public void render()
{
    Color.white.bind();

    texture.bind(); 
    GL11.glEnable(GL11.GL_TEXTURE_2D);  
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    GL11.glBegin(GL11.GL_QUADS);

    GL11.glTexCoord2f(0,0);
    GL11.glVertex2f(400,500);
    GL11.glTexCoord2f(1,0);
    GL11.glVertex2f(450,500);
    GL11.glTexCoord2f(1,1);
    GL11.glVertex2f(450, 550);
    GL11.glTexCoord2f(0,1);
    GL11.glVertex2f(400, 550);

    GL11.glEnd();
}


}

我真的被困在这里。如果有人能表明需要做什么,我将永远感激不尽!我真的需要继续制作这个项目,以了解有关Java的更多信息。

Farmer类的texture.bind()函数给出了错误。

被困在这里,我不知道它作为一名程序员对我说的是什么。

1 个答案:

答案 0 :(得分:0)

你永远不会调用加载纹理的Farmer.init()。您只能在CoreGame中调用构造函数。你应该从Farmer构造函数中调用init(),或者在调用CoreGame中的构造函数后调用init。我建议从CoreGame调用init(),并继续保持纹理加载远离构造函数,因为如果初始化并且必须在创建显示之前调用构造函数到Farmer并初始化OpenGL(Window.initGL())我不想加载纹理。在创建显示并且初始化opengl之前使用光滑加载纹理可能会导致TextureLoader中出现NullpointerException。