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

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import org.ntlab.radishforandroidstudio.R;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTSprite;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment;
import org.ntlab.radishforandroidstudio.framework.gameMain.RealTimeActivity;
import org.ntlab.radishforandroidstudio.framework.listener.PadListener;
import org.ntlab.radishforandroidstudio.framework.model3D.Object3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Universe;
import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D;
import org.ntlab.radishforandroidstudio.framework.physics.Force3D;
import org.ntlab.radishforandroidstudio.framework.physics.PhysicalSystem;
import org.ntlab.radishforandroidstudio.framework.physics.Solid3D;
import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D;
import org.ntlab.radishforandroidstudio.framework.subject.PadSubject;
import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D;
import org.ntlab.radishforandroidstudio.java3d.Appearance;
import org.ntlab.radishforandroidstudio.java3d.Box;
import org.ntlab.radishforandroidstudio.java3d.Material;
import org.ntlab.radishforandroidstudio.java3d.TextureCubeMap;
import org.ntlab.radishforandroidstudio.java3d.TextureLoader;
import org.ntlab.radishforandroidstudio.java3d.Transform3D;

public class TestActivity extends RealTimeActivity {
    private PhysicalSystem physicalSystem;
    private Object3D groundObj;
    private Solid3D ground;
    private Transform3D initTrans;
    private Solid3D diceObj;
    private long time = 0;
    private int side = 0;

    private RWTSurfaceView view = null;

    private RWTSprite[] sprite = new RWTSprite[3];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 3Dモデルの作成
        Universe universe = new Universe();

        // サイコロの作成
        Appearance ap1 = new Appearance();
        TextureCubeMap tex1 = new TextureCubeMap(TextureCubeMap.BASE_LEVEL, TextureCubeMap.RGB, 0);
        TextureLoader loader = new TextureLoader(getResources(), R.drawable.dice_1, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP);
        tex1.setImage(0, TextureCubeMap.POSITIVE_Z, loader.getImage());
        loader = new TextureLoader(getResources(), R.drawable.dice_6, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP);
        tex1.setImage(0, TextureCubeMap.NEGATIVE_Z, loader.getImage());
        loader = new TextureLoader(getResources(), R.drawable.dice_4, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP);
        tex1.setImage(0, TextureCubeMap.POSITIVE_X, loader.getImage());
        loader = new TextureLoader(getResources(), R.drawable.dice_3, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP);
        tex1.setImage(0, TextureCubeMap.NEGATIVE_X, loader.getImage());
        loader = new TextureLoader(getResources(), R.drawable.dice_5, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP);
        tex1.setImage(0, TextureCubeMap.POSITIVE_Y, loader.getImage());
        loader = new TextureLoader(getResources(), R.drawable.dice_2, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP);
        tex1.setImage(0, TextureCubeMap.NEGATIVE_Y, loader.getImage());
        ap1.setTexture(tex1);
        physicalSystem = new PhysicalSystem();
        Box b1 = new Box(1.0f, 1.0f, 1.0f, ap1);
        Object3D obj1 = new Object3D("box", b1);
        obj1.apply(new Position3D(0.0 , 30.0, 0.0), false);
        diceObj = new Solid3D(obj1);
        diceObj.scale(2.0, 2.0, 2.0);
        diceObj.apply(new AngularVelocity3D(-0.4, 0.0, -0.6), false);
        universe.place(diceObj);
        physicalSystem.add(diceObj);
        initTrans = new Transform3D();
        obj1.rot.getTransform(initTrans);

        // 地面の作成
        Appearance ap2 = new Appearance();
        Material m = new Material();
        m.setDiffuseColor(1.0f, 1.0f, 1.0f);
        m.setAmbientColor(0.5f, 0.5f, 0.5f);
        m.setSpecularColor(0.0f, 0.0f, 0.0f);
        m.setShininess(1.0f);
        ap2.setMaterial(m);

        Box b2 = new Box(1.0f, 1.0f, 1.0f, ap1);
        groundObj = new Object3D("ground", b2);
        groundObj.apply(new Position3D(0.0, -3.0, 0.0), false);
        groundObj.scale(100.0, 3.0, -50.0);
        ground = new Solid3D(groundObj);
        ground.setMass(100000000);
        universe.place(ground);
        physicalSystem.add(ground);

        // カメラの作成
        Camera3D camera = new Camera3D(universe);
        camera.setViewPoint(new Position3D(0.0, 30, -30.0));
        camera.addTarget(diceObj);

        // 画面との関連付け
        FrameLayout l = findViewById(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();
        Fragment f = new RWTUIFragment();
        View uiLayout = (View)findViewById(R.id.ui_layout);
        uiLayout.setOnTouchListener((RWTUIFragment)f);
        transaction.add(R.id.ui_layout, f);
        transaction.commit();

        start(10);
    }

    @Override
    protected void update(long interval) {
        ground.apply(new Position3D(0.0, -3.0, 0.0), false);
        ground.apply(new Velocity3D(), false);
        groundObj.rot.setTransform(initTrans);

        long newTime = System.nanoTime();
        physicalSystem.motion(0, 10, Force3D.ZERO, physicalSystem.objects.get(0).getGravityCenter(), null);
        //        Log.v("moji", "" + ((System.nanoTime()-newTime)/1000.0));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        physicalSystem.objects.get(0).setPosition(new Position3D(0.0 , 30.0, 0.0));
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}