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