11 ゲームを作ろう!

11.1 学習目標

11.2 キーボード入力の判定

11.2.1 キーコードの取得

key()命令を使うと、いま押されているキーボードの番号(キーコード)を 調べることができます。

次のプログラムは、車がキーにあわせて、上下左右に動くプログラムです。

リスト 11.2.1.1 HandleKey.java
  1: /**
  2:  * キーに対応して車が動くプログラム
  3:  * 
  4:  * Yoshiaki Matsuzawa
  5:  * 2003/06/23
  6:  */
  7: public class HandleKey extends Turtle {
  8: 
  9: 	//起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new HandleKey());
 12: 	}
 13:   
 14:   //タートルを動かす処理
 15: 	public void start() {
 16: 
 17:     hide();//タートルを消す
 18:     
 19:     int keycode;//キー番号を入れておく変数
 20:     int x;//x座標を入れておく変数
 21:     int y;//y座標を入れておく変数
 22: 		
 23:     //車を生成
 24:     ImageTurtle car = new ImageTurtle("car.gif");
 25:     
 26:     while (true) {
 27:       
 28:       // --- 待つ ---
 29:       sleep(0.1);
 30:       
 31:       // --- 処理 ---
 32:       
 33:       //今押されているキーを取得する
 34:       keycode = key();
 35:       
 36:       //車が今いる位置を取得する
 37:       x = car.getX();
 38:       y = car.getY();
 39:       
 40:       //上下左右キーが押されていたら,車を動かす
 41:       if (keycode == 37) { //左
 42:         car.warp(x - 5, y);
 43:       } else if (keycode == 38) { //上
 44:         car.warp(x, y - 5);
 45:       } else if (keycode == 39) { //右
 46:         car.warp(x + 5, y);
 47:       } else if (keycode == 40) { //下
 48:         car.warp(x, y + 5);
 49:       }
 50:       
 51:       // --- 再描画 ---
 52:       update();
 53:     }
 54:   }
 55:   
 56: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

キー入力を受け取る新しい命令
key()

いま押されているキーボードの番号(キーコード)を調べることができます。

何も押されていない時は、キーコードが -1 になります。

11.2.2 キーコードを調べる

キーボードのキーに対応するキーコードを調べるには、 次のプログラムを使うと良いでしょう。

リスト 11.2.2.1 CheckKeycode.java
  1: /**
  2:  * キー番号を調べるプログラム
  3:  * 
  4:  * Yoshiaki Matsuzawa
  5:  * 2003/06/23
  6:  */
  7: public class CheckKeycode extends Turtle {
  8: 
  9: 	//起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new CheckKeycode());
 12: 	}
 13:   
 14:   //タートルを動かす処理
 15: 	public void start() {
 16: 
 17:     hide();//タートルを消す
 18:     
 19:     int keycode;//キー番号を入れておく変数
 20:     
 21:     //文字(太郎)を生成
 22:     TextTurtle taro = new TextTurtle();
 23:     
 24:     while (true) {
 25:       
 26:       // --- 待つ ---
 27:       sleep(0.1);
 28:       
 29:       // --- 処理 ---
 30:       
 31:       //今押されているキーを取得する
 32:       keycode = key();
 33:       
 34:       //押されているキー番号を文字にして表示する
 35:       taro.text(keycode);
 36:       
 37:       // --- 再描画 ---
 38:       update();
 39:     }
 40:   }
 41:   
 42: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

11.3 マウス入力の判定

11.3.1 マウスの位置を調べる

mouseX()、mouseY() 命令を使うと, マウスが今どこにいるのかを調べることができます。

下のプログラムは、マウスの位置に車が移動するプログラムです。

リスト 11.3.1.1 HandleMouse.java
  1: /**
  2:  * マウスの位置に車が動くプログラム
  3:  * 
  4:  * Yoshiaki Matsuzawa
  5:  * 2003/06/23
  6:  */
  7: public class HandleMouse extends Turtle {
  8: 
  9: 	//起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new HandleMouse());
 12: 	}
 13:   
 14:   //タートルを動かす処理
 15: 	public void start() {
 16:     
 17:     hide();//タートルを消す
 18:     
 19:     int mx;//マウスのx座標を入れておく変数
 20:     int my;//マウスのy座標を入れておく変数
 21:     
 22:     //車を生成
 23:     ImageTurtle car = new ImageTurtle("car.gif");
 24:     
 25:     while (true) {
 26:       
 27:       // --- 待つ ---
 28:       sleep(0.1);
 29:       
 30:       // --- 処理 ---
 31:       
 32:       //車をマウスの位置に移動
 33:       mx = mouseX();//マウスのx座標を取得する
 34:       my = mouseY();//マウスのy座標を取得する
 35:       car.warp(mx, my);
 36:       
 37:       // --- 再描画 ---
 38:       update();
 39:     }
 40:     
 41:   }
 42:   
 43: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

マウスの位置を調べる新しい命令
mouseX()
マウスのx座標を取得します。
mouseY()
マウスのy座標を取得します。

x()、y()、mouseX()、mouseY()命令で取得した座標は, わざわざ変数に入れなくても、そのまま他の命令で使う値として使うこともできます。

リスト 11.3.1.2 HandleMouse2.java
  1: /**
  2:  * マウスの位置に車が動くプログラム
  3:  * (変数省略版)
  4:  * 
  5:  * Yoshiaki Matsuzawa
  6:  * 2003/06/23
  7:  */
  8: public class HandleMouse2 extends Turtle {
  9: 
 10: 	//起動処理
 11: 	public static void main(String[] args) {
 12: 		Turtle.startTurtle(new HandleMouse2());
 13: 	}
 14:   
 15:   //タートルを動かす処理
 16: 	public void start() {
 17:     
 18:     hide();//タートルを消す
 19:     
 20:     //車を生成
 21:     ImageTurtle car = new ImageTurtle("car.gif");
 22:     
 23:     while (true) {
 24:       
 25:       // --- 待つ ---
 26:       sleep(0.1);
 27:       
 28:       // --- 処理 ---
 29:       
 30:       //車をマウスの位置に移動
 31:       car.warp(mouseX(), mouseY());
 32:       
 33:       // --- 再描画 ---
 34:       update();
 35:     }
 36:     
 37:   }
 38:   
 39: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

11.3.2 マウスが押されているかどうか調べる

mouseDown()命令を使うと、マウスが押されているか調べることができます。 mouseX()、mouseY() 命令と組み合わせて使うと、どこで押されているかも調べられます。

下のプログラムは、マウスをクリックした所に車が移動するプログラムです。

リスト 11.3.2.1 HandleMouse3.java
  1: /**
  2:  * マウスの押した位置に車が動くプログラム
  3:  * 
  4:  * Yoshiaki Matsuzawa
  5:  * 2003/06/23
  6:  */
  7: public class HandleMouse3 extends Turtle {
  8: 
  9: 	//起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new HandleMouse3());
 12: 	}
 13:   
 14:   //タートルを動かす処理
 15: 	public void start() {
 16:     
 17:     hide();//タートルを消す
 18:     
 19:     //車を生成
 20:     ImageTurtle car = new ImageTurtle("car.gif");
 21:     
 22:     while (true) {
 23:       
 24:       // --- 待つ ---
 25:       sleep(0.1);
 26:       
 27:       // --- 処理 ---
 28:       
 29:       //もし,マウスが押されていたら,
 30:       if (mouseDown()) {
 31:         car.warp(mouseX(), mouseY());//車をマウスの位置に移動
 32:       }
 33:       
 34:       // --- 再描画 ---
 35:       update();
 36:     }
 37:     
 38:   }
 39:   
 40: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

マウス入力を調べる新しい命令
mouseDown()
いまマウスが押されているかどうかを調べます。 必ず、if文の条件文の中に書いて下さい。

11.3.3 マウス入力を詳しく調べる

マウスボタンの左右や、ダブルクリックを調べる場合は, 次のようなプログラムを書きます。

リスト 11.3.3.1 HandleMouse4.java
  1: /**
  2:  * マウスの押した位置に車が動くプログラム
  3:  * (右クリック,左クリック判定版)
  4:  * 
  5:  * Yoshiaki Matsuzawa
  6:  * 2003/06/23
  7:  */
  8: public class HandleMouse4 extends Turtle {
  9: 
 10: 	//起動処理
 11: 	public static void main(String[] args) {
 12: 		Turtle.startTurtle(new HandleMouse4());
 13: 	}
 14:   
 15:   //タートルを動かす処理
 16: 	public void start() {
 17:     
 18:     hide();//タートルを消す
 19:     
 20:     //車を生成
 21:     ImageTurtle car = new ImageTurtle("car.gif");
 22:     
 23:     while (true) {
 24:       
 25:       // --- 待つ ---
 26:       sleep(0.1);
 27:       
 28:       // --- 処理 ---
 29:       
 30:       //もし,左マウスボタンが押されていたら,
 31:       if (leftMouseDown()) {
 32:         car.warp(mouseX(), mouseY());//車をマウスの位置に移動
 33:       }
 34:       //もし,右マウスボタンがダブルクリックされたら,
 35:       if (rightMouseDown() && doubleClick()) {
 36:         car.show(!car.isShow());//車を(現す/隠す)
 37:       }
 38:       
 39:       // --- 再描画 ---
 40:       update();
 41:     }
 42:     
 43:   }
 44:   
 45: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

マウス入力を詳しく調べる新しい命令
leftMouseDown()
いまマウスの左ボタンが押されているかどうかを調べます。 必ず、if文の条件文の中に書いて下さい。
rightMouseDown()
いまマウスの右ボタンが押されているかどうかを調べます。 必ず、if文の条件文の中に書いて下さい。
doubleClick()
マウスがダブルクリックされたかどうかを調べます。 必ず、if文の条件文の中に書いて下さい。

11.4 あたり判定

11.4.1 2つのオブジェクトのあたり判定

intersects()命令を使うと、2つのオブジェクトが当たっているかどうか、 調べることができます。

下のプログラムは、車がドラえもんに当たると、ドラえもんが小さくなるプログラムです(マウスで車を動かせます)。

リスト 11.4.1.1 IntersectsJudge.java
  1: /**
  2:  * あたり判定をするプログラム
  3:  * (車がドラえもんにあたると,ドラえもんが小さくなる)
  4:  * 
  5:  * Yoshiaki Matsuzawa
  6:  * 2003/06/23
  7:  */
  8: public class IntersectsJudge extends Turtle {
  9: 
 10: 	//起動処理
 11: 	public static void main(String[] args) {
 12: 		Turtle.startTurtle(new IntersectsJudge());
 13: 	}
 14:   
 15:   //タートルを動かす処理
 16: 	public void start() {
 17:     
 18:     hide();//タートルを消す
 19:     
 20:     //車を生成
 21:     ImageTurtle car = new ImageTurtle("car.gif");
 22:     //doraという名前のドラえもんを生成
 23:     Doraemon dora = new Doraemon();
 24: 
 25:     car.warp(200, 200);//車を移動
 26:     
 27:     while (true) {
 28:       
 29:       // --- 待つ ---
 30:       sleep(0.1);
 31:       
 32:       // --- 処理 ---
 33:       
 34:       //もし,マウスが押されていたら,
 35:       if (mouseDown()) {
 36:         car.warp(mouseX(), mouseY());//車をマウスの位置に移動
 37:       }
 38: 
 39:       //もし,どらえもんが車に当たっていたら
 40:       if (dora.intersects(car)){
 41:         dora.small(5);//ドラえもんを小さくする
 42:       }
 43:       
 44:       // --- 再描画 ---
 45:       update();
 46:     }
 47:     
 48:   }
 49:   
 50: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

あたり判定に関する新しい命令
intersects([判定相手のオブジェクト])
オブジェクトが、指定された判定相手のオブジェクトと当たっているかどうか調べます。必ず、if文の条件文の中に書いて下さい。

11.4.2 座標とオブジェクトのあたり判定

2つのオブジェクトのあたり判定でなく、マウスの位置が、オブジェクトと当たっているか判定したい時があります。

下のプログラムは、マウスが車の上に来る(マウスの座標が車の領域に含まれる)と、車が小さくなるプログラムです。

リスト 11.4.2.1 ContainsJudge.java
  1: /**
  2:  * マウスのあたり判定をするプログラム
  3:  * (マウスが車にあたると,車が小さくなる)
  4:  * 
  5:  * Yoshiaki Matsuzawa
  6:  * 2003/06/23
  7:  */
  8: public class ContainsJudge extends Turtle {
  9: 
 10: 	//起動処理
 11: 	public static void main(String[] args) {
 12: 		Turtle.startTurtle(new ContainsJudge());
 13: 	}
 14:   
 15:   //タートルを動かす処理
 16: 	public void start() {
 17:     
 18:     hide();//タートルを消す
 19:     
 20:     //車を生成
 21:     ImageTurtle car = new ImageTurtle("car.gif");
 22:     
 23:     while (true) {
 24:       
 25:       // --- 待つ ---
 26:       sleep(0.1);
 27:       
 28:       // --- 処理 ---
 29: 
 30:       //もし,車がマウスの位置に含まれていたら
 31:       if (car.contains(mouseX(), mouseY())){
 32:         car.small(5);//車を小さくする
 33:       }
 34:       
 35:       // --- 再描画 ---
 36:       update();
 37:     }
 38:     
 39:   }
 40:   
 41: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

座標とオブジェクトのあたり判定に関する新しい命令
contains([x座標], [y座標])
オブジェクトが指定された座標内に含まれているかどうか調べます。必ず、if文の条件文の中に書いて下さい。

11.5 課題

11.5.1 簡単なゲームを作ろう

これで,このテキストの内容はすべておしまいです。 ここまでの内容を駆使して、面白いソフトウエアを作ってくださることを期待します。

やってみよう!

プレイヤーの画像を用意し、キーボードの矢印(↑→←↓)キーを使って、プレイヤーを上下左右に操作するプログラムを作りましょう。

プレイヤーの画像は、ネットのフリー素材集などから好みのものを探し、ダウンロードして使ってください。

やってみよう!

アイテム(画像タートル)と得点板(テキストタートル)をつくり、プレイヤーを操作してアイテムを取る(アイテムに触れる)と得点が増えるプログラムを作りましょう。

アイテムの画像は、ネットのフリー素材集などから好みのものを探し、ダウンロードして使ってください。

やってみよう!

自由な発想で、簡単なオリジナルゲームを作りましょう。

最後に、シューティングゲームのサンプルプログラムを贈ります。操作方法はプログラムを読めばわかります。GOOD LUCK!

リスト 11.5.1.1 ShootingGame.java
  1: /**
  2:  * シューティングゲーム
  3:  * 
  4:  * Yoshiaki Matsuzawa
  5:  * 2003/06/23
  6:  */
  7: public class ShootingGame extends Turtle {
  8: 
  9: 	//起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new ShootingGame());
 12: 	}
 13:   
 14:   //タートルを動かす処理
 15: 	public void start() {
 16:     
 17:     hide();//タートルを消す
 18:     
 19:     //画面の調整
 20:     window.size(640, 480);
 21:     window.warp(100, 100);
 22: 
 23:     int score; //得点を入れる変数
 24:     
 25:     //キャラクターの生成
 26:     Star enemy = new Star();    //enemyという名前の星を生成
 27:     Doraemon player = new Doraemon();    //playerという名前のドラえもんを生成
 28:     Circle bullet = new Circle();    //bullet(弾)という名前の円を作成
 29: 
 30:     //得点板の生成
 31:     TextTurtle scoreBoard = new TextTurtle(); //scoreBoardという名前のTextTurtleを生成
 32: 
 33:     //弾を適切な大きさに調整
 34:     bullet.size(20, 20);
 35: 
 36:     //キャラクターの位置を調整
 37:     enemy.warp(200, 100);
 38:     player.warp(320, 350);
 39:     bullet.warp(-100, -100);//弾は最初見えない位置に置いておく
 40: 
 41:     //得点板の位置を調整
 42:     scoreBoard.warp(600, 50);
 43: 
 44:     //得点を初期化
 45:     score = 0;
 46:     
 47:     while (true) {
 48:       
 49:       // --- 待つ ---
 50:       sleep(0.025);
 51:       
 52:       // --- 処理 ---
 53: 
 54:       //敵を動かす(流れ星と一緒)
 55:       enemy.warp(enemy.x() + 5, enemy.y());
 56:       enemy.rt(10);
 57: 
 58:       //もし,敵が右端だったら
 59:       if(enemy.x() > 640){
 60:         enemy.warp(0, enemy.y());//左端にワープ
 61:       }
 62:       
 63:       //ドラえもんを左右に動かす
 64:       if (key() == 37) { //左
 65:         player.warp(player.x() - 5, player.y());
 66:       } else if (key() == 39) { //右
 67:         player.warp(player.x() + 5, player.y());
 68:       }
 69: 
 70:       //上が押されたら,
 71:       if (key() == 38){
 72:         //弾を出す(弾をドラえもんと同じ位置にする)
 73:         bullet.warp(player.x(), player.y());
 74:       }
 75: 
 76:       //弾を上に動かす
 77:       //(見えなくても,上に動かしつづける)
 78:       bullet.warp(bullet.x(), bullet.y() - 5);
 79: 
 80:       //もし,弾が敵に当たっていたら
 81:       if (bullet.intersects(enemy)){
 82:         score++;//得点を増やす
 83:       }
 84: 
 85:       //得点板の数字を更新
 86:       scoreBoard.text(score);      
 87:       
 88:       // --- 再描画 ---
 89:       update();
 90:     }
 91:     
 92:   }
 93:   
 94: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。