package template.shooting2D; import java.util.ArrayList; import framework.game2D.Sprite; import framework.game2D.Velocity2D; public class EnemySprite extends Sprite { // 衝突判定用のBoundingSphereの半径 public double collisionRadius = 1.0; private int enemyHP = 100; // 弾幕の最大数 private final int MAX_DANMAKU = 32; // 弾の発射時の敵からの位置 private final int BULLET_DISTANCE = 1; // ゲームの表示範囲から得ることが出来る幅・高さ int rangeWidth = TemplateShooting2D.RANGE; int rangeHeight = TemplateShooting2D.RANGE; public EnemySprite(String imageFile) { super(imageFile); } // //////////////////////////////////////////////////// // // 敵機の衝突判定関連メソッド // // /////////////////////////////////////////////////// /** * 衝突判定のBounding Sphere(境界球)をcollisionRadiusで設定する * * @param collisionRadius * -- BoundingSphereの半径 */ public void setCollisionRadius(double collisionRadius) { this.collisionRadius = collisionRadius; } /** * 衝突判定のBounding Sphere(境界球)の半径を返す * * @return BoundingSphereの半径 */ public double getCollisionRadius() { return collisionRadius; } // //////////////////////////////////////////////////// // // 敵機の弾を発射するメソッド // // /////////////////////////////////////////////////// /** * 弾幕が入ったArrayListを返す * * @return -- 弾幕が入ったArrayList */ public ArrayList<EnemyBullet> shootDanmaku() { double bulletX, bulletY; ArrayList<EnemyBullet> enemyBulletList = new ArrayList<EnemyBullet>(); for (int i = 0; i < MAX_DANMAKU; i++) { EnemyBullet enemyBullet = new EnemyBullet("data\\images\\enemyBullet.gif"); bulletX = BULLET_DISTANCE * (Math.cos(i * (2 * Math.PI / MAX_DANMAKU))); bulletY = BULLET_DISTANCE * (Math.sin(i * (2 * Math.PI / MAX_DANMAKU))); // 弾の位置を設定 enemyBullet.setPosition(this.getPosition()); // 弾の移動ベクトルを設定する enemyBullet.setVelocity(new Velocity2D(bulletX * 5, bulletY * 5)); enemyBulletList.add(enemyBullet); } return enemyBulletList; } // //////////////////////////////////////////////////// // // 敵がウィンドウ内にいるかどうかのメソッド // // /////////////////////////////////////////////////// public void motion(long interval) { Velocity2D vel = this.getVelocity(); switch (insideX()) { case -1: vel.setX(Math.abs(this.getVelocity().getX())); break; case 1: vel.setX(Math.abs(this.getVelocity().getX()) * -1.0); break; } switch (insideY()) { case -1: vel.setY(Math.abs(this.getVelocity().getY())); break; case 1: vel.setY(Math.abs(this.getVelocity().getY()) * -1.0); break; } setVelocity(vel); super.motion(interval); } /** * 画面をX方向に出ていないか? * * @return -1: Xの負の方向に出ている, 0: X方向に出ていない, 1: Xの正の方向に出ている */ private int insideX() { if (this.getPosition().getX() > rangeWidth / 2.0) { return 1; } else if (this.getPosition().getX() < -rangeWidth / 2.0) { return -1; } else { return 0; } } /** * 画面をY方向に出ていないか? * * @return -1: Yの負の方向に出ている, 0: Y方向に出ていない, 1: Yの正の方向に出ている */ private int insideY() { if (this.getPosition().getY() > rangeHeight / 2.0) { return 1; } else if (this.getPosition().getY() < -rangeHeight / 2.0) { return -1; } else { return 0; } } // //////////////////////////////////////////////////// // // 敵機のHP関連メソッド // // /////////////////////////////////////////////////// public boolean shootDown() { if (enemyHP <= 0) { return true; } else { return false; } } public void addEnemyHP(int value) { enemyHP += value; } public int getEnemyHP() { return enemyHP; } public void setEnemyHP(int enemyHP) { this.enemyHP = enemyHP; } }