2011-09-06 127 views
6

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

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通过检查身体用户数据部分的变量,在联系侦听器中碰撞两个物体,在数组列表中获取它们的数字,最后使用更新处理程序删除这些物体。

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

回答

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 
} 

所以,当你确实需要有可使用的列表,你不需要把所有的尸体到它在创建时。

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

+0

非常感谢您的回应 – Ayham