你好,我有一个超级敌人
public abstract class Enemy {
protected Texture img; // Sprite image
public void setImage(String name){
this.img = new Texture(name);
}
public Texture getImage(){
return img;
}
}
}
现在我有一个延伸敌人的海盗级别
package com.mygdx.game;
import com.badlogic.gdx.graphics.Texture;
public class Pirate extends Enemy{
public Pirate(){
setImage("pirate.jpg"); // ERROR!
}
}
当我在构造函数上调用setImage()方法时出现此错误
Exception in thread "main" java.lang.NullPointerException
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:88)
at com.mygdx.game.Enemy.setImage(Enemy.java:20)
at com.mygdx.game.Pirate.<init>(Pirate.java:9)
at com.mygdx.game.desktop.DesktopLauncher.main(DesktopLauncher.java:11)
那有什么问题呢?为什么我得到java.lang.NullPointerException?
答案 0 :(得分:1)
在第88行查看课程Texture
的代码时,您会看到调用字段Gdx.files
。
public Texture (String internalPath) {
this(Gdx.files.internal(internalPath));
}
所以我唯一能想到的是,你必须通过调用
来自己初始化字段files
Gdx.files = new AnyClassImplementingFiles();
在您的init() - 方法(或使用setImage(String)
之前调用的任何其他方法)
Texture.java:
https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/Texture.java#L88
Gdx.java:
https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/Gdx.java#L33
Files.java:
https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/Files.java
答案 1 :(得分:0)
尝试在扩展ApplicationAdapter的类中创建Pirate实例。我打赌这会解决问题,因为它会初始化文件系统。你应该已经这样做但我不能从代码中说出来。
答案 2 :(得分:0)
你应该告诉我们你是如何开始游戏的。
libgdx项目通常由不同部分组成:
因此,在您的核心项目中,您应该有一个扩展Game
或ApplicationListener
的类
在后端项目中(例如LWJGL,一个Desktop-Project),你需要一个main
,它调用:
new LwjglApplication(new MyGame(), "Title of the Game", 1920, 1080);
然后,此构造函数初始化Gdx.files
和其他字段。这是在后端的构造函数中完成的,因为这个文件是后端依赖的
例如,android-backend上的Gdx.files.external
定义了SD卡的路径,而在桌面上,它们是当前用户主目录的路径。
你应该仔细阅读一些教程并看一下演示!