この記事では、Javaでの2Dゲームの作成について説明します。 各行を詳細に説明する時間がないため、少なくともJava言語の基本的な知識が必要であることをすぐに警告します。 そして、私はあなたに懇願します。単にコードを書き留めるのではなく、各行が何を意味するのかを理解し、意味を持って書き込もうとします。 それでも、私はEclipseを使用していますが、どのIDEでも使用できます。
チャレンジ:
3人の視点を持つシューティングゲームに似たゲームを作成する予定です。
開始:
さあ、始めましょう!
まず、プロジェクトを作成します。 それを「ゲームだけ」と呼びましょう。 そして、すぐにクラスDisplay.javaを作成します。 書き込みます:
public static void main(String[] args) { JFrame frame = new JFrame(/* */); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true); frame.setVisible(true); }
それでは、私たちが何をしたかを理解しましょう。
JFrame frame = new JFrame(/* */);
ゲームの開始時に表示されるフレームを作成します
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
十字をクリックすると発生する操作を設定します。 EXIT_ON_CLOSE-プログラムを終了します
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true);
フレームを最大サイズに設定し、装飾を削除します(最小化、閉じる、縮小/拡大ボタンなど)。 ゲームをフルスクリーンにします。 ゲームを全画面表示にしない場合は、次を使用します。
frame.setSize(/**/,/**/); frame.setResizable(false); //false , true -
frame.setVisble(true);
-フレームを表示する
フレームのすべての設定は、表示する前に書き込む必要があることを忘れないでください。
それでは、「実行」をクリックしてゲームを実行してみます。 すべてが正しく書き込まれていれば、エラーは発生せず、空の灰色のウィンドウが表示されます。
灰色のウィンドウ...退屈です...もっと面白いものを作成しましょう。
「Main」という新しいクラスを作成します。 メインクラスはフレームに挿入するパネルなので、JPanelを拡張する必要があります。 (知らない人のために、extendはクラス名の後にextendsとして書かれています)
フレームを設定した後でもDisplayクラスに戻りますが、可視性を設定する前に次のように記述します。
frame.add(new Main());
あなたは尋ねます-「さて、なぜこれをしたのですか?」 絵を想像してください。 この写真は究極のゲームです。 フレームを想像してください。 内部に何もなければ、ただの空のフレーム。 その上に何も描くことができません、それは役に立たないです。 これを行うために、空のシートを画像に挿入しました。これにより、プログラムは将来画像を描画できます。 これで、叙情的な余談は終わり、メインクラスに戻ります。
レンダリングする必要があるため、paintメソッドを追加する必要があります。 このために次のように記述します。
public void paint(Graphics g) { // }
まず、このメソッド内に線画を書くことができます。 このために次のように記述します。
g.drawLine(20, 20, 100, 100);
ここでプログラムを実行し、以下を参照してください。
ええ、あまりない...
絵を描いてみましょう。 例えばこれは:
開始するには、画像へのパスを指定する必要があります。 このために、paintメソッドではなく、次のように記述します。
Image img = new ImageIcon("2.png").getImage();
(最初に、プロジェクト内の画像を破棄して、2.pngという名前を付ける必要があります)
その後、線を描画するための線を削除し、代わりにpaintメソッドに書き込みます。
g.drawImage(img, 0, 0, null);
頻繁に触れるので、drawImageメソッドを詳しく見てみましょう。
drawImage(先ほど発表した、描く絵、絵を描くX座標、絵を描くY座標、ペイント);
ペイントパラメータについても説明したいと思います。 何よりも、nullのままにしてください。 ペンキを使う必要があるときに一度だけ出会った。 これは、テキストをレンダリングし、フォントサイズをそれに設定したときです。 しかし、私はそこに行ってnullを使用しないことをお勧めします。
ここでプログラムを実行し、以下を参照してください。
彼女は何か小さいですか? サイズを増やす方法を学びましょう。 drawImage()にパラメーターを追加して、結果を確認します。
g.drawImage(img, 0, 0, 1920, 1080, null);
今何を追加しましたか? これらの2つのパラメーターは、画像を1920と1080の座標に引き伸ばします。画像が全画面であることがわかります。 プログラムを実行してチェックしてみましょう。
判明した:
さて、最後に。 これで、任意の写真をフルスクリーンに拡大できます。 しかし、ここに問題があります。 paintメソッドは1回だけ呼び出されます。 そして、それを絶えず更新する方法は? これには非常に便利なものがあります-タイマーです。 作成しましょう。
このために次のように記述します。
Timer timer = new Timer(20, this);
(20は、タイマーが更新される頻度です。これは、タイマーを更新するときにメソッドを実行する場所です
これは、クラス定義行の直後に入力する必要があります。 後:
public class Main extends JPanel{
また、この方法でクラス定義行を補足する必要があります。
public class Main extends JPanel implements ActionListener{
この行を書いた後、クラス名に赤の下線を引く必要があります。 これを修正するには、クラスの最後にメソッドを追加します:
@Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub }
このメソッドは、タイマーが更新されると実行されます。 その中にrepaint()を書かなければなりません。 タイマーが更新されるたびに、すべての要素が消去され、再び描画されます。
次に、タイマーを開始する必要があります。 これを行うには、Mainクラスのコンストラクターを作成して書き込みます。
timer.start();
その後、何も変更されないため、プログラムを実行できません。 家のテクスチャをマップの通常のテクスチャに置き換えましょう。 自分で描くか、私から試用版をコピーすることができます:
とにかく、画像のサイズは任意で、そのサイズはプログラムで直接調整されます。 そうそう、コンピューターのアクセス許可は異なる場合があるため、コンストラクターに次のものを追加します。
public Main(JFrame frame) { timer.start(); this.frame = frame; }
そして、コンストラクターを追加する前に:
JFrame frame;
そして、Display.javaクラスに移動し、frame.addメソッドを少し変更します。
frame.add(new Main(frame));
したがって、フレームはMain.javaクラスに渡されます。 このクラスに移動し、paint()メソッドがある場所で、行drawImage()を次のように変更します。
g.drawImage(img, 0, 0,frame.getWidth(), frame.getHeight(), null);
したがって、解像度に関係なく、ゲームは画像を全画面でレンダリングします。 以下を開始します。
今日は以上です。 混乱している人のためにコードを残します:
Display.java
import javax.swing.JFrame; public class Display { public static void main(String[] args) { JFrame frame = new JFrame("JustGame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true); frame.add(new Main(frame)); frame.setVisible(true); } }
Main.java
import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class Main extends JPanel implements ActionListener{ Image img = new ImageIcon("2.png").getImage(); Timer timer = new Timer(20, this); JFrame frame; public Main(JFrame frame) { this.frame = frame; } public void paint(Graphics g) { g.drawImage(img, 0, 0,frame.getWidth(), frame.getHeight(), null); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub repaint(); } }
ご清聴ありがとうございました!
habrahabr.ru/post/326302の続き