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();
}