发生碰撞时移除对象

Ayh*_*ham 6 android box2d andengine

我还是Java和Android编程的新手,在碰撞发生时删除对象我遇到了很多麻烦.我看着网页四周,发现我从来没有处理碰撞检测时去除Box2D的身体(接触听众),我要我的对象添加到一个ArrayList,并设置在机身的用户数据段的一个变量,删除或不和处理更新处理程序中的删除操作.所以我这样做了:首先我为面部定义了两个ArrayLists,为body定义了一个:

ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Run Code Online (Sandbox Code Playgroud)

然后,当我创建一个面并将该面连接到它的主体时,我将它们添加到它们的ArrayLists中,如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

现在我在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) {

}
});
Run Code Online (Sandbox Code Playgroud)

我的计划是通过检查正文的用户数据部分中的变量,在数组列表中获取它们的数字并最终使用更新处理程序来删除这些正文来检测联系人侦听器中哪两个主体发生冲突.

问题是:我是否正确使用了arraylist?并在碰撞监听器中如何检索从数组列表中冲突的对象?如何将变量添加到用户数据(请使用代码).我尝试在这个更新处理程序中删除一个主体,但它仍然抛出一个NullPointerException,那么添加更新处理程序的正确方法是什么?我应该在哪里添加它?任何其他建议这样做都会很棒.提前致谢.

ifo*_*e2d 4

通常,您会查看冲突的两个事物的用户数据,以决定是否应删除某些内容,并将要删除的内容放入列表中。然后在时间步之后,遍历列表并删除它们,并清除列表为下一个时间步做好准备。

{//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
}
Run Code Online (Sandbox Code Playgroud)

因此,虽然您确实需要有一个可用的列表,但您不需要在创建它们时将所有主体放入其中。

用户数据可以是您自己创建的类,因此您可以使其包含您喜欢的任何内容。由于您有列表告诉您哪些主体被标记为删除,因此您不需要在用户数据中为此设置标记。此外,在每个时间步之后循环遍历世界上的每个主体来检查用户数据中的标志是低效的。