3

LunarLander API デモを使用して、Android 用の RPG に取り組んでいます。私はすでにこのデモを使用してゲームを作成しているので (Porcupine Assassin、チェックしてみてください!)、Canvas クラスとその性質についてよく理解しています。

私の問題は、RPG ではインベントリや統計などにアクセスする方法が必要なことです。そのため、Inventory.java クラスを開始するように [戻る] ボタンを設定しました。インベントリ アクティビティを終了()してゲーム (SurfaceView) に戻ろうとすると、問題が発生します。

これは SurfaceCreated() コールバックです。

public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}

「IllegalThreadStateException: thread already started」が原因で FC が発生していたので、SurfaceCreated() コールバックに try/catch を入れました。try/catch では FC は発生しませんが、黒い画面に戻ります。

try/catch を取り出して、最初にチェックを追加してみました: if(!thread.isAlive())。そうすれば、スレッドがすでに開始されている場合、何もしません。奇妙なことに、同じ FC の「スレッドが既に開始されています」を取得したため、thread.isAlive() は false を返したに違いありません.. ??

API からの onWindowFocusChanged() メソッドもあります。

@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
    if (!hasWindowFocus) thread.pause();
    else thread.setState(STATE_RUNNING);
}

私はこのゲームの側面にかなり熱心で、RPG の基礎のほとんどをレイアウトしました。しかし、私の頭を悩ませているのは、このすべての Android/Java のことです。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

4

これは、終了したスレッドを再起動しようとしているために、.IsAlive() が false を返したためです。LunarLander のバグや違法なスレッドなどをグーグルで検索すると、この問題に関するドキュメントがたくさんあります。

私が一度見つけた1つの可能な回避策はこれでした:

    public void surfaceCreated(SurfaceHolder holder) {
        if (thread.getState() == Thread.State.TERMINATED) {
            thread = new CascadeThread(getHolder(), getContext(), getHandler());
            thread.setRunning(true);
            thread.start();
        }
        else {
            thread.setRunning(true);
            thread.start();
        }

ここで完全なドキュメントを見つけることができます

于 2010-10-08T21:22:15.987 に答える