我有两个水平方向移动的图像。每当两个图像之间发生碰撞时,我希望它们消失,这就是我的问题。有人可以帮我怎么做吗?
顺便说一句,这是我的代码。如果您愿意,可以查看:
private boolean checkCollisions()
{
for (Sprite r1 : z_sorted_sprites)
{
for (Sprite r2 : z_sorted_sprites)
{
if (r1 == r2)
{
continue;
}
RectangleX me = r1.getBounds();
RectangleX other = r2.getBounds();
if (me.intersects(other))
{
collision = true;
System.out.println("collision : " + r1.getName() + " with " + r2.getName());
// disappear(me,other);
}
else
{
collision = false;
System.out.println("no collision");
}
}
}
return collision;
}
答案 0 :(得分:0)
尝试以下方法:
在paint(Graphics g)
方法中,执行以下操作:
if(!checkCollisions()){
//draw your sprites
//g.drawImage(...);
}
在checkCollisions()方法中,在检测到碰撞时调用重绘。
if (me.intersects(other))
{
collision = true;
System.out.println("collision : " + r1.getName() + " with " + r2.getName());
repaint();
}
答案 1 :(得分:0)
因为你在同一个集合上迭代两次,所以我很确定你必须通过构建要删除的项目列表来解决它,然后在检测到所有冲突后删除它们。
像这样:
private boolean checkCollisions()
{
ArrayList<Sprite> toRemove = new ArrayList<Sprite>();
for (Sprite r1 : z_sorted_sprites)
{
for (Sprite r2 : z_sorted_sprites)
{
// ...
if (me.intersects(other))
{
// ...
toRemove.add(r1);
toRemove.add(r2);
}
else
{
// ...
}
}
}
z_sorted_sprites.removeAll(toRemove);
return collision;
}
请注意,当两个精灵碰撞时,它们每次都会被添加到toRemove
列表中两次。您可以通过更改for循环来阻止此操作并提高循环效率(假设z_sorted_sprites
为List
):
for (int i = 0; i < z_sorted_sprites.size(); i++)
{
Sprite r1 = z_sorted_sprites.get(i);
for (int j = i + 1; j < z_sorted_sprites.size(); j++)
{
Sprite r2 = z_sorted_sprites.get(j);
// ...
}
}
顺便说一句,你确定你的回报价值正在回归你的想象吗?目前它将返回false,除非列表中的最后两个精灵碰巧碰撞。如果你想让它在有任何碰撞的情况下返回true,那么摆脱一行collision = false;
返回一个碰撞次数可能会更有用,但我把它留给你......