2015-01-08 53 views
1

我正在處理2D Processing 2.2.1遊戲中的碰撞檢測。基本上我所做的是編寫一個類,它通過定義其端點的座標來創建一個盒子,並且有一個方法來檢查這些盒子中的兩個是否重疊。我通過引入布爾值來實現這一點,只要這些框中的兩個重疊,該布爾值就設置爲true。然後基本上實現一個創建這些框的get方法,我遇到了返回類型錯誤的結果。它表示該方法未返回正確類型的Box1。我真的不明白,因爲我回來的盒子確實適合構造函數。我非常肯定,這是因爲碰撞對象在一個數組中,隨着時間的推移會產生越來越多的對象,但我很遺憾不知道如何改變我的對撞機(Box1)類。在方法中返回類型錯誤的結果

這裏是代碼即時得到的錯誤:

//returning collider info 
public Box1 getBox1() { 
    for (int i =frameCount/600; i >0; i--) { 
    return new Box1(block[i].x - Blockpic.width/2, block[i].y-Blockpic.height/2,  block[i].x+Blockpic.height/2, block[i].y+Blockpic.height/2); 
} 

}

這是我對撞機(BOX1)類:

public class Box1 { 
    float x1, x2; 
    float y1, y2; 

    Box1(float x1, float y1, float x2, float y2) { 
    this.x1 = x1; 
    this.y1 = y1; 

    this.x2 = x2; 
    this.y2 = y2; 
} 

boolean isOverlap(Box1 b) { 
if (((x1 <= b.x1 && b.x1 <= x2) || (x1 <= b.x2 && b.x2 <= x2)) 
&& ((y1 <= b.y1 && b.y1 <= y2) || (y1 <= b.y2 && b.y2 <= y2))) { 
    return true; 
} 
    return false; 
} 
} 

只是完整信息我的產卵對象類(錯誤所在的位置):

public class Blockfield { 
    private int Blockcount; 
    private PImage Blockpic; 
    private Block block[]; 

    //Constructor 
    public Blockfield (int Blockcount) { 
    this.Blockcount = Blockcount; 
    Blockpic = loadImage("block2.png"); 
    //new array 
    block = new Block [Blockcount]; 
    for (int i=0; i < Blockcount; i++) { 
     block[i] = new Block(width+Blockpic.width, random (height),7); 
    } 
    } 


    //Draw method for this class 


    public void draw() { 
    for (int i =frameCount/600; i >0; i--) { 
    pushMatrix(); 
     translate (block[i].x,block[i].y); 
     image (Blockpic, block[i].x, block[i].y); 
     popMatrix(); 
    } 
    } 

    public void update() { 
    for (int i =frameCount/600; i >0; i--) { 
    //moves blocks right to left 
     block[i].x -=(6 * (frameCount/200)); 
     //spawns block when they leave the screen 
     if (block[i].x < 0 - Blockpic.width) { 
     block[i] = new Block(width+Blockpic.width, random (height),7); 
     } 
    } 
    } 
//returning collider info 
public Box1 getBox1() { 
for (int i =frameCount/600; i >0; i--) { 
    return new Box1(block[i].x - Blockpic.width/2, block[i].y-Blockpic.height/2, block[i].x+Blockpic.height/2, block[i].y+Blockpic.height/2); 
} 
} 

} 



class Block { 
    float x, y; 
    int speed; 

    Block (float x, float y, int speed) { 
    this.x= x; 
    this.y= y; 
    this.speed = speed; 
} 

} 

非常感謝!

回答

2

的問題,就像你說的,就是用這種方法:

public Box1 getBox1() { 
    for (int i =frameCount/600; i >0; i--) { 
     return new Box1(block[i].x - Blockpic.width/2, block[i].y-Blockpic.height/2, block[i].x+Blockpic.height/2, block[i].y+Blockpic.height/2); 
    } 
} 

忽略了第二,它沒有任何意義有內return語句對於這樣的循環,整個問題是在運行代碼之前,計算機太笨了,無法知道frameCount的價值。如果frameCount爲0會怎麼樣?還是消極?

如果frameCount爲0或負值,那麼for循環的主體永遠不會執行,並且此方法永遠不會返回任何內容。這是錯誤。

您可能知道frameCount總是正數,但計算機沒有。

編輯:在回答你下面的評論繼續:

如果你需要幫助,你必須提供一個MCVE。請注意,這應該儘可能少,以獲得基本知識。我們不需要任何碰撞檢測,只需調用一個函數即可。這裏有一個例子:

void setup(){ 
    String s = getString(true); 
    println(s); 
} 

String getString(boolean b){ 
    if(b){ 
    return "testing"; 
    } 
} 

如果您嘗試運行這段代碼,你會得到一個錯誤,告訴你說:「這個方法必須返回一個String類型的結果」。

你得到這個錯誤的原因是因爲:如果我傳入一個false值,getString()函數會返回什麼?它不會返回任何東西!這完全像你的代碼所抱怨的。 我們可以看到,getString()只會被調用的值爲true,但計算機不夠聰明,無法解決這個問題。

您似乎誤解了編譯器的威力。它看不到在運行時會發生什麼。即使對你來說顯而易見的是,布爾將始終爲真(或者在你的情況下,該frameCount總是正數),編譯器不能知道。由於它不知道,它告訴你,你可能不會返回一個具有返回類型的方法的值,這是一個編譯器錯誤。

您需要重構代碼,以便始終從具有返回類型的方法返回某些內容。然而,我懷疑for循環的確如你所想的那樣 - 但是你沒有真正解釋你認爲它的作用,所以這只是一個猜測。

而你在其他方法中沒有遇到這個錯誤的原因是因爲它們都沒有包含這個邏輯錯誤。具有返回類型的唯一另一個功能是這一個:

boolean isOverlap(Box1 b) { 
    if (lotsOfLogic) { 
     return true; 
    } 
    return false; 
} 

注意即使if語句評估爲假怎麼樣,你還是從這個函數返回的東西。這就是你需要做的getBox1()函數。

+0

嗨,我想這是有道理的,但它爲什麼會告訴我,返回類型是不正確的?那麼它會不會是一個Nullpointer異常?此外,遵循該邏輯,只需將framecount定義爲正數(i = 0 + frameCount/600)即可解決問題。另外我怎麼沒有遇到我以前的方法中的錯誤?非常感謝你的回答和你的時間,但可悲的是,這並沒有讓我更接近實際解決我的問題.... –

+1

@MariusHumphrey我已經編輯我的帖子來回答你的新問題。如果您仍不清楚,請提供我們可以使用的[MCVE](http://stackoverflow.com/help/mcve)。 –

+0

嗨,對不起,我正在旅行,所以我無法回到你身邊。感謝您的幫助,我現在明白了什麼是錯的。我剛剛結束了對碰撞使用更簡單的類。再一次感謝你的幫助! –

相關問題