追跡できない奇妙なバグ。ContactListener
Android ゲームで衝突を処理するためのクラスを実装しました。このbeginContact(Contact arg0)
メソッドでは、2 つのボディarg0
がそこにあり、スタックにプッシュされていることがわかります。呼び出した直後world.step()
に独自のhandleCollisions()
メソッドを実行し、そこでContact
オブジェクトを取り出してゲーム ロジックを実行します。ただし、 をポップするContact
と、ボディの一方または両方が null になることがあります。
は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;
}
...
}
}