2011-09-06 169 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