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; } }