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.controller.BulletsModel; import org.ntlab.radishforandroidstudio.cactusClient.controller.CactusRepository; import org.ntlab.radishforandroidstudio.cactusClient.controller.MovableObjectModel; import org.ntlab.radishforandroidstudio.cactusClient.controller.OtherPlayerCharactersModel; import org.ntlab.radishforandroidstudio.cactusClient.controller.OwnBulletsModel; import org.ntlab.radishforandroidstudio.cactusClient.usecase.UpdateBoundary; import org.ntlab.radishforandroidstudio.cactusClient.controller.OwnPlayerModel; import org.ntlab.radishforandroidstudio.cactusClient.models.player.Player; import org.ntlab.radishforandroidstudio.framework.RWT.RWTPad; import org.ntlab.radishforandroidstudio.framework.RWT.RWTShotButton; import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment; 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 { private OwnPlayerModel player; private OwnBulletsModel ownBulletsModel; 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 = new CactusRepository(); 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 OwnPlayerModel((Player) bundle.getSerializable("player"), getResources(), universe, camera, playerId, instanceId); ownBulletsModel = player.getBulletsModel(); modelManager.addModel(player); modelManager.addModel(ownBulletsModel); OtherPlayerCharactersModel otherPlayerCharactersModel = new OtherPlayerCharactersModel(this, universe); otherPlayerCharactersModel.setPlayerId(playerId); modelManager.addModel(otherPlayerCharactersModel); BulletsModel bulletsModel = new BulletsModel(this.getResources(), universe); bulletsModel.setPlayerId(playerId); modelManager.addModel(bulletsModel); //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; } UpdateBoundary updateBoundary; @Override protected void update(long interval) { super.update(interval); updateBoundary.onUpdate(interval); } @Override protected void progress(long interval) { super.progress(interval); 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) { RWTPad pad = (RWTPad) f.findViewById(org.ntlab.radishforandroidstudio.R.id.pad); pad.addListener(player); RWTShotButton shotButton = (RWTShotButton) f.findViewById(org.ntlab.radishforandroidstudio.R.id.bulletShot); shotButton.addListener(ownBulletsModel); Button jumpButton = (Button) f.findViewById(org.ntlab.radishforandroidstudio.R.id.Button); jumpButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { player.jump(); } }); } public void logout() { player.logout(); } @Override public void onDestroy() { System.out.println("destroy"); logout(); super.onDestroy(); } }