Javaゲームプログラミング ---スマホ対応版---

シューティングゲームを作ってみようの連載8回目です。敵機クラスを定義します。
- Page 8 -
  先頭のページ
  前のページ
  次のページ
  最後のページ



敵機出現

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

今回からは、いよいよ敵機が出現します。
弾クラスと同じように敵機クラスを追加します。
アプレットクラスには、敵機クラスの追加に伴い敵機オブジェクトを格納するためのオブジェクト変数と 敵機オブジェクトの描画処理を追加します。
※赤字の部分が前回からの追加・変更点になります。
■アプレットクラス(ShootGame.java)
  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.Graphics2D;
  4. import java.awt.event.KeyEvent;
  5. import java.awt.event.KeyListener;
  6. import java.awt.image.BufferedImage;
  7. import javax.swing.JApplet;
  8. public class ShootGame extends JApplet implements KeyListener {
  9.   private static final long serialVersionUID = 1L;
  10.   public Gun gun = new Gun(87, 180);
  11.   public Bullet bullet;
  12.   public Enemy enemy;
  13.   public static Thread t;
  14.   BufferedImage bi;
  15.   Graphics2D offs;
  16.   int w, h;
  17.   public void init() {
  18.     addKeyListener(this);
  19.     w = getWidth();
  20.     h = getHeight();
  21.     bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
  22.     offs = (Graphics2D) bi.getGraphics();
  23.     offs.setBackground(Color.WHITE);
  24.   }
  25.   public void start(){
  26.     t = new Thread(){
  27.       public void run(){
  28.         Thread ct = Thread.currentThread();
  29.         while( t == ct ){
  30.           try {
  31.             Thread.sleep(10);
  32.             repaint();
  33.           } catch(Exception e) {
  34.             e.printStackTrace();  
  35.           }
  36.         }
  37.       }
  38.     };
  39.     t.start();
  40.   }
  41.   public void paint(Graphics g) {
  42.     offs.clearRect(0,0,w,h);
  43.     gun.move();
  44.     gun.draw(offs);
  45.     if ( bullet != null ) {
  46.       if ( bullet.getBulletY() > - 15 ) {
  47.         bullet.draw(offs);
  48.         bullet.move();
  49.       } else {
  50.         bullet = null;
  51.       }
  52.     }
  53.     if ( enemy != null ) {
  54.       if ( enemy.getEnemyX() > - 30) {
  55.         enemy.draw(offs);
  56.         enemy.move();
  57.       } else {
  58.         enemy = null;
  59.       }
  60.     } else {
  61.       enemy = new Enemy(200,10);
  62.     }
  63.     g.drawImage(bi, 0, 0, null);
  64.   }
  65.   public void update(Graphics g){
  66.     paint(g);
  67.   }
  68.   public void destroy() {
  69.     t = null;
  70.   }
  71.   public void keyPressed(KeyEvent e) {
  72.     if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
  73.       gun.setDirection(Gun.RIGHT_MOVE);
  74.     } else if (e.getKeyCode() == KeyEvent.VK_LEFT ) {
  75.       gun.setDirection(Gun.LEFT_MOVE);
  76.     } else if (e.getKeyCode() == KeyEvent.VK_SPACE ) {
  77.       bullet = bullet == null ? new Bullet(gun.getGun().x, gun.getGun().y) : bullet;
  78.     }
  79.   }
  80.   public void keyReleased(KeyEvent e) {
  81.     if ( e.getKeyCode() == KeyEvent.VK_RIGHT || 
  82.          e.getKeyCode() == KeyEvent.VK_LEFT ) {
  83.       gun.setDirection(Gun.STAY_HERE);
  84.     }
  85.   }
  86.   public void keyTyped(KeyEvent e) {
  87.   }
  88. }
16行目は、敵機クラスのオブジェクトを格納するための変数を定義しています。
67行目〜76行目で敵機の描画処理を行っています。敵機は、10ミリ秒ごとに30ピクセルずつ移動していきます。

■自機クラス(Gun.java)
弾クラスは、第4回と同じです。変更はありません。
 →前回分を見たい方はここをクリック

■弾クラス(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.   private int s = 5;
  9.   public Bullet() {
  10.     bullet = new Ellipse2D.Double();  
  11.     bullet.setFrame(r);
  12.   }
  13.   public Bullet(int x, int y ) {
  14.     this();
  15.     r.x += x;
  16.     r.y += y;
  17.     bullet.setFrame(r);
  18.   }
  19.   public void draw(Graphics2D g2) {
  20.     g2.setColor(Color.YELLOW);
  21.     g2.fill(bullet);
  22.     g2.setColor(Color.BLACK);
  23.     g2.draw(bullet);
  24.   }
  25.   public void move() {
  26.     r.y -= s;
  27.     bullet.setFrame(r);
  28.   }
  29.   public void setBulletY(int y) {
  30.     r.y = y;
  31.     bullet.setFrame(r);
  32.   }
  33.   public int getBulletY(){
  34.     return r.y;
  35.   }
  36. }
10行目に弾オブジェクトが1回のスレッド実行で移動するピクセル数を定義しています。
31〜34行目、moveメソッドを追加しました。このメソッドを介して弾オブジェクトを移動させます。

■敵機クラス(Enemy.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 Enemy {
  6.   private int x = 0;
  7.   private int y = 0;
  8.   private int s = 3;
  9.   private Rectangle body_r;
  10.   private Ellipse2D body;
  11.   private Rectangle pit_r;
  12.   private Ellipse2D pit;
  13.   private Rectangle rleg_r;
  14.   private Ellipse2D rleg;
  15.   private Rectangle mleg_r;
  16.   private Ellipse2D mleg;
  17.   private Rectangle lleg_r;
  18.   private Ellipse2D lleg;
  19.   public Enemy() {
  20.     body_r = new Rectangle(0,5,30,12);  
  21.     body = new Ellipse2D.Double();
  22.     body.setFrame(body_r);
  23.     pit_r = new Rectangle(10,0,10,10);  
  24.     pit = new Ellipse2D.Double();
  25.     pit.setFrame(pit_r);
  26.     rleg_r = new Rectangle(20,13,6,6);  
  27.     rleg = new Ellipse2D.Double();
  28.     rleg.setFrame(rleg_r);
  29.     mleg_r = new Rectangle(12,15,6,6);  
  30.     mleg = new Ellipse2D.Double();
  31.     mleg.setFrame(mleg_r);
  32.     lleg_r = new Rectangle(4,13,6,6);  
  33.     lleg = new Ellipse2D.Double();
  34.     lleg.setFrame(lleg_r);
  35.   }
  36.   public Enemy(int x, int y ) {
  37.     this();
  38.     this.x = x;
  39.     this.y = y;
  40.     body_r.x += x;
  41.     body_r.y += y;
  42.     body.setFrame(body_r);
  43.     pit_r.x += x;
  44.     pit_r.y += y;
  45.     pit.setFrame(pit_r);
  46.     rleg_r.x += x;
  47.     rleg_r.y += y;
  48.     rleg.setFrame(rleg_r);
  49.     mleg_r.x += x;
  50.     mleg_r.y += y;
  51.     mleg.setFrame(mleg_r);
  52.     lleg_r.x += x;
  53.     lleg_r.y += y;
  54.     lleg.setFrame(lleg_r);
  55.   }
  56.   public void draw(Graphics2D g2) {
  57.     g2.setColor(Color.CYAN);
  58.     g2.fill(pit);
  59.     g2.setColor(Color.BLUE);
  60.     g2.fill(rleg);
  61.     g2.fill(mleg);
  62.     g2.fill(lleg);
  63.     g2.setColor(Color.BLACK);
  64.     g2.draw(pit);
  65.     g2.draw(rleg);
  66.     g2.draw(mleg);
  67.     g2.draw(lleg);
  68.     g2.setColor(Color.RED);
  69.     g2.fill(body);
  70.     g2.setColor(Color.BLACK);
  71.     g2.draw(body);
  72.   }
  73.   public int getEnemyX() {
  74.     return this.x;
  75.   }
  76.   public void setEnemyX(int x) {
  77.     body_r.x = x;
  78.     pit_r.x = x;
  79.     body.setFrame(body_r);
  80.     pit.setFrame(pit_r);
  81.   }
  82.   public void move(){
  83.     this.x -= s;
  84.     body_r.x -= s;
  85.     body.setFrame(body_r);
  86.     pit_r.x -= s;
  87.     pit.setFrame(pit_r);
  88.     rleg_r.x -= s;
  89.     rleg.setFrame(rleg_r);
  90.     mleg_r.x -= s;
  91.     mleg.setFrame(mleg_r);
  92.     lleg_r.x -= s;
  93.     lleg.setFrame(lleg_r);
  94.   }
  95. }
移動方向や形状が違うだけで基本的な構造は、弾クラスや自機クラスとほとんど同じです。

下記のボタンを押すと今回のプログラムを実行してみることが出来ます。
※実行は、別ウィンドウで開きます。実行には時間がかかることがありますのでご注意ください。


- Page 8 -
  先頭のページ
  前のページ
  次のページ
  最後のページ



最終更新日:2019/02/13

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