我对Java和Android编程还很陌生,当发生碰撞时,我很难移除一个对象。
我环顾了一下Web,发现在碰撞检测期间,我不应该处理移除Box2D实体(一个联系人侦听器),我应该将我的对象添加到ArrayList,并在实体的用户数据部分设置一个变量以删除或不删除,并在更新处理程序中处理移除操作。
所以我这么做了:
首先,我定义了两个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) {
}
});
我的计划是通过检查主体的用户数据部分中的变量来检测在联系人侦听器中碰撞的两个主体,在数组列表中获取它们的编号,最后使用更新处理程序删除这些主体。
问题是:
我正确使用了arraylist吗?在冲突侦听器中,如何从数组列表中检索发生冲突的对象?
如何向用户数据中添加变量(请输入代码)。
我试图删除这个更新处理程序中的一个主体,但它仍然抛出一个nullpointerexception,那么添加更新处理程序的正确方法是什么?我应该在哪里添加它?
其他的建议都很好。
提前谢谢。
最佳答案
通常情况下,您会查看用户数据中发生冲突的两个内容,以确定是否应删除某些内容,并将要删除的内容放入列表中。然后在时间步骤之后,浏览列表并删除它们,然后清除列表以准备下一个时间步骤。
{//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
}
因此,虽然您确实需要有一个可用的列表,但在创建实体时不需要将所有实体都放入其中。
用户数据可以是您自己创建的类,因此您可以使它包含您喜欢的任何内容。因为您有一个列表来告诉您哪些实体被标记为要删除,所以不需要在用户数据中为此设置标记。此外,在每次检查用户数据中的标志之后,循环遍历世界上的每个实体将是低效的。