シューティングゲーム制作|Javaから楽しく学ぶ!ゲームプログラミング専門学校

Javaから楽しく学ぶ!ゲームプログラミング専門学校

ゲームプログラミングとはその名のとおりゲームのプログラムを作ることを指します。『Javaから楽しく学ぶ!ゲームプログラミング専門学校』ではゲームプログラミングについて、実際にゲームプログラムをJAVAプログラミング言語を使用し、作成していきながら詳しく解説していきます。

シューティングゲーム制作

Javaでシューティングゲームを作成してみます。

まずはプログラム動作の流れを簡単にまとめておきます。

Javaアプレットが読み込まれたらまず、デモ画面を表示し、デモ画面上でスペースキーを押下するとゲームを開始させるようにします。
ゲームが開始されると、画面上部から黒い丸が順次発現します。
青い丸を操作し黒い丸を全てかわすことができればゲームクリアとします。
また、ゲーム途中、青い丸が黒い丸と少しでも重なったらゲームオーバーとします。
ゲームクリアあるいは、ゲームオーバーとなったらデモ画面に戻ります。

今回はメインクラスである『shooting』クラスと
自機(青い丸)の情報を管理する『Jiki』クラス、
全ての敵機(黒い丸)の情報を管理する『EnemyInfo』クラス、
敵機単体を管理する『Enemy』クラス
を、用意します。

『Jiki』クラスと『Enemy』クラスは、『Machine』抽象クラスを継承します。

さらに、敵機の発現ポイントなどの情報を管理する『Stage』クラスを用意します。

合計5個のクラスと、1個の抽象クラスで構成します。


サンプルコードは下記からダウンロードできます。
シューティングゲームサンプルコード


それではソースコードの主要部分を解説します。
    public void gameStart(){
/* 敵機管理クラスのインスタンス生成 */
enemyInfo = new EnemyInfo(screenWidth, screenHeight);

/* 自機クラスのインスタンス生成 */
jiki = new Jiki(screenWidth, screenHeight);

/* ステージクラスのインスタンス生成 */
stage = new Stage();
if(stage.openSeqFile("stage1.txt") == true){
gameConfig = GAME_CONFIG_PLAYING;
keyPressDown = false;
keyPressUp = false;
keyPressLeft = false;
keyPressRight = false;
sleepCount = 1;
running = true;
gameThread = new Thread(this);
gameThread.start();
}else{
System.out.println("read err");
}
}

上記は『shooting』クラスのgameStartメソッドの実装内容です。
gameStartメソッドは、デモ画面上でスペースキーを押下すると呼び出され、ゲーム開始処理を行います。
敵機管理クラス、自機クラス、ステージクラスのインスタンス生成を行い、ステージクラスのインスタンスにより、シーケンスファイルを開きます。
シーケンスファイルには、敵機の発現ポイントなどの情報が含まれており、この情報を基に敵機を発現させていきます。

今回はシーケンスファイルに、
<コマンド> <コマンドに対する引数>

というフォーマットでコマンドを記載しています。

コマンドの種類は、
enemyコマンド
sleepコマンド
endコマンド
の、3つです。

各コマンドのフォーマットは下記になります。
enemy <敵機発現ポイントのX座標> <敵機発現ポイントのY座標>
sleep <敵機発現停止時間>
end

サンプル
enemy 168 0
enemy 232 0
sleep 50
enemy 232 0
enemy 168 0
enemy 128 0
sleep 100
end


このようにプログラム内部にではなく、プログラム外部(シーケンスファイル)に上記のような情報を持たしておくことで、ゲームの難易度を調整したいときなどに、わざわざコンパイル作業を行う必要がなくなります。



    public void keyPressed(KeyEvent e){
switch(gameConfig){
case GAME_CONFIG_DEMO:
case GAME_CONFIG_CLEAR:
if(e.VK_SPACE == e.getKeyCode()){
this.gameStart();
}
case GAME_CONFIG_PLAYING:
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:
if(!keyPressDown){
keyPressDown = true;
}
break;
case KeyEvent.VK_UP:
if(!keyPressUp){
keyPressUp = true;
}
break;
case KeyEvent.VK_LEFT:
if(!keyPressLeft){
keyPressLeft = true;
}
break;
case KeyEvent.VK_RIGHT:
if(!keyPressRight){
keyPressRight = true;
}
break;
}
}
}
public void keyReleased(KeyEvent e){
switch(gameConfig){
case GAME_CONFIG_PLAYING:
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:
keyPressDown = false;
break;
case KeyEvent.VK_UP:
keyPressUp = false;
break;
case KeyEvent.VK_LEFT:
keyPressLeft = false;
break;
case KeyEvent.VK_RIGHT:
keyPressRight = false;
break;
}
}
}

上記はキーが押されると呼ばれるkeyPressedメソッドとキーが放されると呼ばれるkeyReleasedメソッドの実装内容です。
ゲーム中に、↑↓←→キーのいずれかが押されると、そのキーに対応するフラグを立てて起きます。
キーが放されるとフラグを下ろします。



    Hashtable enemy;   //敵機クラスのインスタンスを格納するハッシュテーブル

………

}

/* 敵機生成メソッド */
public void setEnemy(int x, int y){
Integer en;
en = new Integer(enemyNumber);
enemy.put(en, new Enemy(x, y, screenWidth, screenHeight, en.intValue()));
enemyNumber += 1;
}

『EnemyInfo』クラスのメソッドのひとつであるsetEnemyメソッドの実装内容です。
setEnemyメソッドは、新しく敵機を生成するときに呼び出されます。

敵機単体が持つ情報は『Enemy』クラスで管理するようにしています。
新しく敵機を生成する場合は、その『Enemy』クラスのインスタンスを生成します。

『Enemy』クラスのインスタンスはハッシュテーブルによって管理します。
ハッシュテーブルによって敵機を管理することで、敵機の追加、削除の処理を容易に実現させます。



シューティングゲームのサンプル説明はひとまずここまでにしておきます。

さて、このサンプル、自機からミサイルやビームといった攻撃機能が実装されていません。
ですので、まだシューティングゲームとは呼べない内容となっています。

敵機の動きも上から下へ直進するだけとなっており、おもしろくありません。

サンプルはここまでにしておきますが、ここからさらにゲーム性を高めるための工夫を考えてみてください。

トラックバック:0Edit
Copyright © Javaから楽しく学ぶ!ゲームプログラミング専門学校 All Rights Reserved.
当サイトのテキストや画像等すべての転載転用・商用販売を固く禁じます