Java libgdx库上的多态性错误
你好,我有一个超级班的敌人Java libgdx库上的多态性错误,java,libgdx,polymorphism,Java,Libgdx,Polymorphism,你好,我有一个超级班的敌人 public abstract class Enemy { protected Texture img; // Sprite image public void setImage(String name){ this.img = new Texture(name); } public Texture getImage(){ return img;
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)
线程“main”java.lang.NullPointerException中的异常
位于com.badlogic.gdx.graphics.Texture.(Texture.java:88)
在com.mygdx.game.敌军.setImage(敌军.java:20)
在com.mygdx.game.Pirate.(Pirate.java:9)
位于com.mygdx.game.desktop.DesktopLauncher.main(DesktopLauncher.java:11)
那有什么问题吗?为什么我会得到java.lang.NullPointerException?当查看第88行的类
Texture
的代码时,可以看到调用了字段Gdx.files
public Texture (String internalPath) {
this(Gdx.files.internal(internalPath));
}
所以我能想到的唯一一件事是,您必须通过调用
Gdx.files = new AnyClassImplementingFiles();
在init()方法中(或在使用setImage(String)
之前调用的任何其他方法)
Texture.java:
Gdx.java:
Files.java:
尝试在扩展ApplicationAdapter的类中创建Pirate实例。我打赌这会解决这个问题,因为它会初始化文件系统。你应该已经这么做了,但我从代码上看不出来。你应该向我们展示你是如何真正开始游戏的 libgdx项目通常由不同的部分组成:
Game
或ApplicationListener
的类在后端项目(例如LWJGL,桌面项目)中,需要一个
main
,它调用:
new LwjglApplication(new MyGame(), "Title of the Game", 1920, 1080);
然后,此构造函数初始化Gdx.files
和其他字段。这是在后端的构造函数中完成的,因为此文件依赖于后端。例如,android后端上的
Gdx.files.external
定义了SD卡的路径,而在桌面上它们是当前用户主目录的路径
你应该熟练地阅读一些教程,看看演示 异常似乎来自
纹理的构造函数内部,而不是来自发布的代码。纹理类的共享代码是否确实找到了“pirate.jpg”
?是的,找到了“pirate.jpg”。我正在使用libgdx库,所以纹理类我刚刚编辑了我的代码。我也有同样的问题抱歉我不明白我的init()方法是什么?是主菜吗?AnyClassImplementingFiles()有什么新功能?您的init方法将是一种方法,在使用它之前,您可以在其中设置所有内容。例如,创建盗版的方法
是实现接口文件
的任何类,这实际上应该通过调用正确后端的构造函数来完成。因此,如果游戏是桌面游戏,请使用其中一个桌面后端(例如newlwjglapplication
)。此后端然后初始化文件,因为此字段依赖于后端!