サードパーティのライブラリなしでJavaゲームを作成する、パート1





導入と準備





こんにちはhabrozhiteli。 この投稿は、サンドボックス用の私の投稿の書き直しです。 今回は、それよりも多くのことをカバーしようとします。



なぜjava


ここでは客観的なことは何も言いませんが、この言語が大好きだと言うだけで、それを書くのが好きです。 はい、JavaにはAAAクラスのゲームはありませんが、Javaは優れた機能、より多くの組み込みツール、およびより高速なコード記述を提供します。



IDE


IDEを選択することから始めましょう。 私はEclipseのファンであり、アドバイスをします。

何らかの理由で気に入らなかった場合は、NetBeans、Intellij IDEA、またはコマンドラインとお気に入りのエディターを使用できます。



Jdk


最新バージョンのJDKをダウンロードします。JDK7u4



IDEのインストールに問題はほとんどありませんが、64ビットシステムをお持ちの場合は、32ビットEclipseをインストールすることをお勧めします。エラーが発生し、Eclipseが起動しない場合があるためです。



カットの下で、ゲームの作成を開始します。





ゲームクラス



そのため、プロジェクトを作成し、その中にGameクラスを作成します(同時にエントリポイントを作成します)。 このクラスはCanvasクラスを継承し、Runnableインターフェイスを実装する必要があります。



public class Game extends Canvas implements Runnable { private static final long serialVersionUID = 1L; public void run() { // run   ,    "implements Runnable" } public static void main(String[] args) { } }
      
      







ブール型の実行変数を作成してみましょう。これは、推測したとおり、ゲームが実行されているかどうかを示します。



start()関数を作成し、その中で新しいスレッドを作成して、runningをtrueに設定します。



 public void start() { running = true; new Thread(this).start(); }
      
      







更新(長いデルタ)、レンダリング()、および初期化()の3つの関数を作成しましょう。 それらの意味を理解していただければ幸いです。 run()関数で、メインゲームループを作成してから、init()を呼び出し、その中でrender()とupdate()を呼び出します。 また、フレーム間の差(デルタ時間)も計算します。



 public void run() { long lastTime = System.currentTimeMillis(); long delta; init(); while(running) { delta = System.currentTimeMillis() - lastTime; lastTime = System.currentTimeMillis(); update(delta); render(); } } public void init() { } public void render() { } public void update(long delta) { }
      
      







とりあえず、render()関数に取り組みましょう。



 public void render() { BufferStrategy bs = getBufferStrategy(); if (bs == null) { createBufferStrategy(2); // BufferStrategy    requestFocus(); return; } Graphics g = bs.getDrawGraphics(); // Graphics    BufferStrategy g.setColor(Color.black); //  g.fillRect(0, 0, getWidth(), getHeight()); //  g.dispose(); bs.show(); // }
      
      







おそらく、開始して試すのを待つことはできませんが、急いではいけません。 フレームを作成し、それにキャンバスを追加する必要があります。 同時に、3つの変数を宣言します。



 public static int WIDTH = 400; // public static int HEIGHT = 300; // public static String NAME = "TUTORIAL 1"; //  public static void main(String[] args) { Game game = new Game(); game.setPreferredSize(new Dimension(WIDTH, HEIGHT)); JFrame frame = new JFrame(Game.NAME); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //      ESC frame.setLayout(new BorderLayout()); frame.add(game, BorderLayout.CENTER); //     frame.pack(); frame.setResizable(false); frame.setVisible(true); game.start(); }
      
      











これが 、現在のGameクラスの外観です。



スプライトクラス





新しいSpriteクラスを作成します。 このクラスは小さいので、すぐにすべてのコードにコメントを付けます:



 import java.awt.Graphics; import java.awt.Image; public class Sprite { private Image image; // public Sprite(Image image) { this.image = image; } public int getWidth() { //   return image.getWidth(null); } public int getHeight() { //   return image.getHeight(null); } public void draw(Graphics g,int x,int y) { //  g.drawImage(image,x,y,null); } }
      
      







すぐにパフォーマンスを確認してください。 この写真を撮り、Spriteクラスのあるフォルダーにコピーします。 getSprite()関数をGameクラスに(一時的に)追加します。







 public Sprite getSprite(String path) { BufferedImage sourceImage = null; try { URL url = this.getClass().getClassLoader().getResource(path); sourceImage = ImageIO.read(url); } catch (IOException e) { e.printStackTrace(); } Sprite sprite = new Sprite(Toolkit.getDefaultToolkit().createImage(sourceImage.getSource())); return sprite; }
      
      







アセットフォルダーに画像を追加し(プロジェクトのルートにフォルダーを作成します)、フォルダー自体をビルドパスに追加する必要があります。



次に、タイプSpriteのヒーロー変数を作成します。 init()関数で、それを初期化します。 render()関数で、描画します:



 // "" public static Sprite hero; // init() hero = getSprite("man.png"); // render()  g.fillRect(0, 0, getWidth(), getHeight()); hero.draw(g, 20, 20);
      
      







結果:







すべてのGame.javaコード



入力



入力を処理するために、KeyAdapterを継承するクラスを作成します。



 private class KeyInputHandler extends KeyAdapter { }
      
      





Gameクラスのヘッダーで2つの変数をすぐに宣言します。



 private boolean leftPressed = false; private boolean rightPressed = false;
      
      







KeyInputHandlerクラス内で、2つの関数を作成します。



 public void keyPressed(KeyEvent e) { //  if (e.getKeyCode() == KeyEvent.VK_LEFT) { leftPressed = true; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { rightPressed = true; } } public void keyReleased(KeyEvent e) { //  if (e.getKeyCode() == KeyEvent.VK_LEFT) { leftPressed = false; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { rightPressed = false; } }
      
      







次に、init()関数で、次を追加します。



 addKeyListener(new KeyInputHandler());
      
      







ヒーローのx変数とy変数を作成します(まだEntityクラスを作成していないため)。 主人公にこれらの座標を常に描画させましょう。



 private static int x = 0; private static int y = 0; hero.draw(g, x, y);
      
      





そして、今度はupdate()関数で、キーが押されているかどうかを確認し、x座標を変更します。



 public void update(long delta) { if (leftPressed == true) { x--; } if (rightPressed == true) { x++; } }
      
      











彼は動いています!



ご清聴ありがとうございました。



PS githubへのリンク



All Articles