Javaゲームプログラミング

シューティングゲームを作ってみようの連載4回目です。弾を表示できるように改造します



弾の表示

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

前回は、ユーザーのキー入力に応じて自機を左右に移動できるように改造しました。今回は、弾の発射。。。といきたいところですが、 まずは、弾を表示してみましょう。ユーザがスペースキーを押した場合、自機のいる場所に弾を表示するようにします。
それでは、まず、弾のクラスを作ってみましょう
■弾クラス (Bullet.java)
  1. import java.awt.Color;
  2. import java.awt.Graphics2D;
  3. import java.awt.Rectangle;
  4. import java.awt.geom.Ellipse2D;
  5. public class Bullet {
  6.   private Ellipse2D bullet;
  7.   private Rectangle r = new Rectangle(8,-15,10,15);
  8.   public Bullet() {
  9.     bullet = new Ellipse2D.Double();  
  10.     bullet.setFrame(r);
  11.   }
  12.   public Bullet(int x, int y ) {
  13.     this();
  14.     r.x += x;
  15.     r.y += y;
  16.     bullet.setFrame(r);
  17.   }
  18.   public void draw(Graphics2D g2) {
  19.     g2.setColor(Color.YELLOW);
  20.     g2.fill(bullet);
  21.     g2.setColor(Color.BLACK);
  22.     g2.draw(bullet);
  23.   }
  24. }

大まかな構成は、自機クラス(Gun.java)と同じです。自機クラスでは、自機をPolygonクラスで描画していましたが、弾クラス(Bullet.java)では、 Ellipseクラスで描画しています。Polygonクラスは、多角形を描画するときに使いますが、Ellipseクラスでは、円、楕円を描画するときに使います。
次は、自機クラスへの改造です。
■自機クラス 自機の位置情報を取得するメソッドを追加 (Gun.java)
  1. import java.awt.Color;
  2. import java.awt.Graphics2D;
  3. import java.awt.Point;
  4. import java.awt.Polygon;
  5. public class Gun {
  6.   private Polygon p;
  7.   
  8.   public Gun() {
  9.     int[] xlist = {  0,  0,  8, 13, 18, 26, 26,  0 };
  10.     int[] ylist = { 15,  5,  5,  0,  5,  5, 15, 15 };
  11.     p = new Polygon(xlist, ylist, xlist.length);
  12.   }
  13.   public Gun(int x, int y ) {
  14.     this();
  15.     for (int i=0; i < p.xpoints.length; i++ ) {
  16.       p.xpoints[i] += x;
  17.       p.ypoints[i] += y;
  18.     }
  19.   }
  20.   public void draw(Graphics2D g2) {
  21.     g2.setColor(Color.YELLOW);
  22.     g2.fill(p);
  23.     g2.setColor(Color.BLACK);
  24.     g2.draw(p);
  25.   }
  26.   public void moveLeftGun() {
  27.     for (int i=0; i < p.xpoints.length; i++ ) {
  28.       p.xpoints[i] -= 5;
  29.     }
  30.   }
  31.   public void moveRightGun() {
  32.     for (int i=0; i < p.xpoints.length; i++ ) {
  33.       p.xpoints[i] += 5;
  34.     }
  35.   }
  36.   
  37.   public void setGun(){
  38.     
  39.   }
  40.   public Point getGun(){
  41.     return new Point(p.xpoints[0],p.ypoints[0]);
  42.   }
  43. }

ユーザがスペースキーを押したとき自機の位置に弾を表示するために自機の位置情報を取得する必要があります。 そこで、自機の位置を取得するためのメソッドを追加しています。(上記サンプルプログラム赤字部分)
次は、アップレットクラスへの改造です。赤字部分が前回からの修正部分になります。
■アプレットクラス 自機オブジェクト弾の表示機能追加改造 (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 Bullet bullet;
  10.   public void init() {
  11.     addKeyListener(this);
  12.   }
  13.   public void paint(Graphics g) {
  14.     Graphics2D g2 = (Graphics2D)g;
  15.     g2.clearRect(0,0,getWidth(), getHeight()); 
  16.     gun.draw(g2);
  17.     if ( bullet != null ) {
  18.       bullet.draw(g2);
  19.     }
  20.   }
  21.   public void update(Graphics g){
  22.     paint(g);
  23.   }
  24.   public void keyPressed(KeyEvent e) {
  25.     if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
  26.       gun.moveRightGun();
  27.     } else if (e.getKeyCode() == KeyEvent.VK_LEFT ) {
  28.       gun.moveLeftGun();
  29.     } else if (e.getKeyCode() == KeyEvent.VK_SPACE ) {
  30.       bullet = new Bullet(gun.getGun().x, gun.getGun().y);
  31.     }
  32.     repaint();
  33.   }
  34.   public void keyReleased(KeyEvent e) {
  35.   }
  36.   public void keyTyped(KeyEvent e) {
  37.   }
  38. }
13行目で、弾クラスのオブジェクトを格納するための変数を用意しています。23行目〜25行目で、弾オブジェクトの表示をしています。 弾オブジェクトは、ユーザがスペースキーを押すまでは、存在していないので弾オブジェクト変数は空となっています。23行目では、弾オブジェクト変数が 空でないかどうかをチェックしています。空でなかった場合、描画処理を行います。37行目〜39行目でユーザがスペースキーを押したときの処理を記述しています。 スペースキーを押した場合、弾オブジェクトを生成して弾オブジェクト変数に格納しています。 下記のボタンを押すと前述プログラムを実行してみることが出来ます。
※実行は、別ウィンドウで開きます。実行には時間がかかることがありますのでご注意ください。




最終更新日:2019/02/13

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