Javaコラム Javaエンジニアのためのお役立ちコラム

Javaで手軽にゲームを作ろう!

 
Javaで手軽にゲームを作ろう!
SE
Javeではゲームも作成できるのですね。
PM
AndroidスマートフォンではJavaで多くのゲームが作られています。簡単なゲームプログラミングを解説しますので、この機会に知っておくのも良いでしょう。

Javaのゲームとは?


プログラミングを始める動機として「ゲームを作りたい!」と言う人は多いでしょう。AndroidスマートフォンではJavaで多くのゲームが作られています。今回はAndroidではなく、PC上で動く手軽なJavaのゲームプログラミングを解説します。

ゲームプログラミングではグラフィック描画処理やマウス入力処理が必要になりますが、JavaではAWTとSwingというGUI(グラフィックユーザインターフェイス)が標準で利用できます。Java FXという後継のGUIもありますが、Scene Builderのインストールが追加で必要になるので、今回は使用しません。

もぐらたたきのソース

今回はゲーム入門で良く作られる、もぐらたたきをJavaで作ってみましょう。以下がゲームのJavaソースです。後の方で解説をしています。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JFrame;

public class MainClass extends JFrame {
private final static int WINDOW_SIZE = 300;
private final static int MOLE_SIZE = 50;
private final static int GAME_END_COUNT = 20;

private int score = 0;
private int counter = 0;
private int mole_x;
private int mole_y;
private boolean mole_hit = false;

public static void main(String[] args) {
new MainClass();
}

public MainClass() {
setSize(WINDOW_SIZE, WINDOW_SIZE);

// リスナー
GameMouseAdapter adapter = new GameMouseAdapter();
addMouseListener(adapter);

setVisible(true);

Timer t = new Timer();
t.schedule(new GameTimeTask(), 1000l, 1000l);
}

private class GameTimeTask extends TimerTask {
@Override
public void run() {
if (counter++ <= GAME_END_COUNT) return; // ゲームオーバー
mole_hit = false; // 新しいモグラなのでヒット前
mole_x = (int)(Math.random() * (WINDOW_SIZE-MOLE_SIZE));
mole_y = (int)(Math.random() * (WINDOW_SIZE-MOLE_SIZE));
repaint();
}

}

private class GameMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (mole_hit) return; // モグラがやられている時は判定しない
int x = e.getPoint().x;
int y = e.getPoint().y;
int hankei = MOLE_SIZE/2;
int mx = mole_x+hankei;
int my = mole_y+hankei;
int x_kyori = x-mx;
int y_kyori = y-my;
if (x_kyori*x_kyori+y_kyori*y_kyori < hankei*hankei) {
score++;
mole_hit = true;
}
// 描画する
repaint();
}
}

public void paint(Graphics g) {
g.drawImage(drawScreen(), 0, 0, this);
}

private Image drawScreen() {
Image screen = createImage(WINDOW_SIZE, WINDOW_SIZE);
Graphics2D g = (Graphics2D)screen.getGraphics();

// スコア表示
g.setColor(Color.BLACK);
g.drawString(“”SCORE:”” + score, 50, 50);

if (counter<=GAME_END_COUNT) {
g.drawString(“”GAME OVER””, 100, 100);
return screen;
}

// モグラ描画
if (mole_hit)
g.setColor(Color.RED);
else
g.setColor(Color.YELLOW);
g.fillOval(mole_x, mole_y, MOLE_SIZE, MOLE_SIZE);
g.setColor(Color.BLACK);
g.drawOval(mole_x, mole_y, MOLE_SIZE, MOLE_SIZE);

return screen;
}
}

初期処理について

MainClassはSwingのJFrameのサブクラスになっています。こうすることでAWT/Swingの描画処理やマウス入力機能を使うことができます。最初にmainメソッドで自分自身をnewで生成すると、MainClassのコンストラクタの処理が行われます。

コンストラクタではまずsetSizeでウィンドウのサイズを決めています。その後、GameMouseAdapterという自身のインナークラスをリスナーにセットしています。こうすることでマウスをクリックした時にGameMouseAdapterの処理を呼ばせることができます。

モグラを登場させる

次にsetVisible(true)で自分自身を見えるようにして、Timerのscheduleで自身のインナークラスのGameTimeTaskの処理を定期的に実行するようにしています。 1000l, 1000lとしていますが、これは1000ミリ秒(1秒)後に、1000ミリ秒毎にGameTimeTaskの処理を実行するという意味です。

そのGameTimeTaskではrunが1000ミリ秒毎に繰り返し実行されます。このrunでは新しいモグラを登場させています。mole_xとmole_yはモグラの座標で、Math.random()でランダムな場所に登場させています。1秒毎にバラバラな場所にモグラが登場するというわけです。GAME_END_COUNT(20)回登場したら、ゲーム終了にしています。

最後にrepaintを呼んでいます。これでウィンドウを再描画することで新しいモグラが現れます。

マウスのクリック処理

GameMouseAdapterのmouseClickedはウィンドウがクリックされた時に呼び出されます。モグラは円形のため、モグラの中心座標とクリック位置の座標から、横の距離の2乗+縦の距離の2乗<モグラの半径の2乗、という式でマウスのクリック位置がモグラの円の中かどうかを判定しています。

モグラの円の内側をクリックしていると判定した場合はスコアを加算して、mode_hitフラグをtrueにします。これがtrueの時はモグラがやられている状態です。新しいモグラが出てきたときはfalseに初期化されています。

最後にrepaintを呼んでいますが、これはクリックされた時にすぐに描画させるためです。

描画処理

paintというメソッドはrepaintが呼ばれた時に実行されます。drawScreenメソッドが返したImageクラスのインタンスを、drawImageで描画しています。drawScreenではまずスコアを表示して、ゲームオーバーであればGAME OVERと表示してそれで終わります。

ゲーム中であればモグラを描画します。mole_hitがtrueならばモグラがやられているので赤く、そうでなければ黄色にします。fillOvalで黄色く塗った円を描いて、黒い線の円を描くdrawOvalで黒縁を付けて見栄えを良くします。

以上が描画処理です。

SE
もぐらたたきゲームでのゲームプログラミングを理解できました。
PM
Javeでのゲーム作成は意外と簡単です。プログラミング学習のモチベーションが下がってしまったときなどに取り組んでみてください。

Javaのゲームプログラミングは意外と簡単!

Javaで作るゲームについて解説しましたが、ご理解頂けましたでしょうか。意外と簡単に出来ることが分かったと思います。ゲームはそれ自体が楽しいので、Javaのプログラミング学習のモチベーションを高めるのに最適です。是非取り組んでください。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags