4

私はJavaとプログラミング全般に不慣れで、宇宙船とエイリアンを使った小さなシューティングゲームを書こうとしていますが、グラフィックスに多くの問題があります. いろいろな種類の成分を混ぜているようです。

どうすればいいですか?
- Swing を使用してオブジェクトJFrameに追加する必要がありますか? - 最初にパネルを作成し、代わりにグラフィックを追加する必要がありますか? - または、JPanel の代わりにキャンバスを使用する必要がありますか?Graphics

多くのオプションがあり、ネットで答えを検索すると、非常に混乱します。paint()メソッドを使用するようにアドバイスする人もいれば、 paintComponent()...

グラフィックスを配置する正しい順序で推奨される方法は何ですか?また、どのクラスを使用する必要がありますか?

4

4 に答える 4

5

シリアスゲームの場合は、Swingを使用せず、LWJGLなどの他のゲーム固有のGUIライブラリを使用してください。単純なゲームの場合、Swingは問題ありませんが、描画方法に関する前提条件を変更する必要がある場合があるため、最初にグラフィックチュートリアルを必ずお読みください(私の場合はそうです)。たとえば、Graphicsクラスフィールドは使用しませんが、通常はJComponentのpaintComponentメソッドで受動的に描画します。

于 2013-02-02T22:41:24.097 に答える
5

単純なゲームの場合、Swingは問題なく、次のことに頼ることができます。

  1. Swingを使用して、AWTを忘れてください。はるかに少ないコードではるかに良い結果が得られます。
  2. スイングタイマーを使用してゲームのペースを調整します
  3. コンポーネントごとに、を拡張JComponentまたはJPanelオーバーライドしますpaintComponent。描画操作のみを実行します(paintComponentモデルを更新したり、コンポーネントの状態を変更したりしないでください)。
  4. 何かを描きたいときはいつでも、コンポーネントの状態を変更してから呼び出すrepaint()
  5. レイヤーを処理するには、いつでも使用できますJLayeredPane
于 2013-02-02T22:42:23.693 に答える
2

@Hovercraft で提案されているように、ゲーム API を使用する感覚はわかりますが、多くの単純なゲームではそれがなくても実行できると感じています。

@Guillaume の最初の 2 点には同意しますが、その後は別の方向に進む傾向があります。

ゲームを仮定しましょう:

  1. 固定サイズ (つまり、サイズ変更不可) です。
  2. その上にコンポーネントが表示されていません。

BufferedImageその場合、ラベルに表示される でレンダリングを行う傾向があります。

特定の質問への回答

Swing JFrame を使用し、それを Graphics オブジェクトに追加する必要がありますか?

それはコンパイルされません。だから..いいえ。

最初にパネルを作成し、代わりにグラフィックを追加する必要がありますか?

それが基本的にギョームが提案していることですが、私は絵を描くためのキャンバスとして画像を使用することを好みます.

または、JPanel の代わりにキャンバスを使用する必要がありますか?

「キャンバス」が意味する場合はjava.awt.Canvas、いいえ。
あなたが意味するならjava.awt.image.BufferedImage、はい。

paint()メソッドを使用するようにアドバイスする人もいれば、 paintComponent()...

World Wild Web には古くて悪いコードがたくさんあるので、これはよくある混乱です。

オーバーライドが機能する唯一のコンポーネントは、やなどpaint(Graphics)の AWT および Swing の最上位コンテナのコンポーネントです。JFrameJAppletJWindow

  • AWT は、最後の千年紀の GUI コンポーネント ツールキットです。今世紀は Swing を使用する必要があります。
  • GUI 全体がカスタム ペイントされることはまれです。代わりに、プレイヤーの健康状態、残りのライフ、スコアなどを報告する主要なコンポーネントとして追加される可能性があります。その (およびその他の) 理由から、「非トップレベル コンテナー」にレンダリングすることをお勧めします。JComponentまたはでカスタム ペインティングを行いますJPanel

拡張パネルまたはコンポーネントでのカスタム ペイントの場合は、 をオーバーライドしますpaintComponent(Graphics)。これが、これらのコンポーネントのカスタム ペイントを行う正しい方法です。

その他のヒント

ゲームの各オブジェクト ( ShipEnemy、 などMissile) は、自分自身を描画する方法を知っている必要があります。ペイント ルーチン内の各ゲーム要素への参照を保持し、ペイントするグラフィックスのインスタンスに対してgameElement.paint(Graphics)(または) を呼び出すだけです。Graphics2D

ゲーム要素が Java-2D ベースのShapeインスタンスから描画される場合、またはShape既存のスプライト イメージから を定義できる場合、衝突検出は簡単になります。詳細については、次を参照してください。

  1. 動的形状でマウス検出を取得するためのこの回答
  2. 複雑な形状の衝突検出に対するこの回答
于 2013-02-03T03:19:43.923 に答える
1

私はコースプロジェクトのためにゲームのようなロストバイキングを実装する必要があり、それを行う方法が1つもわからず、まったく同じ質問を念頭に置いていました。

最終的に、さまざまな要素(つまり、敵を描画するためのメソッド、ミサイルを描画するためのメソッドなど)を描画するメソッドを作成し、paint()メソッドでそれらを呼び出しました。メインループでrepaint()メソッドを呼び出して、すべてを再描画しました。

これが良い習慣かどうかはわかりませんが、うまくいきました。ここでコードを確認できますが、これは「いまいましい、私はそれを成し遂げなければならない」プロジェクトであることを警告する必要があります。特にGameFrame.javaを確認する必要があります。

于 2013-02-02T23:27:56.410 に答える