【问题标题】:Removing an object when collision happens碰撞发生时移除物体
【发布时间】:2011-11-11 10:38:03
【问题描述】:

我还是 Java 和 Android 编程的新手,在发生碰撞时删除对象时遇到了很多麻烦。 我环顾网络,发现我不应该在碰撞检测(接触侦听器)期间处理删除 BOX2D 主体,我应该将我的对象添加到数组列表中,并在主体的用户数据部分设置一个变量以删除或不删除并处理更新处理程序中的删除操作。 所以我这样做了: 首先,我定义了两个 ArrayList,一个用于面,一个用于身体:

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

然后,当我创建一个面并将该面连接到它的身体时,我将它们添加到它们的 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);

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

}
});

我的计划是通过检查 body 的用户数据部分中的变量来检测接触侦听器中哪两个 body 发生碰撞,在数组列表中获取它们的编号,最后使用更新处理程序删除这些 body。

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

【问题讨论】:

    标签: android box2d andengine


    【解决方案1】:

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

    {//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
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多