ゲームの裏側を覗いてみよう

1
ゲームの裏側を覗いてみよう
東北文化学園大学 知能情報システム学科 鈴木伸夫
ようこそ! コンピュータのゲームを一度も遊んだことが無い、という人はまずいないと思
います。今日はそのゲームの裏側‐プログラム‐を覗いてみましょう。今日は「オチモ
ノ系シューティング」がどんな感じで作られているかを覗いてみることにします。
まずは難しいことは抜きにしてゲームを実行 してみましょう。画面の左上付近にある
緑の矢印アイコンをクリックしてみます。
なにやらショボイ画面が出てきましたが・・・なにを隠そう今日作成するゲーム本体な
のであります
2
画面下側にある黒い長方形が「自機」です。自機は左右の矢印キーで動かすことができま
す。
ルール:
「赤」はよけると得点でぶつかると減点
「青」はぶつかると得点でよけると減点です
「青」にぶつかると耐久力(HitPoint)が増える。
「赤」にぶつかると耐久力が減ります。耐久力が 0 になるとゲームオーバー。
では、気持を集中して・・・スペースキーでスタート!
・・・いかがだったでしょうか?音もでないし長方形が表示されるだけの単純なものです
が・・・でもこれでも立派なシューティングゲームの「原型」なんです。長方形の自機か
わりに可愛い猫の絵に変えて、青色の長方形にネズミの絵を、赤は犬の絵にして、ぶつか
ったときに「ニャ~ン♪」と音がでたとしたら立派なゲームになると思いませんか?(今回
は絵を描くのがメンドウなので実に質素ではありますが^^;)
では、ゲームを動かしているプログラムを見ていきましょう。
3
ゲームの流れの部分
model.playerMove(leftKey,rightKey) : ここで矢印キーに対応して自機を動かす。
model.hitCheck(): ここで自機と敵がぶつかっているか判断。
model.scrollMove():ここで敵を下に動かす。
model.clearEnemy():画面外に落ちた敵を消去。
model.createEnemy():敵が減った分だけ新しい敵を作る。
repaint():画面を書き直す。
4
命中判定
enemies が enemys になっているのは御愛嬌^^;
if(……)の部分が命中判定です。ちょっとわかりにくいですけど、敵と自機がぶつかる条件
は、
1. 自機の左側より敵の右側が「右」にある。(playerLeft < enemyRight)
2. 自機の上側より敵の下側のほうが「下」にある。(playerUp < enemyDown)
3. 自機の右側より敵の左側のほうが「左」にある。(playerRight > enemyLeft)
4. 自機の下側より敵の上側のほうが「上」にある。(playerDown > enemyUp)
以上が全て満たされたとき「ぶつかった」となります。
5
画面のスクロールと敵コマの消去
6
UnitModel.java の方から。
void clearEnemy()が敵が画面の下に落ちたときに敵を消す操作しています。
scrollMove()が画面のスクロールです。ここでは Unit.java の scrollMove()を使っているの
でそちらも見てみましょう。
y += speedY;
とある部分が敵を下に動かしている部分です。これは現在の位置(y)にスピード分(speedY)
だけ追加してね、という意味です。例えば speedY が 5 ならば、5 ドット分下に落ちること
んになります。だから、敵は一定のスピードで下に落ちてくるわけです。
その下になにやら意味ありげな行(緑色の部分)がありますね。
// speedY++;
ここから「//」を削除してみてください。
speedY++;
となって色が黒色に変化するはずです。これはスピードを 1 増やしてね、という意味です。
では修正したら敵の動きがどう変わるか見てみましょう。
7
プレイヤーを動かす部分と新しく敵を発生させる部分
createEnemy()の部分が敵を発生させているところです。一つの画面に何個発生させるかが、
enemyMax = 1 + (score/5);
の部分です。これはスコアが 5 増えるたびに敵が一つずつ増えるよ、という意味です。難
易度を落したいときは
enemyMax = 1 + (score/10);
のように分母を大きくすると敵の増えるスピードが減ります。分母を減らせば・・・どう
なるかは自明ですよね?
8
敵の大きさとかスピードをランダムにしてみる。
敵の動きも大きさもワンパターンだとすぐ飽きてしまいますので、もうすこしランダムな
感じにしてみます。
Enemy.java には敵の属性が指定されています。
x と y :敵の最初の位置。
width:敵の大きさ(幅)
height:敵の大きさ(高さ)
speedY:敵の動くスピード
こいつをランダムにしてみましょう。下に緑色になっている 3 行の部分がありますので、
「//」
を消してみます。
9
width = (int)(Math.random()*20)+10
height = (int)(Math.random()*20)+10
speedY = (int)(Math.random()*20)+5
Math.random()は 0 以上 1 未満の間でランダムな数字を発生させるという意味です。です
から
(int)(Math.random()*20)+10
とは、10 から 29 までの数字を発生させることになります。数字をいろいろ変えてみて、ど
んな敵が現れるか確かめてみましょう。
青と赤の比率を変えてみる。
青が出る確率を下げると難しくなります。青と赤の発生は
if( Math.random() > 0.9){
point = 1; //これは青色ね
} else {
point = -1 //これは赤色ね
}
の部分で決めています。この 0.9 というのが赤の出る確率を表わしています。ここを 0.95
と大きくすると(でも 1 以上にしてはダメ)より赤色だらけになります。
おまけ:
今日のプログラムは次のページに全部載せてみました。初めての方には少々長いかもしれ
ませんが、このぐらいの長さのプログラムでゲームは作れちゃうんです。興味がある人は
無料でコンパイラ(プログラム作成用のソフトです)が手に入ります。(私が学生の頃は数万
円(有料!!)でした。良い時代になりましたね・・・)。
今日のツール(eclipse)はここからダウンロードできます(無料!!)。ここの Eclipse3.7 Indigo
の Java(JRE あり)です。
http://mergedoc.sourceforge.jp/
Java の本家サイトは以下の URL です。
http://www.java.com/ja/
Eclipse の本家サイトは以下の「Eclipse IDE for Java developers」です(英語ですけどねぇ)。
http://www.eclipse.org/downloads/