Comments
Description
Transcript
ゲームの裏側を覗いてみよう
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/