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

import android.annotation.SuppressLint;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;

import android.view.MotionEvent;

import android.widget.FrameLayout;
import android.widget.LinearLayout;

import org.ntlab.radishforandroidstudio.framework.RWT.RWTPad;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment;
import org.ntlab.radishforandroidstudio.framework.animation.Animation3D;
import org.ntlab.radishforandroidstudio.framework.event.PadEvent;
import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor;
import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DActivity;
import org.ntlab.radishforandroidstudio.framework.listener.PadListener;
import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory;
import org.ntlab.radishforandroidstudio.framework.model3D.Object3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
import org.ntlab.radishforandroidstudio.framework.physics.Ground;
import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D;
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.Material;
import org.ntlab.radishforandroidstudio.java3d.Vector3d;
import org.ntlab.radishforandroidstudio.java3d.Vector3f;



public class PlayerActivity extends RealTime3DActivity implements PadListener{
    private OvergroundActor pocha;
    private Ground stage;
    private boolean isTouched = false;
    private float touchX = 0.0f;
    private float touchY = 0.0f;
    RWTPad pad = null;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        //環境光
        AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f));

//		amblight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0));
        universe.placeLight(amblight);

        //平行光源
        DirectionalLight dirlight = new DirectionalLight(
                new Color3f(1.0f, 1.0f, 1.0f),  //光の色
                new Vector3f(0.0f, -1.0f, -0.5f) //光の方向ベクトル
        );
//		dirlight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0));
        universe.placeLight(dirlight);

        Appearance ap1 = new Appearance();
        Material m = new Material();
        m.setDiffuseColor(0.0f, 0.3f, 1.0f);
        m.setAmbientColor(0.0f, 0.0f, 0.0f);
        m.setEmissiveColor(0.0f, 0.0f, 0.0f);
        m.setSpecularColor(0.0f, 0.0f, 0.0f);
        m.setShininess(5.0f);
        ap1.setMaterial(m);

        Object3D pochaBody = null;
        try {
            pochaBody = ModelFactory.loadModel(getResources(), "pocha.stl", ap1).createObject();
            Animation3D pochaAnimation = null;	//AnimationFactory.loadAnimation("data\\pocha\\walk.wrl");
            pocha = new OvergroundActor(pochaBody, pochaAnimation);
            pocha.setPosition(new Position3D(0.0, -100.0, 250.0));
            universe.place(pocha);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Appearance ap2 = new Appearance();
        Material m2 = new Material();
        m2.setDiffuseColor(0.1f, 0.0f, 0.02f);
        m2.setAmbientColor(0.1f, 0.1f, 0.1f);
        m2.setEmissiveColor(0.0f, 0.0f, 0.0f);
        m2.setSpecularColor(0.2f, 0.2f, 0.2f);
        m2.setShininess(5.0f);
        ap2.setMaterial(m2);

        Object3D stageObj = null;
        try {
            stageObj = ModelFactory.loadModel(getResources(), "konan/konan.obj").createObject();
            stage = new Ground(stageObj);
            universe.place(stage);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //pad 追加部分


        setContentView(org.ntlab.radishforandroidstudio.R.layout.activity_main);

        FrameLayout l = findViewById(org.ntlab.radishforandroidstudio.R.id.game_layout);
        view = new RWTSurfaceView(this);
        view.attachCamera(camera);
        l.addView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));


        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        RWTUIFragment f = new RWTUIFragment();
        f.setListener(this);
        android.view.View uiLayout = (android.view.View)findViewById(org.ntlab.radishforandroidstudio.R.id.ui_layout);
        uiLayout.setOnTouchListener((RWTUIFragment)f);
        // TODO: 2018/06/26 下のやつ
//        transaction.add(org.ntlab.radishforandroidstudio.R.id.ui_layout, f);
//        transaction.commit();



		/*camera.setViewPoint(pocha.getPosition().add(0.0, 1.5, 0.0));
		camera.setViewLine(pocha.getDirection());
		camera.setFieldOfView(1.5);
		camera.setBackClipDistance(10000.0);*/
        start(1000L, 50L, true);
    }

    @Override
    public void progress(long interval) {
        Velocity3D curV = pocha.getVelocity();
       	if (isTouched) {
			pocha.rotY(0.001 * (0.5f - touchX) * (double)(interval / 15.0));
			curV.setX(pocha.getDirection().getX() * 200.0 * (0.5f - touchY));
			curV.setZ(pocha.getDirection().getZ() * 200.0 * (0.5f - touchY));
			pocha.setVelocity(curV);
		} else {
			curV.setX(0.0);
			curV.setZ(0.0);
			pocha.setVelocity(curV);
		}



        Vector3d charaVector3d = pocha.getDirection();
        charaVector3d.normalize();//キャラの向きを単位ベクトルに
        camera.setViewPoint(pocha.getPosition()
                .add( -5.0 * charaVector3d.getX(), charaVector3d.getY() + 5.0, -5.0 * charaVector3d.getZ()));//視点
        camera.setViewLine(new Vector3d(5.0 *charaVector3d.getX() , charaVector3d.getY() - 2.5, 5.0 *charaVector3d.getZ()+touchX));//視線
    }


    @SuppressLint("NewApi")
    @Override
    public boolean onTouchEvent (MotionEvent event){
        Vector3d charaVector3d = pocha.getDirection();
        charaVector3d.normalize();//キャラの向きを単位ベクトルに
        super.onTouchEvent(event);

        if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
            isTouched = true;
            float maxX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax() / 2.0f;
            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);

            camera.setViewPoint(pocha.getPosition()
                    .add( -5.0 * charaVector3d.getX(), charaVector3d.getY() + 5.0, -5.0 * charaVector3d.getZ()));//視点
            camera.setViewLine(new Vector3d(5.0 *charaVector3d.getX() , charaVector3d.getY() - 2.5, 5.0 *charaVector3d.getZ()+touchX));//視線
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            isTouched = false;
        }
        return true;
    }

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

    @Override
    public boolean onEvent(PadEvent event) {
        Vector3d charaVector3d = pocha.getDirection();
        charaVector3d.normalize();//キャラの向きを単位ベクトルに
        MotionEvent motionEvent = event.getMotionEvent();
        super.onTouchEvent(motionEvent);

        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
            isTouched = true;
            float maxX = motionEvent.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax() / 2.0f;
            float minX = motionEvent.getDevice().getMotionRange(MotionEvent.AXIS_X).getMin();
            float maxY = motionEvent.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMax();
            float minY = motionEvent.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMin();
            touchX = (motionEvent.getX() - minX) / (maxX - minX);
            touchY = (motionEvent.getY() - minY) / (maxY - minY);

            camera.setViewPoint(pocha.getPosition()
                    .add( -5.0 * charaVector3d.getX(), charaVector3d.getY() + 5.0, -5.0 * charaVector3d.getZ()));//視点
            camera.setViewLine(new Vector3d(5.0 *charaVector3d.getX() , charaVector3d.getY() - 2.5, 5.0 *charaVector3d.getZ()+touchX));//視線
        } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
            isTouched = false;
        }
        return false;
    }
}