2017-02-20 21 views
0

我是一個使用Java的初學者程序員。我正在做我的第一個簡單的遊戲。我需要金幣(在我的控制器LinkedList類項目)要刪除它們都被接走後起來,更好的將是時,他們可以在一個又催生了另一個地方(我用這樣的:如何在java中刪除(並重新生成)一個項目(硬幣)。 (使用控制器類進行產卵)

Random randomGenerator = new Random(); 
    for (int idx = 1; idx <= 1; ++idx){ 
      int r1 = randomGenerator.nextInt(590); 
      this.r1=r1; 
    } 
    for (int idx = 1; idx <= 1; ++idx){ 
      int r2 = randomGenerator.nextInt(380); 
      this.r2=r2; 

將我的「硬幣」設置爲隨機的x和y變量)。 當我在那個隨機點產生它們時,我已經做了一切正確的事情,並且我也在我的Player類中做了一個Collision()方法。它看起來像:

private void Collision(){ 

    for(int i = 0; i < c.size(); i++){ 
     if(getBounds().intersects(c.get(i).getBounds())){ 
      Game.points++; 
     } 
    } 

} 

該點正常工作(種),但我不能想出怎樣做才能去除硬幣後,它已被「撿到」。我當然有我的控制器類裏面的添加和removeItem方法:

public void removeItem(Coin coin){ 
    c.remove(coin); 
} 
    public void addItem(Coin coin){ 
    c.add(coin); 
} 

如addItem是所謂的控制器的構造...... 我知道這是一個有點長,但我想,讓一切清晰。如果有人幫助我,我會非常高興,因爲如果沒有這種幫助,遊戲就毫無意義。 感謝大家誰幫助我,如果你需要一些進一步的信息說。

編輯: 這是我的代碼:

private void Collision(){ 
    int newCount = 0; 
    while(iter.hasNext()){ 
    iter.next(); 
     for(int i=0; i<cb.size(); i++){ 
     if(getBounds().intersects(cb.get(i).getBounds())){ 
     Game.points++; 
     newCount++; 
     iter.remove(); 
     } 
    } 
    } 
    for(int i = 0; i < newCount; i++){ 
    controller.addItem(new Coin());  
    newCount--; 
    } 
} 

我有一個迭代器控制器聲明:

static Iterator<Coin> iter = c.iterator(); 

和getter函數,所以我可以在我的播放器類使用它:

public static Iterator<Coin> getCoinIterator(){ 
return iter; 
} 

然後在這裏它獲得從控制器到玩家類的迭代器

private Iterator<Coin> iter = Controller.getCoinIterator(); 

我甚至在控制器中創建了next()和hasNext()方法,但我仍然遇到一堆錯誤。

回答

0

首先,我不建議您在另一個位置再次添加同一個硬幣對象,而是刪除它,然後添加一個新的。我不確定你是否已經這樣做,因爲你的代碼不完整。

編輯: 在硬幣構造函數中,您必須隨機設置其位置,以便Coin coin = new Coin創建一個已經設置了位置的硬幣。 或者,您可以在每枚硬幣上調用控制器的位置隨機數發生器方法。 爲了得到這個工作,你必須添加

private int x, y; 

要將硬幣類並將那些在構造函數中的隨機值。這樣你就不需要在其他地方隨機化。只需用新硬幣創建一個硬幣對象,並且它具有其位置。 編輯結束

當談到去除硬幣,我會用一個迭代循環這樣的(假設c是你的列表)

int newCount = 0; 
while(iter.hasNext()){ 
    Coin coin = iter.next(); 
    if(getBounds().intersects(coin.getBounds())){ 
     Game.Points++; 
     newCount++ 
     iter.remove(); 
    } 
} 
for(int i = 0; i < newCount; i++){ 
    c.add(new Coin()); 
} 

這種循環的優點,你可以刪除列表中的對象沒有任何風險,並且很容易理解。我在這裏使用newCount來計算已經移除了多少個硬幣並且必須重新添加。爲此,Coin的構造函數必須隨機設置其位置。

編輯: 迭代器是用於獲取任何集合或列表中的所有元素秩序。當調用next()時,它將轉到列表中的下一個對象並將其返回。 hasNext()返回Iterator是否有剩餘元素,或者是否已到達結尾。 remove()刪除當前元素,它是next()返回的最後一個元素。

在一個迭代循環您檢查是否有離開的元素,只要是真的你的下一個元素,檢查它是否碰撞的球員,做的東西,如果它。 這個東西在我們的案例中是刪除該硬幣實例並創建一個新的硬幣實例。 編輯結束

另一件事我想指出的是,LinkedLists不是爲這個目的很不錯,我寧願使用的ArrayList,因爲它們是速度更快,具有隨機艾策斯,是什麼意思,是任何時候獲取或添加呼叫不依賴於索引。但在你的小遊戲中,這並不是什麼大問題。

我希望這可以幫助你。
如果我做了解釋你的代碼的一些錯誤,歡迎指正。

請原諒錯別字,我輸入編輯我的手機

+0

上你必須寫這個循環中,檢查碰撞,所以你的情況在玩家 –

+0

好方法。感謝您的回覆。 c是玩家類中鏈接列表的變量以獲得硬幣邊界。我真的不知道迭代器循環,但我想這應該工作。我的問題是:在if語句中不應該爲new循環添加1以使for循環正常工作? 3.硬幣獲得隨機位置,但在控制器構造函數中不在硬幣構造函數中。我應該改變它嗎?讓我知道。我還是不明白很多事情:d – Ragnar

+0

好吧,我會盡力澄清我的答案 –

相關問題