2016-10-05 33 views
-4

我一直在android studio和libgdx中進行遊戲,每當我在物理設備上運行它時,它會顯示「[AppName]已停止」。「[AppName]已停止」在我的物理設備中。 ERROR in logcat:java.lang.NullPointerException

我檢查了我使用的圖像(拼寫,大寫)的名稱,除此之外我不知道問題是什麼。

這是我在logcat中收到錯誤:

10-06 12:01:51.055 21591-21627/com.jpfalmazan.ninjaassault E/AndroidRuntime: FATAL EXCEPTION: GLThread 2891 
                      java.lang.NullPointerException 
                       at com.jpfalmazan.ninjaassault.GameScreens.MenuScreen.<init>(MenuScreen.java:23) 
                       at com.jpfalmazan.ninjaassault.NinjaAssault.create(NinjaAssault.java:19) 
                       at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:275) 
                       at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1505) 
                       at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

這裏是我的遊戲代碼:

package com.jpfalmazan.ninjaassault; 

import com.badlogic.gdx.Game; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.jpfalmazan.ninjaassault.GameScreens.MenuScreen; 


public class NinjaAssault extends Game { 
    public SpriteBatch batch; 
    Texture img; 

    @Override 
    public void create() { 
     batch = new SpriteBatch(); 
     this.setScreen(new MenuScreen(this)); ////This is the "NinjaAssault.java:19 " error shown in logcat 
    } 

    @Override 
    public void render() { 
     super.render(); 
     Gdx.gl.glClearColor(1,0,0,1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     batch.begin(); 
    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
     img.dispose(); 
    } 
} 

這裏是我的MenuScreen類代碼:

package com.jpfalmazan.ninjaassault.GameScreens; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.jpfalmazan.ninjaassault.NinjaAssault; 

public class MenuScreen implements Screen{ 
    NinjaAssault game; 
    public MenuScreen (NinjaAssault game){ 
     this.game = game; 
    } 
    public SpriteBatch batch; 
    public Texture background; 
    public Texture title; 
    public Texture playButtonINACTIVE; 
    public Texture playButtonACTIVE; 

    public float screenWidth = Gdx.graphics.getWidth(); 
    public float screenHeight = Gdx.graphics.getHeight(); 
    public float titleWidth = title.getWidth(); //This is the "MenuScreen.java:23" error shown in logcat 
    public float titleHeight = title.getHeight(); 
    public float xLimit1 = (float) ((screenWidth/2)-(titleWidth/2)); 
    public float xLimit2 = (float) ((screenWidth/2)+(titleWidth/2)); 
    public float yLimit1 = (float) ((screenHeight*.35)); 
    public float yLimit2 = (float) ((screenHeight*.35)+titleHeight); 



    @Override 
    public void show() { 
     batch = new SpriteBatch(); 
     background = new Texture("BGYELL.png"); 
     title = new Texture ("BGASTRO.png"); 
     playButtonINACTIVE = new Texture("BTPLAY.png"); 
     playButtonACTIVE = new Texture("BTPLAYON.png"); 

    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(1,0,0,1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     game.batch.begin(); 
     game.batch.draw(background,0,0,screenWidth,screenHeight); 
     if((Gdx.input.getX()> xLimit1 && Gdx.input.getX() < xLimit2) && (Gdx.input.getY() < yLimit2 && Gdx.input.getY() > yLimit1)){ 
      game.batch.draw(playButtonACTIVE,(screenWidth/2)-(playButtonACTIVE.getWidth()/2), (float) (screenHeight*.35)); 
     }else game.batch.draw(playButtonINACTIVE,(screenWidth/2)-(playButtonINACTIVE.getWidth()/2), (float) (screenHeight*.35)); 
     game.batch.draw(title,(screenWidth/2)-((float)(screenWidth*.8)/2), (float) (screenHeight*.65),(float)(screenWidth*.8) , (float) ((screenWidth*.8)*(titleHeight/titleWidth))); 




     game.batch.end(); 
    } 

    @Override 
    public void resize(int width, int height) { 

    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void hide() { 

    } 

    @Override 
    public void dispose() { 

    } 
} 
+0

您無法在尚未分配的實例變量上調用方法。 'title'顯然是null –

+0

正如我所說我是一個java程序設計的新手,所以這樣的錯誤很容易被忽略。謝謝你的迴應。 – JAlmazan

回答

1

您尚未將「標題」設置爲任何內容。你只宣佈它存在。 title在show()中被設置,在構造函數之後被調用。 你需要做

title = new Texture ("BGASTRO.png"); 

,然後再嘗試得到紋理的高度。這也適用於所有其他變量,確保在使用它們之前將它們設置爲某種東西。

此外,您應該刪除

Gdx.gl.glClearColor(1,0,0,1); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
batch.begin(); 

從您呈現()的NinjaAssault類。這是不必要的,如果你打電話

batch.begin() 

需要調用

batch.end() 

太,但在這種情況下,它從來沒有使用反正所以沒有必要爲它在所有。

+0

感謝您的回覆。其實,我已經將標題設置爲上面代碼中顯示的新紋理(「BGASTRO.png)」 – JAlmazan

+0

在我的代碼中,我應該放置titleWidth和titleHeight變量嗎? – JAlmazan

+0

我已經在我的程序中做了必要的調整,它實際上作品!感謝IronMonkey的幫助。 – JAlmazan