6

編集:コードから一歩離れたので、これは私にとってより理にかなっています。助けてくれてありがとう。

先日、Coding Horror でスタック オーバーフローを発見しましたが、すごいですね。私が現在解決しようとしている問題についてコミュニティに質問するとします。

midp 2.0 電話用の j2me を使用して、ローグライク ゲームを開発しています。プロジェクトはまだ開発の基本段階にあり、どのように機能するかを理解しています。私が現在立ち往生している部分は、スレッドに関係しています。

ゲームには、HaxCanvasGameCanvas を拡張するカスタム クラスがあり、Runnable を実装します。run メソッドが repaint() を呼び出してから 50 ミリ秒スリープするため、フレーム レートは 20 FPS になります。これにより、ゲームの残りの部分をどこにでも再描画する必要がなく、後でアニメーションや効果を簡単に作成できるようになります。(少なくとも理論的には)。

ゲームの流れは GameManager クラスによって制御されます。このクラスは、マップ上のすべての NPC をループし、プレイヤーの番になるまで順番を繰り返します。この時点で、プレイヤーが動き回ったり攻撃したりできるようにするための入力を取得する必要があります。gameManager.runUntilHeroTurn()私はもともと myのkeyPressedメソッドで呼び出していましたHaxCanvas。しかし、j2me システムスレッドを読んだ後、コールバックでしばらく実行される可能性のあるメソッドを配置するのは悪い考えであることに気付きました。getKeyStates()ただし、数字キーにアクセスする必要があり、これをサポートしていないため、入力処理には keyPressed を使用する必要があります。

ゲームループを独自のスレッドに配置しようとすると、災害が発生しました。ゲームが数ターン実行された後、スタック トレースのない奇妙な「キャッチされない ArrayIndexOutOfBoundsException」が表示されます。

だから私は私の質問はこれだと思います:

j2me の「ターン ベース」ゲームの場合、ゲーム ループを実装して、プレイヤーのターンのときにのみ入力処理を許可する最良の方法は何ですか?

4

2 に答える 2

5

j2me では特にユーザー入力をキャプチャする必要はありませんが、一般的な戦略は、入力を処理する時間まで入力をキューに入れることです。

input ---> queue <---> Manager(loop)

このようにして、デバッグ目的で入力をスクリプト化することもできます。

だから新スレはいらない。ユーザーがキーを押すたびに、それらをバッファに保存し、必要に応じてバッファの内容を処理します。プレイヤー バッファに入力がない場合、マネージャーはすべてのゲームプレイをスキップし、アニメーションを実行してから最初からやり直す必要があります (ゲームはアクション ゲームではないため)。

于 2009-02-26T05:44:01.927 に答える
3

ゲーム ロジックのスレッド化は避けたいと思います。J2ME スレッド化はもちろんメーカーによって異なりますが、限られたリソースをうまく共有できないからです。スレッドが重い処理を行っている間、一時停止することがよくあります。この場合、ユーザーに基本的な「読み込み中...」フィードバックを提供するだけなので、読み込みまたはネットワーク接続機能のスレッドのみをお勧めします。

これを処理するために、1 つのフレームで各 AI を更新するサブループはありません。run 関数で次のようなことを行います。

public void run() {
    while(true) {
        // Update the Game
        if(gameManager.isUsersTurn()) {
            // Collect User Input
            // Process User Input
            // Update User's State
        }
        else {
            // Update the active NPC based on their current state
            gameManager.updateCurrentNPC();
        }

        // Do your drawing
    }
}

1 つのフレームですべてが更新されることは避けたいと考えています。1) 更新が遅く、ユーザーにすぐに視覚的なフィードバックが得られない可能性があるためです。2) 個々の NPC がアクションを実行するときにアニメーション化することはできません。このセットアップでは、NPC の状態、NPC_DECIDE_MOVE および NPC_ANIMATING を使用でき、NPC の動作をさらに制御できます。NPC_ANIMATING は基本的に、アニメーションが完了するまでゲームを待機状態にし、アニメーションが完了するまでそれ以上の処理を回避します。その後、次の NPC のターンに進むことができます。

また、すべてを処理し、実行メソッドを薄く保つ gameManager.update() と gameManager.paint(g) (ペイントはペイントから呼び出されます) を用意するだけです。

最後に、flushGraphics() を調べましたか? GameCanvas では、通常、Graphics オブジェクトを作成し、それにすべてを描画してから、flushGraphics() を呼び出してから待機します。あなたが言及した方法は、 Canvas クラスでそれに取り組む方法です。これについて言及し、リンクを投稿すると思いました: Game Canvas Basics

于 2009-02-26T14:48:42.897 に答える