Newer
Older
SproutServerMicro / src / main / java / org / ntlab / SproutServer / battles / Weapon.java
s-bekki on 30 Nov 2017 3 KB initial commit
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();
}