Newer
Older
Cactus-CleanArchitecture / app / src / main / java / org / ntlab / radishforandroidstudio / cactusClient / models / MyBullet.java
package org.ntlab.radishforandroidstudio.cactusClient.models;

import android.telecom.Call;

import net.arnx.jsonic.JSON;

import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletCreateConnection;
import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletGetConnection;
import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletUpdateConnection;
import org.ntlab.radishforandroidstudio.framework.animation.Animation3D;
import org.ntlab.radishforandroidstudio.framework.gameMain.Actor;
import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel;
import org.ntlab.radishforandroidstudio.framework.model3D.CollisionResult;
import org.ntlab.radishforandroidstudio.framework.model3D.Object3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Placeable;
import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D;
import org.ntlab.radishforandroidstudio.framework.network.CallBack;
import org.ntlab.radishforandroidstudio.framework.physics.Force3D;
import org.ntlab.radishforandroidstudio.framework.physics.Solid3D;
import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D;
import org.ntlab.radishforandroidstudio.java3d.Vector3d;

import java.util.ArrayList;
import java.util.UUID;

public class MyBullet extends Actor implements GameBaseModel, CallBack {
    private String instanceId;
    private String playerId;
    private String uuid;
    private DummyBullet bullet;
    final private int INIT_UPDATE_INTERVAL = 100;
    private int updateInterval = INIT_UPDATE_INTERVAL;
    private boolean isCreatedOnServer = false;
    private boolean isWaitCreatingOnServer = false;
    private boolean isDelete = false;

    public MyBullet(Object3D body, Animation3D animation) {
        super(body, animation);
        initUuid();
    }

    public MyBullet(Solid3D body, Animation3D animation) {
        super(body, animation);
        initUuid();
    }

    public void initUuid() {
        if (getUuid() == null || getUuid().equals("")) {
            uuid = UUID.randomUUID().toString();
        }
    }

    public String getUuid() {
        return uuid;
    }

    public boolean isDelete() {
        return isDelete;
    }

    @Override
    public void onEndFall() {

    }

    @Override
    public void onIntersect(CollisionResult normal, long interval) {

    }

    @Override
    public void onEndAnimation() {

    }

    @Override
    public void addCollidable(ArrayList<Placeable> pList) {

    }

    @Override
    public void onCollisionEnter(Placeable p) {

    }

    @Override
    public void onCollisionStay(Placeable p) {

    }

    @Override
    public void onCollisionExit(Placeable p) {

    }
    
    @Override
    public Force3D getGravity() {
        return Force3D.ZERO;
    }


    @Override
    final public void update(double interval) {
        progress(interval);
        // サーバに弾を作成
        if (!isCreatedOnServer && !instanceId.equals("") && !playerId.equals("") && !isWaitCreatingOnServer) {
            JSON json = new JSON();
            Quaternion3D q = ((Solid3D)(getBody())).getQuaternion();
            BulletCreateConnection con = new BulletCreateConnection(instanceId, playerId);
            con.setCallBack(this);
            con.addFormParam("bulletID", getUuid());
            con.addFormParam("position", json.encode(getPosition()));
            con.addFormParam("angle", "{ \"x\":" + q.getX() + ", \"y\":" + q.getY() + ", \"z\":" + q.getZ() + ", \"w\":" + q.getW() + "}");
            con.doPost();
            isWaitCreatingOnServer = true;
            System.out.println("create shot uuid:" + getUuid());
        }
        else if (isCreatedOnServer && !isWaitCreatingOnServer) {
            // サーバの弾の情報を更新
            updateInterval -= interval;
            if (updateInterval <= 0 && isCreatedOnServer) {
                JSON json = new JSON();
                Quaternion3D q = ((Solid3D)(getBody())).getQuaternion();
                updateInterval = INIT_UPDATE_INTERVAL;
                BulletUpdateConnection con = new BulletUpdateConnection(instanceId, playerId, getUuid());
                con.setCallBack(this);
                con.addFormParam("position", json.encode(getPosition()));
                con.addFormParam("angle", "{ \"x\":" + q.getX() + ", \"y\":" + q.getY() + ", \"z\":" + q.getZ() + ", \"w\":" + q.getW() + "}");
                con.doPut();
            }
        }
    }

    public void progress(double interval) {

    }

    public void init(Position3D pos, Quaternion3D angle) {
        setPosition(pos);
        Vector3d v = new Vector3d(-1.0f, 0, 0);
        v = v.rotate(angle);
        setVelocity(new Velocity3D(v));
    }


    @Override
    public void setInstanceId(String id) {
        instanceId = id;
    }

    public void setPlayerid(String id) {
        playerId = id;
    }

    @Override
    public void onResponse(String response) {
        isWaitCreatingOnServer = false;
        isCreatedOnServer = true;
    }
}