2014-09-30 39 views
0

你好,我有一個超階級敵人多態性錯誤

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?

+6

看起來異常來自'Texture'的構造函數,而不是來自發布的代碼。 – David 2014-09-30 15:11:55

+0

Texture class – StackFlowed 2014-09-30 15:13:56

+0

的共享代碼是否確定找到了您的'「pirate.jpg」? – herrlock 2014-09-30 15:15:19

回答

1

在第88行查看類Texture的代碼時,可以看到字段Gdx.files被調用。

public Texture (String internalPath) { 
    this(Gdx.files.internal(internalPath)); 
} 

所以,我唯一能想到的是,你必須初始化場files自己,在你的初始化調用

Gdx.files = new AnyClassImplementingFiles(); 

() - 方法(或調用任何其他方法 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使用setImage(String)

Texture.java之前
Files.java: https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/Files.java

+0

對不起,我不明白我的init()方法是什麼?它是主要的嗎?什麼是新的AnyClassImplementingFiles(); ? – David 2014-09-30 15:47:49

+0

你的init方法將會是一個方法,在這個方法中你在使用它之前設置了所有的東西。例如創建您的海盜的方法。 – herrlock 2014-09-30 16:31:57

+0

'新的AnyClassImplementingFiles();'是實現接口'文件'的任何類 – herrlock 2014-09-30 16:32:42

0

嘗試在擴展ApplicationAdapter類創建海盜的一個實例。我敢打賭,它會解決這個問題,因爲它會初始化文件系統。你應該已經這樣做了,但是我不能從代碼中知道。

0

你應該向我們展示你是如何真正開始遊戲的。

甲libgdx項目通常是由不同的部分組成:

  1. 芯 - 項目,包含所有邏輯
  2. 後端-項目,它定義噸如何ostart上不同的後端應用(機器人, LWJGL,GWT ...)。

所以在你的核心項目中,你應該有一個類別,它可以延伸GameApplicationListener
在後端的項目(例如LWJGL,桌面項目),你需要一個main,其中要求:

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

此構造然後初始化Gdx.files等領域。這是在後端的構造函數中完成的,因爲這些文件是依賴於後端的。
例如,android-backend上的Gdx.files.external定義了SD卡的路徑,而在桌面上它們是當前用戶主目錄的路徑。

你應該詳細閱讀一些教程並看看演示!