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

How to delete (and respawn) an item (coin) in java. (Using Controller class for spawning)

我是使用 Java 的初级程序员。我正在制作我的第一个简单游戏。我需要硬币(我的 Controller class 中的 LinkedList 项目)在它们被拾起后被删除,更好的是当它们可以在另一个地方再次产生时(我正在使用这个:

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;

设置我的 "coin" 一个随机的 x 和 y 变量)。 在那个随机位置生成它们时,我已经做对了所有事情,而且我还在我的 Player class 中创建了一个 Collision() 方法。看起来像这样:

private void Collision(){

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

}

这些点数工作正常(有点),但我只能弄清楚如何在它 "picked up" 之后移除硬币。当然,我的 Controller class:

中有一个 add 和 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 函数,所以我可以在我的播放器中使用它 class:

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

然后在此处获取从控制器到播放器的迭代器 class

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

我什至在控制器中创建了 next() 和 hasNext() 方法,但我仍然遇到一堆错误。

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

编辑: 在 Coins Constructor 中,您必须随机设置其位置,以便 Coin coin = new Coin 创建一个已经设置其位置的硬币。 或者,您可以在每个硬币上调用控制器的位置随机化器方法。 要使其正常工作,您必须添加

private int x, y;

到你的硬币 class 并在构造函数中将它们设置为随机值。这样你就不需要在其他任何地方随机化它。只需用新硬币创建一个硬币对象,它就有自己的位置。 编辑结束

在删除硬币时,我会使用这样的迭代器循环(假设 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() 时,它会转到列表中的下一个对象并 returns 它。 hasNext() returns 如果 Iterator 还剩下 Elements,或者它已经到达终点。而 remove() 删除当前元素,也就是 next() 返回的最后一个元素。

在迭代器循环中,您检查是否还有剩余的元素,只要是,您就会获得下一个元素,检查它是否与玩家发生碰撞,以及它是否会做某事。 在我们的例子中,这个 Something 是删除那个硬币实例并创建一个新的。 编辑结束

我想指出的另一件事是,LinkedLists 不太适合这个目的,我宁愿使用 ArrayLists,因为它们更快并且具有随机访问,这意味着任何 get 或添加调用不依赖于索引。但在你的小游戏中,这没什么大不了的。

希望对您有所帮助。
如果我在解释您的代码时犯了一些错误,请指正。

请原谅打字错误,我在 phone

上输入了编辑