導入と準備
こんにちは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へのリンク