1

私は最近、AndEngineを調べています。簡単なテスト デモを作成します。実装するIOnSceneTouchListenerと、シーンが を登録しTimerHandlerて変更しChangableTextます。そして、エンジンをrunOnUpdateThread trueに設定しました。

問題は、シーンにしばらく触れたときに、アクティビティが一時停止してクラッシュしたことです。Logcat には、以前と同じテキストが表示されました。

誰かが私の問題を解決できるなら、とても感謝しています!

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 に答える