(Java)Membuat dinding dan lantai model adegan _ Jmonkey

diding
Perjalanan jauh dan makin jauh hingga ke ujung dunia mari kita hampiri,Tutorial kali ini menunjukkan bagaimana agan memuat model adegan dan memberikan dinding solid dan lantai untuk karakter untuk berjalan-jalan. agan menggunakan RigidBodyControl untuk adegan collidable statis, dan CharacterControl untuk ponsel karakter user. agan juga belajar bagaimana mengatur default kamera user untuk bekerja dengan navigasi fisika dikendalikan. agan dapat menggunakan solusi yang ditampilkan di sini untuk penembak orang pertama, labirin, dan permainan serupa. dari beberapa code di bawah ini, banyak sekali implementasi fisiki dan matematika yang kita mainkan, karena pada saat peletakan dinding dan lantai harus sesuai.

FIle yang di butuhkan town.zip dapat di download Sini

Create Project dengan nama HelloCollision dan ketikkan program di bawah ini:

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.ZipLocator;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
import com.jme3.bullet.collision.shapes.CollisionShape;
import com.jme3.bullet.control.CharacterControl;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.bullet.util.CollisionShapeFactory;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;

/**
 * test
 * @author Victor Annabe
 */
public class Main extends SimpleApplication implements ActionListener{

    private Spatial sceneModel;
  private BulletAppState bulletAppState;
  private RigidBodyControl landscape;
  private CharacterControl player;
  private Vector3f walkDirection = new Vector3f();
  private boolean left = false, right = false, up = false, down = false;
 
  public static void main(String[] args) {
    Main app = new Main();
    app.start();
  }
 
  public void simpleInitApp() {
    bulletAppState = new BulletAppState();
    stateManager.attach(bulletAppState);
   
    viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));
    flyCam.setMoveSpeed(100);
    setUpKeys();
    setUpLight();
 
    assetManager.registerLocator("G:/town.zip", ZipLocator.class);
    sceneModel = assetManager.loadModel("main.scene");
    sceneModel.setLocalScale(2f);
 
    CollisionShape sceneShape =
            CollisionShapeFactory.createMeshShape((Node) sceneModel);
    landscape = new RigidBodyControl(sceneShape, 0);
    sceneModel.addControl(landscape);
 
    CapsuleCollisionShape capsuleShape = new CapsuleCollisionShape(1.5f, 6f, 1);
    player = new CharacterControl(capsuleShape, 0.05f);
    player.setJumpSpeed(20);
    player.setFallSpeed(30);
    player.setGravity(30);
    player.setPhysicsLocation(new Vector3f(0, 10, 0));
 
    rootNode.attachChild(sceneModel);
    bulletAppState.getPhysicsSpace().add(landscape);
    bulletAppState.getPhysicsSpace().add(player);
  }
 
  private void setUpLight() {
    AmbientLight al = new AmbientLight();
    al.setColor(ColorRGBA.White.mult(1.3f));
    rootNode.addLight(al);
 
    DirectionalLight dl = new DirectionalLight();
    dl.setColor(ColorRGBA.White);
    dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal());
    rootNode.addLight(dl);
  }
 
  private void setUpKeys() {
    inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_A));
    inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_D));
    inputManager.addMapping("Up", new KeyTrigger(KeyInput.KEY_W));
    inputManager.addMapping("Down", new KeyTrigger(KeyInput.KEY_S));
    inputManager.addMapping("Jump", new KeyTrigger(KeyInput.KEY_SPACE));
    inputManager.addListener(this, "Left");
    inputManager.addListener(this, "Right");
    inputManager.addListener(this, "Up");
    inputManager.addListener(this, "Down");
    inputManager.addListener(this, "Jump");
  }
 
  public void onAction(String binding, boolean value, float tpf) {
    if (binding.equals("Left")) {
      left = value;
    } else if (binding.equals("Right")) {
      right = value;
    } else if (binding.equals("Up")) {
      up = value;
    } else if (binding.equals("Down")) {
      down = value;
    } else if (binding.equals("Jump")) {
      player.jump();
    }
  }
 
  @Override
  public void simpleUpdate(float tpf) {
    Vector3f camDir = cam.getDirection().clone().multLocal(0.6f);
    Vector3f camLeft = cam.getLeft().clone().multLocal(0.4f);
    walkDirection.set(0, 0, 0);
    if (left)  { walkDirection.addLocal(camLeft); }
    if (right) { walkDirection.addLocal(camLeft.negate()); }
    if (up)    { walkDirection.addLocal(camDir); }
    if (down)  { walkDirection.addLocal(camDir.negate()); }
    player.setWalkDirection(walkDirection);
    cam.setLocation(player.getPhysicsLocation());
  }
}
 

Penjelasan

 public class Main extends SimpleApplication implements ActionListener{

bahwa dalam class main kita menurunkan sifat SimpleApplication karena ini merupakan class dasar untuk semua jME3 dan kita menginterface kan ActionListener agar membuat inputan navigasi
  private Spatial sceneModel;
  private BulletAppState bulletAppState;
  private RigidBodyControl landscape;
  private CharacterControl player;
  private Vector3f walkDirection = new Vector3f();
  private boolean left = false, right = false, up = false, down = false;

Mendeklarasikan berbagai bidang :

- TBulletAppState memberikan ini akses ke fitur SimpleApplication fisika (seperti deteksi tabrakan) yang disediakan oleh integrasi jBullet jME3 ini
- Tata Ruang sceneModel adalah untuk memuat model OgreXML dari kota.
- RigidBodyControl untuk membuat model kota padat.
- The (invisible) orang pertama pemain diwakili oleh objek CharacterControl.
- Bidang walkDirection dan empat Booleans digunakan untuk navigasi fisika dikendalikan.
  viewPort.setBackgroundColor(new ColorRGBA(0.7f,0.8f,1f,1f));
    flyCam.setMoveSpeed(100);
    setUpKeys();
    setUpLight();

- mengatur warna latar belakang sampai biru, karena ini adalah sebuah adegan dengan langit.
- repurpose default kamera kontrol "flyCam" sebagai kamera pertama-orang dan mengatur kecepatan.
- Method setUpLights tambahan () menambahkan sumber cahaya Anda.
- Method setUpKeys tambahan () mengkonfigurasi masukan pemetaan.
    bulletAppState = new BulletAppState();
    stateManager.attach(bulletAppState);

    assetManager.registerLocator("town.zip", ZipLocator.class);
    sceneModel = assetManager.loadModel("main.scene");
    sceneModel.setLocalScale(2f);

assetManager.registerLocator merupakan tempat dimana kita akan meload data model yang akan di masukkan ke bidang kanvas.

   CollisionShape sceneShape = CollisionShapeFactory.createMeshShape((Node) sceneModel);
    landscape = new RigidBodyControl(sceneShape, 0);
    sceneModel.addControl(landscape);
    rootNode.attachChild(sceneModel);

Untuk menggunakan deteksi kesesuaian, agan menambahkan RigidBodyControl kepada sceneModel Ruang. The RigidBodyControl untuk model yang kompleks membutuhkan dua argumen: Sebuah Bentuk kesesuaian, dan massa benda.

JME3 menawarkan CollisionShapeFactory yang precalculates tabrakan bentuk mesh akurat untuk Ruang. agan memilih untuk menghasilkan CompoundCollisionShape (yang memiliki MeshCollisionShapes sebagai anak-anaknya) karena jenis ini berbentuk tabrakan yang optimal untuk objek bergerak, seperti medan, rumah, dan tingkat penembak utuh.
agan menetapkan massa ke nol karena adegan statis dan massanya adalah irrevelant.
Tambahkan kontrol ke Spasial untuk memberikan sifat fisik.
Seperti biasa, pasang sceneModel untuk rootNode untuk membuatnya terlihat.
Tip: Jangan lupa untuk menambahkan sumber cahaya sehingga agan dapat melihat adegan.
 private void setUpKeys() {
    inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_A));
    inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_D));
    inputManager.addMapping("Up", new KeyTrigger(KeyInput.KEY_W));
    inputManager.addMapping("Down", new KeyTrigger(KeyInput.KEY_S));
    inputManager.addMapping("Jump", new KeyTrigger(KeyInput.KEY_SPACE));
    inputManager.addListener(this, "Left");
    inputManager.addListener(this, "Right");
    inputManager.addListener(this, "Up");
    inputManager.addListener(this, "Down");
    inputManager.addListener(this, "Jump");
  }

model digunakan untuk menginputkan aktifitas gerak yang digunakan dalam sebuah game biasanya, aktifitas mouse dan keyboard sebagai default input system.

dan untuk code di bawahnya sudah saya jelaskan di postingan sebelumnya mengenai inputsystem dan sebagainya, sehingga jika agan belum membaca postingan sebelumnya silakan datang ke postingan sebelumnya. Terima kasih

Advertisements

Published by

jarcode

hello I am jarcode

2 thoughts on “(Java)Membuat dinding dan lantai model adegan _ Jmonkey”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s