2011-09-06 24 views
6

私はまだJavaとAndroidのプログラミングには新しく、衝突が発生したときにオブジェクトを削除するのは非常に困難です。 私はウェブを見渡し、衝突検知(連絡先リスナー)中にBOX2Dボディを削除することは決してないはずです。私は自分のオブジェクトをarraylistに追加し、ボディのUser Dataセクションに変数を設定して削除する必要があります。更新ハンドラで削除アクションを処理します。私は2つのArrayListの顔用と体のための1つを定義する まず:私は顔を作成し、その身体にその顔を接続したときに衝突が発生したときにオブジェクトを削除する

ArrayList<Sprite> myFaces = new ArrayList<Sprite>(); 
ArrayList<Body> myBodies = new ArrayList<Body>(); 

は、その後、私はこのような彼らのArrayListに追加 は、だから私はこれをしませんでした:

face = new AnimatedSprite(pX, pY, pWidth, pHeight, this.mBoxFaceTextureRegion); 
Body BoxBody = PhysicsFactory.createBoxBody(mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, BoxBody, true, true)); 
myFaces.add(face); 
myBodies.add(BoxBody); 

今私はこのようなonloadsceneに接触リスナーと更新ハン​​ドラを追加します。

this.mPhysicsWorld.setContactListener(new ContactListener() { 
private AnimatedSprite face2; 
@Override 
public void beginContact(final Contact pContact) { 
} 
@Override 
public void endContact(final Contact pContact) { 
} 
@Override 
public void preSolve(Contact contact,Manifold oldManifold) { 

} 
@Override 
public void postSolve(Contact contact,ContactImpulse impulse) {   
} 
}); 



scene.registerUpdateHandler(new IUpdateHandler() { 


@Override 
public void reset() { } 

@Override 
public void onUpdate(final float pSecondsElapsed) { 

} 
}); 

私の計画はwhicを検出することですh身体のユーザーデータセクションから変数をチェックし、配列リストでその番号を取得し、最後に更新ハンドラを使用してこれらのボディを削除することによって、コンタクトリスナ内で2つのボディが衝突しました。

質問は: 私は正しくarraylistを使用していますか?衝突リスナーでは、配列リストから衝突したオブジェクトをどのように取得するのですか? ユーザーデータに変数を追加する方法(コードを参考にしてください)。 このアップデートハンドラでボディを削除しようとしましたが、それでもNullPointerExceptionがスローされるので、アップデートハンドラを追加する正しい方法は何ですか?どこに追加する必要がありますか? これを行うための他のアドバイスは素晴らしいでしょう。 ありがとうございます。

答えて

4

通常、何かを削除するかどうかを判断するために衝突した2つのもののユーザーデータを調べ、削除するものをリストに入れます。その後、タイムステップの後、リストを通過してそれらを削除し、次のタイムステップの準備が整ったリストをクリアします。

{//game loop 
    do world step //contacts occur in here, some bodies may be put in the list 
    make sure list contents are unique 
    go thru list and delete contents 
    clear the list 
} 

リストを使用できるようにする必要がありますが、作成時にすべてのボディーを配置する必要はありません。

ユーザーデータは、自分で作成したクラスにすることができます。したがって、ユーザーデータには好きなものを含めることができます。どのボディに削除のフラグが立てられているかを示すリストがあるので、そのためにユーザーデータにフラグを設定する必要はありません。さらに、ユーザデータのフラグをチェックするたびに、毎回世界のすべての物体をループするのは非効率的です。

+0

ご回答いただきありがとうございます。 – Ayham

関連する問題