Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx库上的多态性错误_Java_Libgdx_Polymorphism - Fatal编程技术网

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项目通常由不同的部分组成:

  • 核心项目,包含所有逻辑
  • 后端项目,定义如何在不同的后端(android、LWJGL、GWT…)上启动应用程序 因此,在您的核心项目中,您应该有一个扩展
    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
    )。此后端然后初始化文件,因为此字段依赖于后端!