Andengine/Box2D physics addon을 사용하여 게임을 만들고 있습니다. 전 세계 단계 계산 중에 box2d 본문의 추가/이동/삭제로 인해 임의의 충돌이 발생했습니다. 따라서 setUserData 메소드를 사용하여 제거를 위해 스프라이트/본문을 플래그 지정하는 코드를 구현했습니다. 각 본문에 JSON 객체를 첨부하고 스프라이트AndEngine Sprite/Box2D 본문 제거는 마디 부 바디를 제거하지만, 스프라이트의 모든 인스턴스를 제거합니까?
이private JSONObject makeUserData(int type, Body body, Object sprite)
{
JSONObject myObject = new JSONObject();
try {
myObject.put("type", type);
myObject.put("sprite", sprite);
myObject.put("body", body);
myObject.put("deleteStatus", false);
} catch (JSONException e) {
Log.d(TAG,"Exception creating user data:"+e);
}
return myObject;
}
다음 업데이트 스레드에서 이러한 플래그를 찾고 내 세상의 모든 기관을 통해 반복과 함께 스프라이트/몸을 삭제 : 스프라이트의 종류, 본문 및 스프라이트 자체의 삭제 상태를 포함 깃발. 바디가 올바르게 제거되지만, 스프라이트 제거는 제거하기 위해 플래그가 지정된 특정 부품을 제거하는 것보다 그 particluar 스프라이트의 모든 인스턴스를 삭제하는 것처럼 보입니다! 내 플레이어가 보이지 않는 물건과 충돌 할 때 시체가 스프라이트없이 여전히 존재한다고 말할 수 있습니다! 다음은 코드를 제거하는 코드입니다.
private void removeObjectsSetForDestruction()
{
if(this.mPhysicsWorld!=null)
{
Iterator<Body> allMyBodies = this.mPhysicsWorld.getBodies();
boolean isDelete = false;
JSONObject currentBodyData;
while(allMyBodies.hasNext())
{
try {
currentBodyData = (JSONObject)allMyBodies.next().getUserData();
if(currentBodyData!=null)
{
isDelete = (Boolean) currentBodyData.get("deleteStatus");
if(isDelete)
{
destroyObstruction((Body) currentBodyData.get("body"));
}
}
} catch (JSONException e) {
Log.d(TAG,"Error getting world bodies data:"+e);
}
}
}
}
private void destroyObstruction(Body obstructionBody) throws JSONException
{
obstructionBody.setActive(false);
JSONObject secondBodyData = null;
if(obstructionBody.getUserData()!=null)
{
secondBodyData=(JSONObject) obstructionBody.getUserData();
//explodeObstruction(((IEntity) secondBodyData.get("sprite")).getX(),((IEntity) secondBodyData.get("sprite")).getY());
if(secondBodyData.get("sprite") instanceof AnimatedSprite)
{
removeObject((AnimatedSprite) secondBodyData.get("sprite"));
}
else
{
removeObject((Sprite) secondBodyData.get("sprite"));
}
}
}
private void removeObject(final AnimatedSprite myAnimSprite)
{
final PhysicsConnector myPhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(myAnimSprite);
this.mPhysicsWorld.unregisterPhysicsConnector(myPhysicsConnector);
this.mPhysicsWorld.destroyBody(myPhysicsConnector.getBody());
this.mScene.unregisterTouchArea(myAnimSprite);
this.mScene.detachChild(myAnimSprite);
System.gc();
}
private void removeObject(final Sprite mySprite)
{
final PhysicsConnector myPhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(mySprite);
this.mPhysicsWorld.unregisterPhysicsConnector(myPhysicsConnector);
this.mPhysicsWorld.destroyBody(myPhysicsConnector.getBody());
this.mScene.unregisterTouchArea(mySprite);
this.mScene.detachChild(mySprite);
System.gc();
}
포인터를 주셔서 감사합니다. 시도해 보겠습니다. 코드가'textureRegion.clone()'에서'textureRegion.deepCopy()'(적어도 보이는 것)로 변경되었다고 생각됩니다. S) – AndroidNoob
'textureRegion.deepCopy()'처럼 보이기 때문에 트릭을 마쳤습니다. 포인터에 다시 한번 감사드립니다! – AndroidNoob
@AndroidNoob, 아무쪼 락! AndEngine 라이브러리를 업데이트해야합니다! =) – Egor