从 2D Array- Processing 中移除对象

Remove object from 2D Array- Processing

我正在创建一个简单的 space 入侵者游戏。一旦他们被子弹击中,我希望删除其中一个入侵者。入侵者由图像的二维数组组成,我已经测试了图像和子弹之间的碰撞(在 ArrayList 中)并且效果很好。所以游戏检测到碰撞,下一步就是删除被撞到的正确物体。我有点困惑如何在二维数组中正确对应子弹击中的位置和它击中的对象,然后将其从数组中删除并继续游戏。

下面是我如何在 setup() 中创建入侵者数组

  for(int i=0; i<2; i++){
    for(int j=0; j<4; j++){
        invArray[j][i]= new Taxi(taxiX, taxiY);
        taxiX= taxiX+ 100;
    }
    taxiX=20;
    taxiY= taxiY+ 140;
  }

然后我在 draw() 中用图像填充二维数组

 for(int i=0; i<2; i++){
      for(int j=0; j<4; j++){
        invArray[j][i].update();
        if(invArray[j][i].y>=600){
           invArray[j][i].y= 0;
           invArray[j][i].render();
        }
      }
    }

您使用的是固定大小的数组。 理论上你可以使用像 shorten() and expand() 这样的数组辅助函数,但你真的需要注意你的计数器和数组结构。 实际上,对于初学者来说,我会说这是容易出错的。

将 hit invader 的数组元素设置为 null 可能更简单(但更 hackier), 然后在测试之前简单地检查入侵者是否不为空 collisions/rendering/etc.

例如在绘制():

for(int i=0; i<2; i++){
      for(int j=0; j<4; j++){
        if(invArray[j][i] != null){
           invArray[j][i].update();
           if(invArray[j][i].y>=600){
              invArray[j][i].y= 0;
              invArray[j][i].render();
           }
         }
      }
    }

另一种选择是使用具有动态大小的 ArrayList。 例如

ArrayList<Taxi> invaders = new ArrayList<Taxi>();

在设置中你会做类似的事情:

for(int i=0; i<2; i++){
    for(int j=0; j<4; j++){
        invaders.add(new Taxi(taxiX, taxiY));
        taxiX= taxiX+ 100;
    }
    taxiX=20;
    taxiY= taxiY+ 140;
  }

然后在 draw() 中:

for(int i = 0 ; i < invaders.size(); i++){
    Taxi t = invaders.get(i);
    t.update();
    if(t.y>=600){
       t.y= 0;
       t.render();
    }
    /*
    if(YOUR_HIT_CONDITION_HERE){
        invaders.remove(t);
    }
    */
}

一开始在一维和二维之间来回穿梭有点棘手arrays/indexing,但一旦掌握了它,就没那么糟糕了。

要从 2D x,y 转换为 1D 索引:

int index = x + y * width;

(其中 x、y 是计数器,宽度是网格的宽度(列数))。

相反,一维索引到二维 x,y:

int x = index % width; int y = index / width;

尝试将命中检测与从 arraylist 中删除元素分离,可能使用标志并在绘制循环的末尾删除。在代码的一部分中使用 arraylist.size() 作为循环的限制。也许这可以解决您的命中检测问题,也许您需要一个计数器。