package org.ntlab.SproutServer.battles; import framework.animation.Animation3D; import framework.gameMain.Actor; import framework.model3D.CollisionResult; import framework.model3D.Object3D; import framework.model3D.Position3D; import framework.physics.Force3D; import framework.physics.Ground; import framework.physics.Solid3D; import framework.physics.Velocity3D; import net.arnx.jsonic.JSONHint; import javax.vecmath.Vector3d; /** * 飛ぶ武器 * * @author matsumoto_k */ abstract class Weapon { protected boolean alive = true; // 武器の生存フラグ private long left = 0; // 武器の寿命 private int attack = 0; // 武器の攻撃力 protected Actor actor; // 武器のオブジェクト public Weapon() { left = getInitWeaponLife(); attack = getAttack(); this.actor = new WeaponActor(new Solid3D(createObject()), null) { public void onIntersect(CollisionResult normal, long interval) { if (normal != null) alive = false; } }; } abstract protected class WeaponActor extends Actor { protected WeaponActor(Solid3D o, Animation3D animation3D) { super(o, animation3D); } @Override public void onEndFall() { } @Override abstract public void onIntersect(CollisionResult normal, long interval); @Override public void motion(long interval, Ground ground) { super.motion(interval, ground); left -= interval; if (left < 0L) { alive = false; } } @Override public Force3D getGravity() { return Force3D.ZERO; } @Override public void onEndAnimation() { } } /** * 武器のオブジェクトを作成する * * @return 武器のオブジェクト */ abstract Object3D createObject(); /** * 武器の初期値を設定 * * @param weaponPosition 武器の位置 * @param weaponVector 武器の方向 * @param weaponVelocity 武器の速度 */ public void initWeapon(Position3D weaponPosition, Vector3d weaponVector, Velocity3D weaponVelocity) { actor.setPosition(weaponPosition); // 弾の位置を設定 actor.setDirection(weaponVector); // 弾の方向を設定 actor.setVelocity(weaponVelocity); // 弾の速度を設定 } /** * 武器のActorを取得 * * @return 武器のActor */ @JSONHint(ignore = true) public Actor getActor() { return actor; } /** * 武器のオブジェクトを取得 * * @return 武器のオブジェクト */ @JSONHint(ignore = true) public Object3D getBody() { return actor.body; } /** * 武器の生存確認 * * @return 武器が壁や地面と接触した、武器の寿命が切れたなどの場合はfalseを返す */ @JSONHint(ignore = true) public boolean isAlive() { return alive; } /** * 武器の初期寿命を取得 * * @return 武器の初期寿命(ミリ秒) */ @JSONHint(ignore = true) abstract long getInitWeaponLife(); /** * 武器の攻撃力を取得 * * @return 武器の攻撃力 */ @JSONHint(ignore = true) abstract public int getAttack(); }