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の続き

Source: https://habr.com/ru/post/J326032/


All Articles