1

onSceneTouchEvent を使用して、TMX マップ上でプレーヤーを移動しています。

 @Override
        public Scene onCreateScene() {
...
                mScene.setOnSceneTouchListener(this);
}

...

@Override
        public boolean onSceneTouchEvent(Scene pScene, final TouchEvent pSceneTouchEvent) {

        switch(pSceneTouchEvent.getAction()) {

        case TouchEvent.ACTION_DOWN:

                        mLastMotionX = pSceneTouchEvent.getX();
                        mLastMotionY = pSceneTouchEvent.getY();

                        break;

        case TouchEvent.ACTION_MOVE:

                        mLastMotionX1 = pSceneTouchEvent.getX();
                        mLastMotionY1 = pSceneTouchEvent.getY();

                        SpeedVector(mLastMotionX, mLastMotionY, mLastMotionX1,
                                        mLastMotionY1);                        
                        break;

        case TouchEvent.ACTION_UP:

                        mLastMotionX2 = pSceneTouchEvent.getX();
                        mLastMotionY2 = pSceneTouchEvent.getY();
                        SpeedVectorStop(mLastMotionX, mLastMotionY, mLastMotionX2,
                                        mLastMotionY2);
                break;         
}

                return false;

        }

...

        public void SpeedVector(float x1, float y1, float x2, float y2) {

                if ((Math.abs(x2 - x1) < 55) && (Math.abs(y2 - y1) < 55)) {


                        float r = (float) Math.sqrt(((x2 - x1) * (x2 - x1))
                                        + ((y2 - y1) * (y2 - y1)));
                        float rx = (x2 - x1) / r;
                        float ry = (y2 - y1) / r;
                        new Vector2(rx * 100, ry * 100);
                        new Vector2(x2, y2);



                        if (speedThread) {
                                mPlayerBody.setLinearVelocity(rx * 15, ry * 15);
                        } else
                                mPlayerBody.setLinearVelocity(rx * 5, ry * 5);

                }
        }


public void SpeedVectorStop(float x1, float y1, float x2, float y2) {
                if ((Math.abs(x2 - x1) < 10) && (Math.abs(y2 - y1) < 10)) {
                        mPlayerBody.setLinearVelocity(0, 0);
                }
        }

また、シーンには、プレイヤーを追跡する他の多くのスプライト (敵) がいます (単純な AI)。プレイヤーとの距離に応じて、位置と速度が変化します。したがって、すべてのデータは次のメソッドで更新されます。

@Override
                        public final void onUpdate(final float pSecondsElapsed) {
//some code
}

そして、シーンに数回触れると、AndEngine がクラッシュします。これは LogCat です。

05-05 17:13:06.539: V/AndEngine(2676): org.andengine.input.touch.TouchEvent$TouchEventPool が使い果たされ、2 つのアイテムがまだリサイクルされていません。もう1つ割り当てられます。05-05 17:13:06.539: V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler$1 が使い果たされ、2 つのアイテムがまだリサイクルされていません。もう1つ割り当てられています。05-05 17:13:06.559: V/AndEngine(2676): org.andengine.input.touch.TouchEvent$TouchEventPool が使い果たされ、3 つのアイテムがまだリサイクルされていません。もう1つ割り当てられています。05-05 17:13:06.559: V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler$1 が使い果たされ、3 項目がまだリサイクルされていません。もう1つ割り当てられています。05-05 17:13:06.579: V/AndEngine(2676): org.andengine.input.touch.TouchEvent$TouchEventPool が使い果たされ、4 つのアイテムがまだリサイクルされていません。もう1つ割り当てられます。05-05 17:13:06.579: V/AndEngine (2676): org.andengine.util.adt. pool.PoolUpdateHandler$1 が使い果たされ、4 つのアイテムがまだリサイクルされていません。もう1つ割り当てられます。

や。。など。

誰でもこの問題に遭遇しましたか?

この問題は非常に緊急であり、まだ解決策がありません (

4

1 に答える 1

2

メッセージは、TouchEvent クラスのプライベートな静的メンバーとして含まれる TouchEventPool によって生成されます。

このログ呼び出しは、GenericPool<T>クラスの 136 行によって生成されますが、これは問題ではありません。実際には、アプリケーションでもそれらを受け取ります。

再利用されるため、エンジンが追加の touchEvent を割り当てることを通知するだけです。

TouchEventPool で適切なコンストラクター、コンストラクターを呼び出すpublic GenericPool(final int pInitialSize)か、常に TouchEventPool で を公開public synchronized void batchAllocatePoolItems(final int pCount)してから、適切なパラメーターを使用してアプリケーションでそれを呼び出すことにより、開始プールを増やすことができます。

ところで、TouchEvent を保存していない限り (保存するべきではありません!! 必要な場合は、コピーを作成してください!)、これはアプリをクラッシュさせない情報メッセージです。

于 2013-05-06T20:02:19.717 に答える