从2D Array-Processing中删除对象

时间:2017-04-03 08:55:08

标签: processing

我正在制作一个简单的太空入侵者游戏。一旦他们被子弹击中,我想要删除其中一个入侵者。入侵者由2D图像阵列组成,我已经测试了图像和子弹之间的碰撞(在ArrayList中)并且工作正常。因此游戏会检测到碰撞,下一步是删除已被击中的正确对象。关于如何正确对应子弹撞击2D阵列中撞击的对象,然后将其从阵列中删除并继续游戏,我感到有点困惑。

以下是我在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()

中的图像填充2D数组
 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();
        }
      }
    }

2 个答案:

答案 0 :(得分:0)

您正在使用固定大小的数组。 从理论上讲,您可以使用像shorten()expand()这样的数组辅助函数,但您确实可以观察计数器和数组结构。 在实践中,对于初学者,我会说这很容易出错。

将命中入侵者的数组元素设置为null可能更简单(但更黑客), 然后在测试碰撞/渲染/等之前检查入侵者是否为空。

e.g。在draw():

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);
    }
    */
}

在开始时在1D和2D数组/索引之间来回走动有点棘手,但是一旦掌握了它,它就不那么糟糕了。

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

int index = x + y * width;

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

相反,1D索引到2D x,y:

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

答案 1 :(得分:0)

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