Javaで2Dゲームを書く

すべての人に良い一日を!



この記事では、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の続き



All Articles