サードパーティのライブラリなしで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へのリンク

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


All Articles