Безопасно удалить спрайт с помощью Andengine - PullRequest
3 голосов
/ 19 февраля 2012

Я создаю множество шаровых спрайтов, которые случайным образом отскакивают от экрана.При касании я хочу, чтобы мяч был удален со сцены.(Если несколько шариков занимают одно и то же пространство, они также будут удалены в данный момент).

Я понимаю, что scene.detachChild должен быть запущен на runOnUpdateThread, поэтому в моем подклассе Ball sprite я отсоединяюна ощупь путем переопределения onAreaTouched:

        @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY)
    {
        ((BaseGameActivity) thisAct).runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                /* Now it is save to remove the entity! */


                    //scene.unregisterTouchArea(Ball.this);
                    scene.detachChild(Ball.this);

            }
        });
        return false;
    }

Я должен передать в главном Activity конструктору шара спрайт, а затем удалить шар из главной сцены Activity.

Если я раскомментируюВ строке scene.unregisterTouchArea (Ball.this), чтобы остановить спрайты, действующие на прикосновения (это не влияет на удаление, но думал, что лучше остановить обработку прикосновений), я получу исключение indexOutOfBoundsException, которое, я думаю, связано сне отсоединять спрайты из runOnUpdateThread.

**java.lang.IndexOutOfBoundsException: Invalid index 90, size is 90
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
at java.util.ArrayList.get(ArrayList.java:311)
at org.anddev.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:320)**

Два вопроса:

  1. Правильно ли я обработал удаление спрайта внутри подкласса ball, используя переопределениеonAreaTouched, или я должен как-то вернуть удаление в основное действие (нужен ли мне подклассна первом месте)?

  2. Есть идеи, почему я получаю исключение IndexOutOfBoundsException, если я включаю unregisterTouchArea?

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Никогда не делайте удаление в TouchListener.Вы должны придерживаться IUpdateHandler.

1.) Нет необходимости создавать подклассы, поскольку вы можете выполнять удаление везде, где у вас есть доступ к сцене.

2.) Произошло исключение IndexOutOfBoundExceptionпотому что вы делаете удаление в TouchListener.Возможно, какой-то метод добавляет новые вещи в сцену, пока вы удаляете спрайт.Помещение удаления в UpdateHandler решает это.

0 голосов
/ 13 февраля 2014
/*
         * Removing entities can only be done safely on the UpdateThread. Doing
         * it while updating/drawing can cause an exception with a suddenly
         * missing entity. Alternatively, there is a possibility to run the
         * TouchEvents on the UpdateThread by default, by doing:
         * engineOptions.getTouchOptions().setRunOnUpdateThread(true); when
         * creating the Engine in onLoadEngine();
         */
        MainActivity.this.runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                /* Now it is safe to remove the entity! */
                mScene.detachChild(face);
            }
        });
...