1

我最近在AndEngine上进行了探索。我写了一个简单的测试演示,我在其中实现IOnSceneTouchListener并且场景注册了一个TimerHandler来改变一个ChangableText。我将引擎设置为runOnUpdateThread true

所以问题是:当我触摸场景一段时间时,活动暂停并崩溃。Logcat 显示与之前相同的文本:“org.anddev.andengine.util.pool.PoolUpdateHandler$1 已用尽,1 个项目尚未回收。已分配 1 个。”

如果有人能解决我的问题,我将不胜感激!

PS:我的代码

    public class TestActivity extends BaseGameActivity implements IOnSceneTouchListener, IOnMenuItemClickListener {
    ...
    ...
    private TimerHandler mTimeUpdateHandler = new TimerHandler(1.f, true, new ITimerCallback() {
            @Override
            public void onTimePassed(TimerHandler arg0) {
                runOnUpdateThread(new Runnable() {
                    @Override
                    public void run() {
                        if (mElapsedText != null && mAttempts > 0) {
                            mElapsedText.setText("Time: "
                                    + (ParticlyActivity.this.mEngine.getSecondsElapsedTotal() - mCurrentTotalSeconds),
                                    false);
                        }
                    }
                });
            }
        });
    ...
    ...

    // @Override
        public Engine onLoadEngine() {
            this.mCamera = new BoundCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
            final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
                    new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera).setNeedsSound(true);
            engineOptions.getTouchOptions().setRunOnUpdateThread(true);
            this.mEngine = new Engine(engineOptions);
            return this.mEngine;
        }


    public Scene onLoadScene(){
    ...
                // Text
                mElapsedText = new ChangeableText(20, 12, this.mFont, "Time:00.00");
                mScene.getFirstChild().attachChild(mElapsedText);
                mScene.registerUpdateHandler(mTimeUpdateHandler);

    ...
    }

@Override
    public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
            if ((pSceneTouchEvent.isActionMove() || pSceneTouchEvent.isActionDown()) && mAttempts < MaxBullets) {
                double angle = 0;
                if ((pSceneTouchEvent.getX() - StartX) == 0) {
                    angle = 90;
                } else {
                    angle = Math
                            .abs(Math.atan((StartY - pSceneTouchEvent.getY()) / (StartX - pSceneTouchEvent.getX())) / 3.14 * 180);
                }
                if (angle > 90) {
                    angle = 90;
                } else if (angle < 0) {
                    angle = 0;
                }
                mGun.setRotation((float) -angle);
                mGun.setStrength(pSceneTouchEvent.getX());
            } else if (pSceneTouchEvent.isActionUp() && mAttempts < MaxBullets) {
...
            }
        }
        return true;
    }

    }

定时器处理程序:

private TimerHandler mTimeUpdateHandler = new TimerHandler(1.f, true, new ITimerCallback() {
    @Override
    public void onTimePassed(TimerHandler arg0) {
        runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                if (mElapsedText != null && mAttempts > 0) {
                    mElapsedText.setText("Time: " + (ParticlyActivity.this.mEngine.getSecondsElapsedTotal() - mCurrentTotalSeconds), false);
                }
            }
        });
    }
});
4

1 回答 1

0

UIThread 负责绘图,如果您需要更改 Text 值,UpdateThread 会在每一帧执行,请在 UpdateThread 上执行[通常远离 UIThread]

于 2012-11-05T20:51:42.413 回答