1

Mario Zechner のBeginning Android Gamesフレームワークを適応させて、幼児の色学習アプリを作成しています。テストの最終段階で、ユーザーが 2 つの異なるボタン (下のスクリーンショットの「設定」ボタンと「ホーム」ボタンなど) を同時に押して離すと、「Colors! has stopped.」が停止することがわかりました。通知が表示されます。ここに画像の説明を入力

Zechner のフレームワークは、入力をリスト形式で処理し、それぞれを個別に処理します。問題はコードの @Override 更新領域にあると思います。

@Override
public void update(float deltaTime) {
    world.timer = world.timer + deltaTime;

    List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
    int len = touchEvents.size();

    for (int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);

        if (event.type == TouchEvent.TOUCH_UP) {
            // This is where the guts of my app are
        }
    }
}

以下は、例外を示す LogCat からのものです (「無効なインデックス」は、使用されるタッチの数によって異なりますが、サイズは常に 0 です)。

04-24 19:27:55.239: E/AndroidRuntime(28002): FATAL EXCEPTION: Thread-555
04-24 19:27:55.239: E/AndroidRuntime(28002): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
04-24 19:27:55.239: E/AndroidRuntime(28002):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at java.util.ArrayList.get(ArrayList.java:304)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at com.lilyandrosieshow.colors.GameScreen.update(GameScreen.java:153)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at com.badlogic.androidgames.framework.impl.AndroidFastRenderView.run(AndroidFastRenderView.java:42)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at java.lang.Thread.run(Thread.java:856)
04-24 19:28:59.301: D/dalvikvm(28002): GC_CONCURRENT freed 482K, 4% free 15473K/16071K, paused 2ms+2ms
04-24 19:32:55.262: I/Process(28002): Sending signal. PID: 28002 SIG: 9
04-24 19:32:55.262: E/AndroidRuntime(28002): Handle UnCaght exceptions. KILLING PID: 28002

追加してみました

if (len != 0)

forループの前ですが、同じ結果を受け取りました

あらゆる支援に感謝します!

4

1 に答える 1

1

Screen「設定」ボタンと「ホーム」ボタンは、 などの呼び出しで別の実装につながりますgame.setScreen(new HomeScreen())。そのメソッド内で、Screen引数はゼロのデルタ時間で更新されます。引数Screenの update メソッドも、ゲームのインスタンスのイベントからタッチ イベントをフェッチすることによって反復するUserInput場合、現在のイベント リストは、古い で反復されているものと同じではなくなりScreenます。修正は、 への呼び出しからすぐに戻ることsetScreen()です。タッチ処理を継続する必要はありません。

@Override
public void update(float deltaTime) {
    world.timer = world.timer + deltaTime;

    List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
    int len = touchEvents.size();

    for (int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);

        if (event.type == TouchEvent.TOUCH_UP) {
            if (touchingHomeButton(event)) {
                game.setScreen(new HomeScreen());
                return; // return immediately
        }
    }
}
于 2013-10-23T00:49:38.040 に答える