我正在制作一个简单的太空入侵者游戏。一旦他们被子弹击中,我想要删除其中一个入侵者。入侵者由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();
}
}
}
答案 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()作为循环的限制。也许这可以通过命中检测解决您的问题,也许您需要一个计数器。