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(??, ??)
オブジェクトが座標(??, ??)に含まれているかどうか調べます。必ず,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: }

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