0

私は Java の経験があり、Swing (フォーム タイプのアプリ) を少し使ったことがありますが、それ以上のパワーを必要としたことは一度もないので、GUI に関してフードの下で何が起こっているかについてはあまり知りません。これが、私が行ってきた少しの読書から得たものです。きっとオフです。

スペース インベーダー タイプのゲームを作成するにあたり、私が考えた 2 つのアプローチは次のとおりです。

  1. すべてのインクリメンタル ペイントとレイヤリング用に 1 つの大きなコンポーネントとコードを作成します。
  2. テキストと画像を含む JLayeredPane にネストされた絶対配置の JPanel の束を作成し、再描画が必要な可能性があるものだけで repaint() を呼び出します。次に、paintComponent() をオーバーライドします (以前のコンテンツが自動的にクリアされるかどうかは不明です)。私が読んだところによると、これにより、画面全体を再描画することなく、コンポーネントのレイヤー化と再描画が処理されます。

これは正しいです?もしそうなら、どの方法がプロジェクトに適していますか?

4

2 に答える 2

3

Java でのゲーム プログラミングに関して本当に考慮すべきことの 1 つは、Active Rendering に切り替えることです。

ご存じのとおり、Swing はイベント ディスパッチ スレッドと呼ばれる別のスレッドでレンダリングを処理します。これはパッシブ レンダリングとして知られています。これは、独自のビジュアル コンポーネントを実際にレンダリングするのではなく、アプリの外観をユーザーが定義し、必要なときに Swing が実際に描画するためです。

ゲームは通常フル スクリーン モードで動作し、多くの場合、「いつ」、「どのように」、「何を」描画するかをより詳細に制御する必要があります。これをアクティブ レンダリングと呼びます。この場合、Even Dispatch Thread を無効にして、自分でレンダリングを行う必要があります。

ゲームは多くの場合、大きなループ内で動作するため、すべてが理にかなっています。ゲームループの一例は次のとおりです。

  1. 入力データの取得 (キーボード、ジョイスティックなど)
  2. ネットワーク通信(クライアントサーバーゲームの場合)
  3. 入力データに従ってロジックを処理します。(最終的に、これはユーザーが指示したときにゲームが終了することにつながります)。
  4. ゲームのステート マシンを更新します。
  5. 新しい状態に従ってシーンを再描画します
  6. ループを再開します。

多くの情報源がありますが、それを明確にするために最初に読むことをお勧めします:パッシブ vs アクティブ レンダリング

于 2012-06-22T19:40:57.863 に答える
2

あなたのアプローチに関するいくつかの考え

最初のアプローチは、描画全体に単一の VolatileImage を使用できるため、おそらくパフォーマンスが向上します。ただし、すべてのレイヤーを自分で処理する必要があるため、2 番目のアプローチよりも複雑であることは間違いありません。

2番目のアプローチは、あなたが述べた理由だけでなく、マウスが画面上の特定の「スプライト」に入ったときにハンドルのようなことをする必要がある場合、JavaのJPanel実装によって自動的に与えられるためです。とはいえ...スペースインベーダーのクローンは通常、キーボードで制御されるため、この機能を実際に使用するかどうかはまったく別の話です.

要するに...私は通常、paint()パラダイムでこの種のことをすることになります。ペイントをレイヤー化することは、特にスペース インベーダーのような単純なものの場合はそれほど難しくありませんVolatileImage。バック バッファーとして使用する場合は、パフォーマンスの向上が容易になります。

他の考え

他の人が言っているように、スイングで一貫した「フレーム レート」を取得するのは困難です。なぜなら、何かがレンダリングされる「タイミング」を制御できないためです。これは、コードに対して非同期に実行される EDT によって決定されます。EDT に依存することにした場合はSwingTimer、レンダリングに を使用してみてください。レンダリングと更新を基礎となるゲームの状態と適切に同期するように特に注意してください。

于 2012-06-22T19:49:33.780 に答える