Newer
Older
SproutServerMicro / src / main / java / org / ntlab / SproutServer / battles / Player.java
s-bekki on 30 Nov 2017 5 KB initial commit
package org.ntlab.SproutServer.battles;

import framework.animation.Animation3D;
import framework.gameMain.OvergroundActor;
import framework.model3D.Object3D;
import framework.model3D.Position3D;
import framework.physics.PhysicsUtility;
import framework.physics.Solid3D;
import net.arnx.jsonic.JSONHint;
import org.ntlab.SproutServer.accounts.Accounts;

import javax.vecmath.Vector3d;
import java.net.URLDecoder;

/**
 * プレイヤー
 *
 * @author matsumoto_k
 */
public class Player {

    private OvergroundActor actor = null; // プレイヤーのオブジェクト
    private int hp = BattlesConst.PLAYER_INIT_HP; // プレイヤーのHP
    private boolean playerCollision = false;
    private int userId = -1;
    private int memberId = -1;
    private String userName = "";

    public Player(int userId, int memberId) {
        this.userId = userId;
        this.memberId = memberId;
        this.userName = Accounts.getInstance().getUserNameById(this.userId);
        actor = createPlayerObject(null);
        setInitDirection(0.0, 0.0, 0.0);
        // TODO:初期位置を設定する
        setInitPosition(Math.random()*100, Math.random()*100, 0);
    }

    /**
     * プレイヤーの情報を更新する
     *
     * @param position3D プレイヤーの位置
     * @param vector3d   プレイヤーの向き
     */
    public void update(Position3D position3D, Vector3d vector3d) {
        actor.setPosition(position3D); // プレイヤーの新しい位置をセット
        actor.setDirection(vector3d); // プレイヤーの新しい向いている方向をセット
    }

    /**
     * プレイヤーのオブジェクトを作成
     *
     * @param animation3D アニメーション
     * @return プレイヤーのオブジェクト
     */
    private OvergroundActor createPlayerObject(Animation3D animation3D) {
        // TODO:プレイヤーの見た目を考える
        String path = Battles.getInstance().getClass().getResource("pocha.stl").getPath();
        try {
            path = URLDecoder.decode(path, "utf-8");
        } catch (Exception e) {

        }
        PlayerModel playerModel = new PlayerModel(path, null);
        return new OvergroundActor(new Solid3D(playerModel.createObject()), null);
    }

    public String getUserName() {
        return userName;
    }

    /**
     * プレイヤーの初期位置を設定する
     *
     * @param x x座標
     * @param y y座標
     * @param z z座標
     */
    public void setInitPosition(double x, double y, double z){
        actor.setPosition(new Position3D(x, y, z));
    }

    /**
     * プレイヤーの初期方向を設定する
     *
     * @param x     x方向
     * @param y     y方向
     * @param z     z方向
     */
    public void setInitDirection(double x, double y, double z) {
        actor.setDirection(new Vector3d(x, y, z));
    }

    /**
     * プレイヤーの位置を取得
     *
     * @return プレイヤーの位置
     */
    public Position3D getPlayerPosition3d() {
        return actor.getPosition();
    }

    /**
     * プレイヤーの向きを取得
     *
     * @return プレイヤーの向き
     */
    public Vector3d getPlayerVector3d() {
        return actor.getDirection();
    }

    /**
     * プレイヤーのHPを取得
     *
     * @return プレイヤーのHP
     */
    public int getHp() {
        return hp;
    }

    /**
     * プレイヤーにダメージを与える
     *
     * @param damage 与えるダメージ
     */
    public void setDamage(int damage) {
        hp -= damage;
    }

    /**
     * プレイヤーが生存しているかどうか判定
     *
     * @return 生きている:true, 死んでいる:false
     */
    @JSONHint(ignore = true)
    public boolean isAlive() {
        if (hp < 0) {
            return false;
        }
        return true;
    }

    /**
     * プレイヤー同士の衝突判定
     *
     * @param player 判定するプレイヤー
     * @return 衝突している時はtrue, していない時はfalse
     */
    public boolean checkCollision(Player player) {
        if (PhysicsUtility.checkCollision(getBody(), null, player.getBody(), null) != null) {
            return true;
        }
        return false;
    }

    public boolean isPlayerCollision() {
        return playerCollision;
    }

    /**
     * プレイヤー同士の衝突フラグ
     *
     * @param playerCollision
     */
    public void setPlayerCollision(boolean playerCollision) {
        this.playerCollision = playerCollision;
    }

    /**
     * プレイヤーのオブジェクトを取得する
     *
     * @return プレイヤーのオブジェクト
     */
    @JSONHint(ignore = true)
    public Object3D getBody() {
        return actor.body;
    }

    /**
     * プレイヤーのuserIdを取得する
     *
     * @return userId
     */
    @JSONHint(ignore = true)
    public int getUserId() {
        return userId;
    }

    /**
     * プレイヤーのmemberIdを取得する
     *
     * @return memberId
     */
    @JSONHint(ignore = true)
    public int getMemberId() {
        return memberId;
    }
}