【发布时间】:2016-03-15 18:50:25
【问题描述】:
在过去的 3 个小时里,我一直在做这件事。 我正在尝试使用 lwjg 库在 Java 中制作 2D 策略游戏,对于初学者来说,我一直坚持为对象(农夫)加载纹理。 它给了我这个:
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() 函数给出了错误。
被困在这里,我不知道它对我作为程序员的评价。
【问题讨论】:
-
第一次初始化 opengl 时尝试启用 GL_TEXTURE_2D(在开始所有渲染和更新之前,但在创建窗口之后)
-
我在几个地方都试过了。但我很困惑。如果您能指出我必须启用的确切位置。是不是这样:GL11.glEnable(GL11.GL_TEXTURE_2D); ?
-
哦,nvm,我看到你把它放在了正确的位置。问题是你的纹理没有被加载,所以当你绑定它时,它会尝试绑定一个空纹理。您的程序文件系统中的纹理文件到底在哪里?
-
我已经通过转到项目属性 -> 库 -> AddClassFolder 在项目中添加了一个 res 文件夹。所以我可以添加文件名,它会立即获取它。
-
然后当你加载你的纹理时做 texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/Farmer.png"));