Java ゲーム プログラミング

シューティングゲームを作ってみようの連載3回目です。自機クラスを左右に移動できるよう改造します。



自機を動かす!!

このページには、以下のサンプルを掲載しています。 下の項目をクリックをすると各サンプルにジャンプします。 ※2週間以内の新着記事はNewアイコン、更新記事はUpアイコンが表示されます。

前回は、自機の表示位置を指定できるようにしました。今回は、ユーザーのキー入力に応じて自機を左右に移動できるように改造します。 まず、自機クラスの方に右に移動する機能と左に移動する機能を加えます。表示位置を右にずらせば右方向に移動、 左にずらせば左方向に移動するようになります。
■自機クラス 自機オブジェクト左右移動機能追加改造 (Gun.java)
  1. public class Gun {
  2.   private Polygon p;
  3.   public Gun() {
  4.     int[] xlist = {  0,  0,  8, 13, 18, 26, 26,  0 };
  5.     int[] ylist = { 15,  5,  5,  0,  5,  5, 15, 15 };
  6.     p = new Polygon(xlist, ylist, xlist.length);
  7.   }
  8.   public Gun(int x, int y ) {
  9.     this();
  10.     for (int i=0; i < p.xpoints.length; i++ ) {
  11.       p.xpoints[i] += x;
  12.       p.ypoints[i] += y;
  13.     }
  14.   }
  15.   public void draw(Graphics2D g2) {
  16.     g2.setColor(Color.YELLOW);
  17.     g2.fill(p);
  18.     g2.setColor(Color.BLACK);
  19.     g2.draw(p);
  20.   }
  21.   public void moveLeftGun() {
  22.     for (int i=0; i < p.xpoints.length; i++ ) {
  23.       p.xpoints[i] -= 5;
  24.     }
  25.   }
  26.   public void moveRightGun() {
  27.     for (int i=0; i < p.xpoints.length; i++ ) {
  28.       p.xpoints[i] += 5;
  29.     }
  30.   }
  31.   public void setGun(){
  32.   }
  33. }

赤字部分が前回からの改造部分になります。
右に移動する機能(moveRightメソッド)と左に移動する機能(moveLeftメソッド)は、すでに前回処理の中身を空にして作っておいたので、実際にどのような処理を行うのかを記述します。
右に移動する機能では、自機を表すPolygonオブジェクトの全てのx座標に5を加算しています。(27行目〜29行目)
この加算した数値が一回の呼び出しで移動する量になります。ここでは、5ドットずつ右に移動するようにしていますが、 この数値を1にすれば1ドットずつ移動するし10にすれば10ドットずつ移動します。 ただし、あまり数値を大きくすると飛び飛びな動きになってしまいます。同様に左への移動も自機を表すPolygonオブジェクトの操作で行います。(33行目〜35行目)
左移動のときは、x座標を減算していきます。下の図は、自機を左右移動する時のx座標への加減算のイメージ図です。

これで、自機の左右移動ができるようになりました。ただ、このままでは、ユーザーからの入力を受け付けていませんので、 アプレットクラスにユーザーからのキー入力を受け付けるよう改造します。
赤字部分が前回からの変更点です。
■アプレットクラス 自機オブジェクト左右移動機能追加改造 (ShootGame.java)
  1. package sample.game;
  2. import java.awt.Graphics;
  3. import java.awt.Graphics2D;
  4. import java.awt.event.KeyEvent;
  5. import java.awt.event.KeyListener;
  6. import javax.swing.JApplet;
  7. public class ShootGame extends JApplet implements KeyListener {
  8.   public Gun gun = new Gun(87, 180);
  9.   public void init() {
  10.     addKeyListener(this);
  11.   }
  12.   public void paint(Graphics g) {
  13.     Graphics2D g2 = (Graphics2D)g;
  14.     g2.clearRect(0,0,getWidth(), getHeight()); 
  15.     gun.draw(g2);
  16.   }
  17.   public void update(Graphics g){
  18.     paint(g);
  19.   }
  20.   public void keyPressed(KeyEvent e) {
  21.     if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
  22.       gun.moveRightGun();
  23.     } else if (e.getKeyCode() == KeyEvent.VK_LEFT ) {
  24.       gun.moveLeftGun();
  25.     }
  26.     repaint();
  27.   }
  28.   public void keyReleased(KeyEvent e) {
  29.   }
  30.   public void keyTyped(KeyEvent e) {
  31.   }
  32. }

ユーザーからのキー入力を受け付けるためにKeyEventクラスとKeyListenerクラスを利用するので、それぞれのクラスをインポートします。(5、6行目)
キー入力機能を追加するためにKeyListenerクラスをimplementsします。(10行目)

KeyListenerクラスは、ユーザーからキー入力があった場合に登録したクラスに通知します。KeyListenerへの登録は、KeyListenerをimplementsしたクラスを指定します。
ここでは、アプレットクラス自身にKeyListenerをimplementsしていますので、thisを指定しています。(14行目〜16行目)
ユーザーからの入力には、キー入力の他にマウスなどの入力がありますが、マウスの入力の場合は、MouseListener、MouseMotionListerなどがあります。 これらについては、当講座の別の機会に解説する予定です。
KeyListenerをimplementsした場合は、下記のメソッドを追加する必要があります。
・public void keyPressed(KeyEvent e) … キーを押しているときに呼び出されます。(28行目〜35行目)
・public void keyReleased(KeyEvent e) … キーを離したときに呼び出されます。(37行目〜39行目)
・public void keyTyped(KeyEvent e) … キーを入力しているときに呼び出されます。(41行目〜43行目)
28行目〜35行目のkeyPressedメソッドの中でキーを押している時の処理を記述しています。 if文で右矢印キー(→)が押されたのか左矢印キー(←)を判定しています。右矢印キー(→)が押された場合は、前述の自機クラスに追加したメソッドmoveRightを呼び出しています。 左矢印キー(←)を押した場合は、moveLeftメソッドを呼び出しています。
e.getKeyCodeでユーザーが入力したキーコードを取得してKeyEvent.VK_RIGHT(右矢印キー(→)のキーコードを表す)または、KeyEvent.VK_LEFT(左矢印キー(←)のキーコードを表す)と比較して 同じだったら自機クラスのmoveRightメソッドまたは、moveLeftメソッドを呼び出しています。
下記のボタンを押すと前述プログラムを実行してみることが出来ます。
※実行は、別ウィンドウで開きます。実行には時間がかかることがありますのでご注意ください。


次回の記事は、1月中旬ごろに掲載する予定です。お楽しみに(^^;



最終更新日:2019/02/13

2015-03-01からの訪問者数
  5155 人