@Hovercraft で提案されているように、ゲーム API を使用する感覚はわかりますが、多くの単純なゲームではそれがなくても実行できると感じています。
@Guillaume の最初の 2 点には同意しますが、その後は別の方向に進む傾向があります。
ゲームを仮定しましょう:
- 固定サイズ (つまり、サイズ変更不可) です。
- その上にコンポーネントが表示されていません。
BufferedImage
その場合、ラベルに表示される でレンダリングを行う傾向があります。
特定の質問への回答
Swing JFrame を使用し、それを Graphics オブジェクトに追加する必要がありますか?
それはコンパイルされません。だから..いいえ。
最初にパネルを作成し、代わりにグラフィックを追加する必要がありますか?
それが基本的にギョームが提案していることですが、私は絵を描くためのキャンバスとして画像を使用することを好みます.
または、JPanel の代わりにキャンバスを使用する必要がありますか?
「キャンバス」が意味する場合はjava.awt.Canvas
、いいえ。
あなたが意味するならjava.awt.image.BufferedImage
、はい。
paint()
メソッドを使用するようにアドバイスする人もいれば、 paintComponent()
...
World Wild Web には古くて悪いコードがたくさんあるので、これはよくある混乱です。
オーバーライドが機能する唯一のコンポーネントは、やなどpaint(Graphics)
の AWT および Swing の最上位コンテナのコンポーネントです。JFrame
JApplet
JWindow
- AWT は、最後の千年紀の GUI コンポーネント ツールキットです。今世紀は Swing を使用する必要があります。
- GUI 全体がカスタム ペイントされることはまれです。代わりに、プレイヤーの健康状態、残りのライフ、スコアなどを報告する主要なコンポーネントとして追加される可能性があります。その (およびその他の) 理由から、「非トップレベル コンテナー」にレンダリングすることをお勧めします。
JComponent
またはでカスタム ペインティングを行いますJPanel
。
拡張パネルまたはコンポーネントでのカスタム ペイントの場合は、 をオーバーライドしますpaintComponent(Graphics)
。これが、これらのコンポーネントのカスタム ペイントを行う正しい方法です。
その他のヒント
ゲームの各オブジェクト ( Ship
、Enemy
、 などMissile
) は、自分自身を描画する方法を知っている必要があります。ペイント ルーチン内の各ゲーム要素への参照を保持し、ペイントするグラフィックスのインスタンスに対してgameElement.paint(Graphics)
(または) を呼び出すだけです。Graphics2D
ゲーム要素が Java-2D ベースのShape
インスタンスから描画される場合、またはShape
既存のスプライト イメージから を定義できる場合、衝突検出は簡単になります。詳細については、次を参照してください。
- 動的形状でマウス検出を取得するためのこの回答
- 複雑な形状の衝突検出に対するこの回答