Newer
Older
Cactus / app / src / main / java / org / ntlab / radishforandroidstudio / cactusClient / views / PlayerFragment.java
package org.ntlab.radishforandroidstudio.cactusClient.views;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import org.ntlab.radishforandroidstudio.R;
import org.ntlab.radishforandroidstudio.cactusClient.connections.ObjectsConnection;
import org.ntlab.radishforandroidstudio.cactusClient.models.BulletsManager;
import org.ntlab.radishforandroidstudio.cactusClient.models.CactusModels;
import org.ntlab.radishforandroidstudio.cactusClient.models.MovableObjectModel;
import org.ntlab.radishforandroidstudio.cactusClient.models.Object;
import org.ntlab.radishforandroidstudio.cactusClient.models.OtherPlayerCharactersModel;
import org.ntlab.radishforandroidstudio.cactusClient.models.OwnPlayer;
import org.ntlab.radishforandroidstudio.cactusClient.models.Player;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTPad;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment;
import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor;
import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment;
import org.ntlab.radishforandroidstudio.framework.model3D.BaseObject3D;
import org.ntlab.radishforandroidstudio.framework.physics.Ground;
import org.ntlab.radishforandroidstudio.java3d.AmbientLight;
import org.ntlab.radishforandroidstudio.java3d.Appearance;
import org.ntlab.radishforandroidstudio.java3d.Color3f;
import org.ntlab.radishforandroidstudio.java3d.DirectionalLight;
import org.ntlab.radishforandroidstudio.java3d.IndexedTriangleArray;
import org.ntlab.radishforandroidstudio.java3d.Material;
import org.ntlab.radishforandroidstudio.java3d.Point3d;
import org.ntlab.radishforandroidstudio.java3d.Vector3f;

public class PlayerFragment extends RealTime3DFragment {
    RWTPad pad = null;
    private OwnPlayer player;
    private OtherPlayerCharactersModel otherPlayerCharactersModel;
    private BulletsManager bulletsManager;
    private MovableObjectModel movableObjectModel;
    RWTUIFragment f = null;

    private boolean isTouched = false;//画面判定
    private float touchX = 0.0f;
    private float touchY = 0.0f;

    public PlayerFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        modelManager = CactusModels.getInstance();
        modelManager.setFragment(this);
        modelManager.setUniverse(universe);

        //環境光
        AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f));
        universe.placeLight(amblight);
        //平行光源
        DirectionalLight dirlight = new DirectionalLight(
                new Color3f(1.0f, 1.0f, 1.0f),  //光の色
                new Vector3f(0.0f, -1.0f, -0.5f) //光の方向ベクトル
        );
        universe.placeLight(dirlight);

        // 地面の作成
        IndexedTriangleArray groundGeometry = new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES | IndexedTriangleArray.NORMALS, 6);
        groundGeometry.setCoordinate(0, new Point3d(-20.0, -1.0, -20.0));
        groundGeometry.setCoordinate(1, new Point3d(20.0, -1.0, -20.0));
        groundGeometry.setCoordinate(2, new Point3d(20.0, -1.0, 20.0));
        groundGeometry.setCoordinate(3, new Point3d(-20.0, -1.0, 20.0));
        groundGeometry.setNormal(0, new Vector3f(0.0f, 1.0f, 0.0f));
        groundGeometry.setNormal(1, new Vector3f(0.0f, 1.0f, 0.0f));
        groundGeometry.setNormal(2, new Vector3f(0.0f, 1.0f, 0.0f));
        groundGeometry.setNormal(3, new Vector3f(0.0f, 1.0f, 0.0f));
        groundGeometry.setCoordinateIndices(0, new int[]{0, 3, 2});
        groundGeometry.setCoordinateIndices(3, new int[]{0, 2, 1});
        Appearance ap2 = new Appearance();
        Material m2 = new Material();
        m2.setDiffuseColor(0.5f, 1.0f, 0.2f);
        ap2.setMaterial(m2);
        Ground ground = new Ground(new BaseObject3D(groundGeometry, ap2));
        universe.place(ground);
        start(1000L, 50L, true);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        Bundle bundle = getArguments();
        // プレイヤーの作成とインスタンスIDのセット
        String playerId = bundle.getString("playerId");
        String instanceId = bundle.getString("instanceId");
        player = new OwnPlayer((Player) bundle.getSerializable("player"), getResources(), universe, camera, playerId, instanceId);
        modelManager.addModel(player);

        otherPlayerCharactersModel = new OtherPlayerCharactersModel(this, universe);
        otherPlayerCharactersModel.setPlayerId(playerId);
        modelManager.addModel(otherPlayerCharactersModel);

        bulletsManager = new BulletsManager(this.getResources(), universe);
        bulletsManager.setPlayerId(playerId);
        modelManager.addModel(bulletsManager);

        //object
        movableObjectModel = new MovableObjectModel(this, universe, instanceId);
        modelManager.addModel(movableObjectModel);

        modelManager.setInstanceId(instanceId);
        //画面の生成
        initGameWindowView();


        parentView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
                    isTouched = true;
                    //画面をどこタッチしたか
                    float maxX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax();
                    float minX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMin();
                    float maxY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMax();
                    float minY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMin();
                    touchX = (event.getX() - minX) / (maxX - minX);
                    touchY = (event.getY() - minY) / (maxY - minY);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    isTouched = false;
                }
                return true;
            }
        });
        return parentView;
    }

    @Override
    protected void progress(long interval) {
        super.progress(interval);

        Button jumpButton = (Button) getActivity().findViewById(R.id.Button);
        jumpButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                player.jump();
            }
        });
        if (isTouched) {
            player.changeViewpoint(touchX, touchY);
            isTouched = false;
        }
    }

    //画面生成
    public void initGameWindowView() {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        RWTUIFragment f = new RWTUIFragment();
        f.setListener(this);
        View uiLayout = parentView.findViewById(R.id.ui_layout);
        uiLayout.setOnTouchListener(f);
        transaction.add(R.id.ui_layout, f);
        transaction.commit();
    }

    public void onCreateFragmentEvent(RWTUIFragment f) {
        pad = (RWTPad) f.findViewById(org.ntlab.radishforandroidstudio.R.id.pad);
        pad.addListener(player);
    }

    public void logout() {
        player.logout();
    }
    @Override
    public void onDestroy() {
        System.out.println("destroy");
        logout();
        super.onDestroy();
    }
}