如何在java中删除(并重新生成)一个项目(硬币)。 (使用控制器类进行产卵)

问题描述:

我是一个使用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()方法,但我仍然遇到一堆错误。

首先,我不建议您在另一个位置再次添加同一个硬币对象,而是删除它,然后添加一个新的。我不确定你是否已经这样做,因为你的代码不完整。

编辑: 在硬币构造函数中,您必须随机设置其位置,以便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

好吧,我会尽力澄清我的答案 –