AndEngine Sprite / Box2D Удаление тела удаляет конкретное тело (как и должно быть), но удаляет все экземпляры спрайта? - PullRequest
0 голосов
/ 09 сентября 2011

Я создаю игру, используя физический аддон Andengine / Box2D. Я столкнулся со случайными сбоями из-за добавления / перемещения / удаления тел box2d во время вычисления мирового шага, поэтому я реализовал код для пометки спрайтов / тел для удаления с помощью метода setUserData - я прикрепляю объект JSON к каждому телу и спрайт содержит тип спрайта, тело и сам спрайт и его статус удаления:

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;
}

затем в потоке обновлений переберите все тела в моем мире в поисках этих флагов и удалите спрайты / тела с флагом. Тела удаляются правильно, однако удаление спрайта, кажется, удаляет каждый экземпляр этого конкретного спрайта, а не просто удаляет тот, который я пометил для удаления! Я могу сказать, что тела все еще присутствуют без спрайта, поскольку мой игрок сталкивается с невидимыми объектами! Вот код для удаления:

 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();
}

1 Ответ

1 голос
/ 09 сентября 2011

Я хотел бы взглянуть на ваши объекты, создающие код.Я предполагаю, что для каждого спрайта используется один и тот же TextureRegion, поэтому при изменении области одного спрайта изменяются те же области на других спрайтах из-за особенностей архитектуры Android.Для каждого спрайта с одинаковым TextureRegion вы должны использовать textureRegion.clone() в качестве последнего параметра конструктора.Надеюсь, это поможет.

...