过去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()函数给出了错误。
被困在这里,我不知道它作为一名程序员对我说的是什么。
答案 0 :(得分:0)
你永远不会调用加载纹理的Farmer.init()。您只能在CoreGame中调用构造函数。你应该从Farmer构造函数中调用init(),或者在调用CoreGame中的构造函数后调用init。我建议从CoreGame调用init(),并继续保持纹理加载远离构造函数,因为如果初始化并且必须在创建显示之前调用构造函数到Farmer并初始化OpenGL(Window.initGL())我不想加载纹理。在创建显示并且初始化opengl之前使用光滑加载纹理可能会导致TextureLoader中出现NullpointerException。