2009-02-26 14 views
6

編集:これはコードから一歩踏み出したので、今私にはもっと意味をなさない。j2me "ターンベース"ゲームのためのGameloop

先日、コーディングホラーでスタックオーバーフローが検出されました。すばらしく見えます。私が現在取り組もうとしている問題についてコミュニティに聞いてみよう。

midp 2.0携帯電話用のj2meを使用して、roguelike sortofゲームを開発しています。このプロジェクトは、それがどのように機能するかを把握するために、まだ開発の基本段階にあります。私が現在取り組んでいる部分はスレッディングと関係があります。

GameCanvasとImplements runnableを継承するカスタムHaxCanvasクラスがあります。実行メソッドはrepaint()を呼び出してから50msの間スリープし、フレームレートは20FPSになります。これにより、どこにでも塗り替えを行うことなく残りのゲームを書くことができ、後でアニメーションやエフェクトを簡単にする必要があります。 (少なくとも理論的には)。

ゲームの流れはGameManagerクラスによって制御されます。GameManagerクラスは、マップ上のすべてのNPCを順番に巡回し、それがプレーヤーの順番になるまでループします。この時点で、私はプレイヤーが移動したり、攻撃したりするための情報を得る必要があります。私はもともとHaxCanvaskeyPressedメソッドでgameManager.runUntilHeroTurn()と呼んでいました。しかし、J2MEのシステムスレッドを読んだあと、コールバックで潜在的に実行可能なメソッドを置くことは悪い考えです。しかし、私は数字キーにアクセスする必要があるので、私は入力ハンドリングを行うためにkeyPressedを使う必要があり、getKeyStates()はこれをサポートしていません。

ソファ私のゲームルップを自分のスレッドに入れようとした私の試みは、災害をもたらしました。スタックトレースのない奇妙な "キャッチされていないArrayIndexOutOfBoundsException"は、ゲームが数回実行された後に表示されます。

は、だから私は私の質問はこれであるとしますJ2MEの「ターンベースの」ゲームのために

、それはプレイヤーのターンだときの入力だけhandelingを可能に、ゲームループを実施するための最良の方法は何ですか?

+0

ところで、良い質問。 +1 – Fostah

答えて

3

もちろん、製造元によっては、限られたリソースを共有するという素晴らしい仕事をしていないため、J2MEスレッドとしてのゲームロジックのスレッディングは避けています。スレッドが重い処理をしている間は、ポーズが頻繁に見られます。この場合、ユーザーに基本的な「読み込み中...」というフィードバックを与えるだけなので、読み込み専用またはネットワーク接続機能用のスレッドのみを推奨します。

これを処理するために、1つのフレーム内の各AIを更新するサブループはありません。することができます)

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 
    } 
} 

あなたはすべてがユーザー2のための即時の視覚的なフィードバックが得られ、更新が遅くなるかもしれません)1として、1つのフレーム内で更新されないようにしたい:私は、実行機能で、次のような何かをするだろう彼らが行動するごとに個々のNPCをアニメーション化します。この設定では、NPCの状態をさらに制御できるNPC_DECIDE_MOVEとNPC_ANIMATINGというNPC状態を持つことができます。 NPC_ANIMATINGは基本的に、アニメーションが完了するまでそれ以上の処理を避けるために、アニメーションが行われる待機状態にゲームを置きます。その後、次のNPCのターンに進むことができます。

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

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

5

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

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

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

関連する問題