一个我无法追踪的奇怪错误。我已经实现了一个ContactListener
类来处理我的 Android 游戏中的碰撞。在该beginContact(Contact arg0)
方法中,我可以看到其中的两个物体在arg0
那里,并被推到堆栈上。调用后立即world.step()
运行我自己的handleCollisions()
方法,在其中弹出Contact
对象并执行一些游戏逻辑。但是,偶尔当我弹出 a 时Contact
,它的一个或两个主体都为空。
将Contact
其主体放在堆栈中,但它以空主体出现。我不知道为什么会发生这种情况,更重要的是,我找不到发生这种情况的时间。据我所知,我在其他地方的任何代码都没有删除尸体,但是再次出现我不知道的副作用。这并不总是发生,这无济于事。通常它发生在发生多次碰撞时。
有人对什么可以移除尸体有任何想法吗?或者,有没有人知道跟踪尸体以确定它们何时变为空的方法?
以下是一些可能有用也可能没有帮助的代码:
public class ConcreteContactListener implements ContactListener
{
private Stack<Contact> contacts;
public ConcreteContactListener()
{
contacts = new Stack<Contact>();
}
@Override
public void beginContact(Contact arg0)
{
contacts.push(arg0);
System.out.println("push: " + arg0.m_fixtureA.m_body);
}
public int handleCollisions(ArrayList<Ball> balls, World world, ArrayList<Ball> smears, SoundEffects sfx, Combos combos)
{
int score = 0;
while (!contacts.isEmpty())
{
Contact contact = contacts.pop();
System.out.println("Contact: " + contact.m_fixtureA.m_body);
int a = -1;
int b = -1;
for (int i = 0; i < balls.size(); i++)
{
System.out.println("Ball: " + balls.get(i).getBody());
if (contact.m_fixtureA.m_body.equals(balls.get(i).getBody()))
a = i;
else if (contact.m_fixtureB.m_body.equals(balls.get(i).getBody()))
b = i;
}
...
}
}