0

シーン上をランダムな方向に移動するスプライト(Easy Enemyなど)があります。新しいスプライト ( myFood )と衝突すると、新しいアニメーションを再生し、簡単な敵に新しい方向を与えます。Easy Enemy が新しいパスを完成させたら、それらをPoolに送りたいと思います。onPathFinshed()内でエラーが発生しました。

カスタムSceneAnimated Spriteの両方を使用します。それらをリサイクルするためのEasyEnemyPoolクラスも作成します。

エラー:

02-07 11:52:55.624: E/AndroidRuntime(22486): 致命的な例外: UpdateThread 02-07 11:52:55.624: E/AndroidRuntime(22486): java.lang.IndexOutOfBoundsException: 無効なインデックス 0、サイズは 0 02 -07 11:52:55.624: E/AndroidRuntime(22486): java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 02-07 11:52:55.624: E/AndroidRuntime(22486): java.util で.ArrayList.remove(ArrayList.java:399)

カスタム シーンの GameLevelOneクラス内のコード:

    // own override method
@Override
public void onSceneUpdate() {
    registerUpdateHandler(new IUpdateHandler() {
        @Override
        public void onUpdate(float pSecondsElapsed) {
            synchronized (this) {
                try {
                    // ===get EasyEnemy List from it===
                    eIt = getEasyEnemyIterator();
                    while (eIt.hasNext()) {
                        ee = eIt.next();

                        if (ee.collidesWith(myFoodItem)) {
                            // Log.e("boolean value", ee.isCollisionActive
                            // + "");
                            if (ee.isCollisionActive) {

                                // call the sprite to
                                // move new direction
                                ee.giveNextDirection(ee);
                                unregisterTouchArea(ee);

                                decreaseFoodSize();
                                changeLife();

                                Log.e("!!!!Food !!!: ",
                                        "Easy Enemy Touched My Food");

                                eIt.remove();
                                break;
                            }
                        }
                    }
                    scoreText.setText("Score:" + finalScore);
                    life_text.setText("Life:" + hitpoints + " %");
                } catch (Exception e) {
                    Log.e("Gama Play Engine Error", "" + e);
                }
            }

        }
        @Override
        public void reset() {
        }
    });
}

コードEasyEnemyクラス内。

public synchronized void giveNextDirection(final EasyEnemy e) {
    clearEntityModifiers();
    animate(new long[] { 110, 110, 110 }, 0, 2, true);
    isCollisionActive = false;
    try {
        registerUpdateHandler(new TimerHandler(2.5f, new ITimerCallback() {

            @Override
            public void onTimePassed(TimerHandler pTimerHandler) {
                // un reg. code
                unregisterUpdateHandler(pTimerHandler);
                // add a path Modifiers
                registerEntityModifier(new PathModifier(5, getFinalPath(),
                        new IPathModifierListener() {

                            @Override
                            public void onPathWaypointStarted(
                                    PathModifier pPathModifier,
                                    IEntity pEntity, int pWaypointIndex) {
                                switch (pWaypointIndex) {
                                case 0:
                                    // move the sprite to right angle
                                    setRotation(270 + getAngle(xCurrent,
                                            yCurrent, xFinal, yFinal));
                                    break;
                                }
                            }

                            @Override
                            public void onPathWaypointFinished(
                                    PathModifier pPathModifier,
                                    IEntity pEntity, int pWaypointIndex) {

                            }

                            @Override
                            public void onPathStarted(
                                    PathModifier pPathModifier,
                                    IEntity pEntity) {

                            }

                            @Override
                            public void onPathFinished(
                                    PathModifier pPathModifier,
                                    IEntity pEntity) {
                        // ===== > remove from the list
                                GamePlayEngine.easyEnemyLinkedList.remove(e);
                                unregisterEntityModifier(pPathModifier);
                        //  ==== > send it to pool
                                EasyEnemyPool.getSharedEasyEnemyPool()
                                        .recyclePoolItem(e);
                            }

                        }));
            }

        }));

    } catch (Exception e2) {
        Log.e("Error", ""+e2);
    }
}

問題を理解するために最善を尽くします。うまくいけば、誰かがそれを解決するためにスーパー ノックをプレイします。

4

1 に答える 1

0

さて、私は欠けている点を見つけました。RunOnUpdateThreadを使用して、Sprite をパス修飾子リスナー内のプールに送信する必要があります。だから、私の onPathFinish メソッドは次のようになります

@Override
                public void onPathFinished(
                    final PathModifier pPathModifier,
                        final IEntity pEntity) {
                            // use BaseActivity runnable thread
                        BaseActivity.instance
                                .runOnUpdateThread(new Runnable() {
                                    @Override
                                    public void run() {

                                    unregisterEntityModifier(pPathModifier);
                                    GamePlayEngine.easyEnemyLinkedList.remove(this);
                                    EasyEnemyPool.getSharedEasyEnemyPool().recyclePoolItem(e);
                                    Log.e(" --onPathFinished-- ", "...No problem..");

                                }
                            });
                    }

希望、これは誰かを助けることができます.

于 2013-02-07T09:10:51.820 に答える