libgdx库的多态性错误

时间:2014-09-30 15:09:56

标签: 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;
        }
    }
}

现在我有一个延伸敌人的海盗级别

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?

3 个答案:

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

  1. 核心项目,包含所有逻辑
  2. Backend-Projects,它定义了如何在不同的后端(android,LWJGL,GWT ......)上运行应用程序。
  3. 因此,在您的核心项目中,您应该有一个扩展GameApplicationListener的类 在后端项目中(例如LWJGL,一个Desktop-Project),你需要一个main,它调用:

    new LwjglApplication(new MyGame(), "Title of the Game", 1920, 1080);
    

    然后,此构造函数初始化Gdx.files和其他字段。这是在后端的构造函数中完成的,因为这个文件是后端依赖的 例如,android-backend上的Gdx.files.external定义了SD卡的路径,而在桌面上,它们是当前用户主目录的路径。

    你应该仔细阅读一些教程并看一下演示!