2014-09-26 70 views
1

我試圖使用eclipse將Android遊戲移植到Android,但是,我試圖調試碰撞檢測系統。我爲遊戲的碰撞檢測系統使用了「java.awt.Rectangle」,並且它在Applet上運行良好,但是當我將它轉換爲「android.graphics.Rect」時,應用程序會在logcat中返回這個值:如何調試Android Rect類的空指針異常

09-24 16:23:07.047:E/AndroidRuntime(15845):java.lang.NullPointerException:嘗試從空字段'int android.graphics.Rect.left'讀取null對象引用

有人可以告訴我這意味着什麼,如何調試,以及我的代碼有什麼問題? (如下所示)

編輯:進行更改後,我發現「Rect.intersects」不能正常工作。兩個矩形不會識別碰撞。

如果有幫助,我是從 「http://www.kilobolt.com/day-7-creating-an-android-game-from-start-to-finish.html

private int x; 
private int y; 
private int speedY; 
protected boolean visible; 
protected Rect r; 

public Shoot(int startX, int startY) { 
    // TODO Auto-generated constructor stub 
    x = startX; 
    y = startY; 
    speedY=-14; 
    visible= true; 
    r = new Rect(0, 0, 0, 0); 
} 

public void update() { 
    y += speedY; 
    r.set(x, y, 15, 15); 
    if (y < 0) { 
     visible = false; 
     r = null; 
    } 
    else if (y < 750) { 
     checkCollision(); 
    } 
} 

private void checkCollision() { 
    //detects collision 
    if (Rect.intersects(r, GameScreen.basket.getBounds())) { 
     visible = false; 
     GameScreen.score += 1; 
    } 
} 

(下面的代碼是從籃筐類)

public Rect getBounds() { 
    //Creates Rectangle boundaries for collisions 
    return new Rect(240, 73, 15, 15); 
} 

回答

0

你可能想要寫以下教程:

if (y< 0){ 
    visible = false; 
    r = null; 
} else if (y < 750){ 
    checkCollision(); 
} 

而不是

因此,添加否則您不檢查null對象。

if (y< 0){ 
    visible = false; 
    r = null; 
    } 
    if (y < 750){ 
    checkCollision(); 
    } 

或者,你可以通過添加非空檢查改變checkCollision()

private void checkCollision(){ 
//detects collision 
if (r!=null && Rect.intersects(r, GameScreen.basket.getBounds())){ 
    visible = false; 
    GameScreen.score +=1; 
} 
} 
+0

感謝您的答覆。這刪除了空指針異常,但現在碰撞檢測根本不起作用。對象不會消失,分數也不會增加。 – master248 2014-09-26 17:53:45

+0

碰撞檢測適用於y> 0和y <750,你不需要這樣嗎? – sotcha 2014-09-26 18:00:24

+0

由於某些原因,碰撞檢測對我而言並不起作用。兩個物體遇到什麼都不會發生。 – master248 2014-09-26 20:29:04

0

也許你想這樣做,看起來的else

if (y< 0){ 
     visible = false; 
     r = null; 
} 
else if (y < 750){ 
     checkCollision();  
}