2012-08-04 2 views
1

Le code que j'utilise que je viens de prendre à partir d'un exemple et il ne construit un mur à ma scène:Comment construire des murs pour un labyrinthe/donjon?

/** This loop builds a wall out of individual bricks. */ 
    public void initWall() { 
    float startpt = brickLength/4; 
    float height = 0; 
    for (int j = 0; j < 15; j++) { 
     for (int i = 0; i < 6; i++) { 
     Vector3f vt = 
     new Vector3f(i * brickLength * 2 + startpt, brickHeight + height, 10); 
     makeBrick(vt); 
     } 
     startpt = -startpt; 
     height += 2 * brickHeight; 
    } 
    } 

    /** This method creates one individual physical brick. */ 
    public void makeBrick(Vector3f loc) { 
    /** Create a brick geometry and attach to scene graph. */ 
    Geometry brick_geo = new Geometry("brick", box); 
    brick_geo.setMaterial(wall_mat); 
    rootNode.attachChild(brick_geo); 
    /** Position the brick geometry */ 
    brick_geo.setLocalTranslation(loc); 
    /** Make brick physical with a mass > 0.0f. */ 
    brick_phy = new RigidBodyControl(2f); 
    /** Add physical brick to physics space. */ 
    brick_geo.addControl(brick_phy); 
    bulletAppState.getPhysicsSpace().add(brick_phy); 
    } 

enter image description here

Maintenant, je me demande si je devrais utiliser ce code pour construire un labyrinthe ensemble/donjon ou si cela est mieux modélisé en dehors du programme par exemple. dans un mélangeur plutôt comme un .scene et ensuite lire dans le programme? L'ensemble du programme est

package adventure; 

import java.applet.Applet; 
import com.jme3.math.Quaternion; 
import com.jme3.math.FastMath; 
import java.applet.AudioClip; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.TextArea; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import com.jme3.material.RenderState.FaceCullMode; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import com.jme3.renderer.queue.RenderQueue.ShadowMode; 
import com.jme3.animation.AnimChannel; 
import com.jme3.animation.AnimControl; 
import com.jme3.animation.AnimEventListener; 
import com.jme3.animation.LoopMode; 
import com.jme3.app.SimpleApplication; 
import com.jme3.asset.BlenderKey; 
import com.jme3.asset.TextureKey; 
import com.jme3.asset.plugins.ZipLocator; 
import com.jme3.bullet.BulletAppState; 
import com.jme3.bullet.PhysicsSpace; 
import com.jme3.bullet.collision.PhysicsCollisionEvent; 
import com.jme3.bullet.collision.PhysicsCollisionListener; 
import com.jme3.bullet.collision.shapes.CapsuleCollisionShape; 
import com.jme3.bullet.collision.shapes.CollisionShape; 
import com.jme3.bullet.collision.shapes.SphereCollisionShape; 
import com.jme3.bullet.control.CharacterControl; 
import com.jme3.bullet.control.RigidBodyControl; 
import com.jme3.bullet.util.CollisionShapeFactory; 
import com.jme3.effect.ParticleEmitter; 
import com.jme3.effect.ParticleMesh.Type; 
import com.jme3.effect.shapes.EmitterSphereShape; 
import com.jme3.input.ChaseCamera; 
import com.jme3.input.KeyInput; 
import com.jme3.input.controls.ActionListener; 
import com.jme3.input.controls.KeyTrigger; 
import com.jme3.light.DirectionalLight; 
import com.jme3.material.Material; 
import com.jme3.math.ColorRGBA; 
import com.jme3.math.Vector2f; 
import com.jme3.math.Vector3f; 
import com.jme3.post.FilterPostProcessor; 
import com.jme3.post.filters.BloomFilter; 
import com.jme3.renderer.Camera; 
import com.jme3.renderer.queue.RenderQueue.ShadowMode; 
import com.jme3.scene.Geometry; 
import com.jme3.scene.Node; 
import com.jme3.scene.Spatial; 
import com.jme3.scene.shape.Box; 
import com.jme3.scene.shape.Sphere; 
import com.jme3.scene.shape.Sphere.TextureMode; 
import com.jme3.system.AppSettings; 
import com.jme3.system.JmeCanvasContext; 
import com.jme3.terrain.geomipmap.TerrainLodControl; 
import com.jme3.terrain.geomipmap.TerrainQuad; 
import com.jme3.terrain.heightmap.AbstractHeightMap; 
import com.jme3.terrain.heightmap.ImageBasedHeightMap; 
import com.jme3.texture.Texture; 
import com.jme3.texture.Texture.WrapMode; 
import com.jme3.util.SkyFactory; 

public class MountainWorld extends SimpleApplication implements ActionListener, 
     PhysicsCollisionListener, AnimEventListener, Playable { 






     /** Prepare Materials */ 
     Material wall_mat; 
     Material stone_mat; 
     Material floor_mat; 

     /** Prepare geometries and physical nodes for bricks and cannon balls. */ 
     private RigidBodyControl brick_phy; 
     private static final Box box; 
     private RigidBodyControl ball_phy; 
     private static final Sphere sphere; 
     private RigidBodyControl floor_phy; 
     private static final Box floor; 

     /** dimensions used for bricks and wall */ 
     private static final float brickLength = 0.48f; 
     private static final float brickWidth = 0.24f; 
     private static final float brickHeight = 0.12f; 

     static { 
     /** Initialize the cannon ball geometry */ 
     sphere = new Sphere(32, 32, 0.4f, true, false); 
     sphere.setTextureMode(TextureMode.Projected); 
     /** Initialize the brick geometry */ 
     box = new Box(Vector3f.ZERO, brickLength, brickHeight, brickWidth); 
     box.scaleTextureCoordinates(new Vector2f(1f, .5f)); 
     /** Initialize the floor geometry */ 
     floor = new Box(Vector3f.ZERO, 100f, 0.1f, 50f); 
     floor.scaleTextureCoordinates(new Vector2f(3, 6)); 
     } 







    private static World world; 
    private static Person person; 
    private static Player dplayer; 
    private static TextArea textarea; 
    private BulletAppState bulletAppState; 
    private AnimChannel channel; 
    private AnimControl control; 
    // character 
    CharacterControl character; 
    Node model; 
    // temp vectors 
    Vector3f walkDirection = new Vector3f(); 
    // terrain 
    TerrainQuad terrain; 
    RigidBodyControl terrainPhysicsNode; 
    // Materials 
    Material matRock; 
    Material matBullet; 
    // animation 
    AnimChannel animationChannel; 
    AnimChannel shootingChannel; 
    AnimControl animationControl; 
    float airTime = 0; 
    // camera 
    boolean left = false, right = false, up = false, down = false; 
    ChaseCamera chaseCam; 
    // bullet 
    Sphere bullet; 
    SphereCollisionShape bulletCollisionShape; 
    // explosion 
    ParticleEmitter effect; 
    // brick wall 
    Box brick; 
    float bLength = 0.8f; 
    float bWidth = 0.4f; 
    float bHeight = 0.4f; 
    FilterPostProcessor fpp; 
    private Spatial sceneModel; 

    private RigidBodyControl landscape; 
    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       AppSettings settings = new AppSettings(true); 
       settings.setWidth(850); 
       settings.setHeight(440); 

       MountainWorld canvasApplication = new MountainWorld(); 
       canvasApplication.setSettings(settings); 
       canvasApplication.createCanvas(); // create canvas! 
       JmeCanvasContext ctx = (JmeCanvasContext) canvasApplication 
         .getContext(); 
       ctx.setSystemListener(canvasApplication); 
       Dimension dim = new Dimension(640, 480); 
       ctx.getCanvas().setPreferredSize(dim); 

       JFrame window = new JFrame("Dungeon World"); 
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JPanel panel = new JPanel(new BorderLayout()); // a panel 
       world = new DungeonWorld(canvasApplication); 
       person = new Person(world, "You", null); 
       dplayer = new Player(world, person); 
       Commands commands = new Commands(person); 
       textarea = new TextArea("", 10, 60, 
         TextArea.SCROLLBARS_VERTICAL_ONLY); 
       textarea.append("You are in a dungeon. The horrible shrieks of the undead chill your bones.\n"); 
       textarea.setEditable(false); 
       panel.add("West", ctx.getCanvas()); 
       panel.add("East", commands); 
       panel.add("South", textarea); 
       window.add(panel); 
       window.pack(); 
       window.setVisible(true); 
       canvasApplication.startCanvas(); 

      } 
     }); 
    } 

    @Override 
    public void simpleInitApp() { 
     bulletAppState = new BulletAppState(); 
     bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); 
     stateManager.attach(bulletAppState); 
     setupKeys(); 
     //prepareBullet(); 
     //prepareEffect(); 
     createLight(); 
     //createSky(); 
     initMaterials(); 
     initFloor(); 
     initWall(); 
     //createTerrain(); 
     //createWall(); 
     createCharacters(); 
     setupChaseCamera(); 
     setupAnimationController(); 
     setupFilter(); 
    } 

     /** This loop builds a wall out of individual bricks. */ 
     public void initWall() { 
     float startpt = brickLength/4; 
     float height = 0; 
     for (int j = 0; j < 15; j++) { 
      for (int i = 0; i < 6; i++) { 
      Vector3f vt = 
      new Vector3f(i * brickLength * 2 + startpt, brickHeight + height, 10); 
      makeBrick(vt); 
      } 
      startpt = -startpt; 
      height += 2 * brickHeight; 
     } 
     } 

     /** This method creates one individual physical brick. */ 
     public void makeBrick(Vector3f loc) { 
     /** Create a brick geometry and attach to scene graph. */ 
     Geometry brick_geo = new Geometry("brick", box); 
     brick_geo.setMaterial(wall_mat); 
     rootNode.attachChild(brick_geo); 
     /** Position the brick geometry */ 
     brick_geo.setLocalTranslation(loc); 
     /** Make brick physical with a mass > 0.0f. */ 
     brick_phy = new RigidBodyControl(2f); 
     /** Add physical brick to physics space. */ 
     brick_geo.addControl(brick_phy); 
     bulletAppState.getPhysicsSpace().add(brick_phy); 
     } 

    /** Make a solid floor and add it to the scene. */ 
     public void initFloor() { 
     Geometry floor_geo = new Geometry("Floor", floor); 
     floor_geo.setMaterial(floor_mat); 
     floor_geo.setLocalTranslation(0, -0.1f, 0); 
     this.rootNode.attachChild(floor_geo); 
     /* Make the floor physical with mass 0.0f! */ 
     floor_phy = new RigidBodyControl(0.0f); 
     floor_geo.addControl(floor_phy); 
     bulletAppState.getPhysicsSpace().add(floor_phy); 
     } 

     /** Initialize the materials used in this scene. */ 
     public void initMaterials() { 
     wall_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
     TextureKey key = new TextureKey("Textures/Terrain/BrickWall/BrickWall.jpg"); 
     key.setGenerateMips(true); 
     Texture tex = assetManager.loadTexture(key); 
     wall_mat.setTexture("ColorMap", tex); 

     stone_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
     TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); 
     key2.setGenerateMips(true); 
     Texture tex2 = assetManager.loadTexture(key2); 
     stone_mat.setTexture("ColorMap", tex2); 

     floor_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
     TextureKey key3 = new TextureKey("Textures/Terrain/Pond/Pond.jpg"); 
     key3.setGenerateMips(true); 
     Texture tex3 = assetManager.loadTexture(key3); 
     tex3.setWrap(WrapMode.Repeat); 
     floor_mat.setTexture("ColorMap", tex3); 
     } 


    private void setupFilter() { 
     FilterPostProcessor fpp = new FilterPostProcessor(assetManager); 
     BloomFilter bloom = new BloomFilter(BloomFilter.GlowMode.Objects); 
     fpp.addFilter(bloom); 
     viewPort.addProcessor(fpp); 
    } 

    private PhysicsSpace getPhysicsSpace() { 
     return bulletAppState.getPhysicsSpace(); 
    } 

    private void setupKeys() { 
     inputManager.addMapping("wireframe", new KeyTrigger(KeyInput.KEY_T)); 
     inputManager.addListener(this, "wireframe"); 
     inputManager.addMapping("CharLeft", new KeyTrigger(KeyInput.KEY_A)); 
     inputManager.addMapping("CharRight", new KeyTrigger(KeyInput.KEY_D)); 
     inputManager.addMapping("CharUp", new KeyTrigger(KeyInput.KEY_W)); 
     inputManager.addMapping("CharDown", new KeyTrigger(KeyInput.KEY_S)); 
     inputManager.addMapping("CharSpace", 
       new KeyTrigger(KeyInput.KEY_RETURN)); 
     inputManager 
       .addMapping("CharShoot", new KeyTrigger(KeyInput.KEY_SPACE)); 
     inputManager.addListener(this, "CharLeft"); 
     inputManager.addListener(this, "CharRight"); 
     inputManager.addListener(this, "CharUp"); 
     inputManager.addListener(this, "CharDown"); 
     inputManager.addListener(this, "CharSpace"); 
     inputManager.addListener(this, "CharShoot"); 
    } 

    private void createWall() { 
     float xOff = -144; 
     float zOff = -40; 
     float startpt = bLength/4 - xOff; 
     float height = 6.1f; 
     brick = new Box(Vector3f.ZERO, bLength, bHeight, bWidth); 
     brick.scaleTextureCoordinates(new Vector2f(1f, .5f)); 
     for (int j = 0; j < 15; j++) { 
      for (int i = 0; i < 4; i++) { 
       Vector3f vt = new Vector3f(i * bLength * 2 + startpt, bHeight 
         + height, zOff); 
       addBrick(vt); 
      } 
      startpt = -startpt; 
      height += 1.01f * bHeight; 
     } 
    } 

    private void addBrick(Vector3f ori) { 
     Geometry reBoxg = new Geometry("brick", brick); 
     reBoxg.setMaterial(matBullet); 
     reBoxg.setLocalTranslation(ori); 
     reBoxg.addControl(new RigidBodyControl(1.5f)); 
     reBoxg.setShadowMode(ShadowMode.CastAndReceive); 
     this.rootNode.attachChild(reBoxg); 
     this.getPhysicsSpace().add(reBoxg); 
    } 

    private void prepareBullet() { 
     bullet = new Sphere(32, 32, 0.4f, true, false); 
     bullet.setTextureMode(TextureMode.Projected); 
     bulletCollisionShape = new SphereCollisionShape(0.4f); 
     matBullet = new Material(getAssetManager(), 
       "Common/MatDefs/Misc/Unshaded.j3md"); 
     matBullet.setColor("Color", ColorRGBA.Green); 
     // matBullet.setColor("m_GlowColor", ColorRGBA.Green); 
     getPhysicsSpace().addCollisionListener(this); 
    } 

    private void prepareEffect() { 
     int COUNT_FACTOR = 1; 
     float COUNT_FACTOR_F = 1f; 
     effect = new ParticleEmitter("Flame", Type.Triangle, 32 * COUNT_FACTOR); 
     effect.setSelectRandomImage(true); 
     effect.setStartColor(new ColorRGBA(1f, 0.4f, 0.05f, 
       (float) (1f/COUNT_FACTOR_F))); 
     effect.setEndColor(new ColorRGBA(.4f, .22f, .12f, 0f)); 
     effect.setStartSize(1.3f); 
     effect.setEndSize(2f); 
     effect.setShape(new EmitterSphereShape(Vector3f.ZERO, 1f)); 
     effect.setParticlesPerSec(0); 
     effect.setGravity(0, -5, 0); 
     effect.setLowLife(.4f); 
     effect.setHighLife(.5f); 
     effect.setInitialVelocity(new Vector3f(0, 7, 0)); 
     effect.setVelocityVariation(1f); 
     effect.setImagesX(2); 
     effect.setImagesY(2); 
     Material mat = new Material(assetManager, 
       "Common/MatDefs/Misc/Particle.j3md"); 
     mat.setTexture("Texture", 
       assetManager.loadTexture("Effects/Explosion/flame.png")); 
     effect.setMaterial(mat); 
     // effect.setLocalScale(100); 
     rootNode.attachChild(effect); 
    } 

    private void createLight() { 
     Vector3f direction = new Vector3f(-0.1f, -0.7f, -1).normalizeLocal(); 
     DirectionalLight dl = new DirectionalLight(); 
     dl.setDirection(direction); 
     dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); 
     rootNode.addLight(dl); 
    } 

    private void createSky() { 
     rootNode.attachChild(SkyFactory.createSky(assetManager, 
       "Textures/Sky/Bright/BrightSky.dds", false)); 
    } 

    private void createTerrain2() { 
     matRock = new Material(assetManager, 
       "Common/MatDefs/Terrain/TerrainLighting.j3md"); 
     matRock.setBoolean("useTriPlanarMapping", false); 
     matRock.setBoolean("WardIso", true); 
     matRock.setTexture("AlphaMap", 
       assetManager.loadTexture("Textures/Terrain/splat/alphamap.png")); 
     Texture heightMapImage = assetManager 
       .loadTexture("Textures/Terrain/splat/mountains512.png"); 
     Texture grass = assetManager 
       .loadTexture("Textures/Terrain/splat/grass.jpg"); 
     grass.setWrap(WrapMode.Repeat); 
     matRock.setTexture("DiffuseMap", grass); 
     matRock.setFloat("DiffuseMap_0_scale", 64); 
     Texture dirt = assetManager 
       .loadTexture("Textures/Terrain/splat/dirt.jpg"); 
     dirt.setWrap(WrapMode.Repeat); 
     matRock.setTexture("DiffuseMap_1", dirt); 
     matRock.setFloat("DiffuseMap_1_scale", 16); 
     Texture rock = assetManager 
       .loadTexture("Textures/Terrain/splat/road.jpg"); 
     rock.setWrap(WrapMode.Repeat); 
     matRock.setTexture("DiffuseMap_2", rock); 
     matRock.setFloat("DiffuseMap_2_scale", 128); 
     Texture normalMap0 = assetManager 
       .loadTexture("Textures/Terrain/splat/grass_normal.jpg"); 
     normalMap0.setWrap(WrapMode.Repeat); 
     Texture normalMap1 = assetManager 
       .loadTexture("Textures/Terrain/splat/dirt_normal.png"); 
     normalMap1.setWrap(WrapMode.Repeat); 
     Texture normalMap2 = assetManager 
       .loadTexture("Textures/Terrain/splat/road_normal.png"); 
     normalMap2.setWrap(WrapMode.Repeat); 
     matRock.setTexture("NormalMap", normalMap0); 
     matRock.setTexture("NormalMap_1", normalMap2); 
     matRock.setTexture("NormalMap_2", normalMap2); 

     AbstractHeightMap heightmap = null; 
     try { 
      heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 
        0.25f); 
      heightmap.load(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap()); 
     List<Camera> cameras = new ArrayList<Camera>(); 
     cameras.add(getCamera()); 
     TerrainLodControl control = new TerrainLodControl(terrain, cameras); 
     terrain.addControl(control); 
     terrain.setMaterial(matRock); 
     terrain.setLocalScale(new Vector3f(2, 2, 2)); 

     terrainPhysicsNode = new RigidBodyControl(
       CollisionShapeFactory.createMeshShape(terrain), 0); 
     terrain.addControl(terrainPhysicsNode); 
     rootNode.attachChild(terrain); 
     getPhysicsSpace().add(terrainPhysicsNode); 
    } 

    private void createTerrain() { 


     assetManager.registerLocator("town.zip", ZipLocator.class); 
     sceneModel = assetManager.loadModel("main.scene"); 
     //sceneModel = assetManager.loadModel("Scenes/ManyLights/Main.scene"); 
     sceneModel.setLocalScale(2f); 
     //initFloor(); 
     // We set up collision detection for the scene by creating a 
     // compound collision shape and a static RigidBodyControl with mass 
     // zero. 
     CollisionShape sceneShape = CollisionShapeFactory 
       .createMeshShape((Node) sceneModel); 
     landscape = new RigidBodyControl(sceneShape, 0); 
     sceneModel.addControl(landscape); 
     List<Camera> cameras = new ArrayList<Camera>(); 
     cameras.add(getCamera()); 
     rootNode.attachChild(sceneModel); 
    } 

    private void createCharacters() { 
     CapsuleCollisionShape capsule = new CapsuleCollisionShape(0.0f, 0.0f); 
     character = new CharacterControl(capsule, 0.01f); 
     model = (Node) assetManager.loadModel("Models/Ninja/Ninja.mesh.xml"); 
     float scale = 0.25f; 
     model.scale(0.05f, 0.05f, 0.05f); 
     model.addControl(character); 
     character.setPhysicsLocation(new Vector3f(0, -0.05f, 0)); 
     model.setShadowMode(ShadowMode.CastAndReceive); 
     character.setViewDirection(new Vector3f(1, 0, 0)); 
     rootNode.attachChild(model); 
     getPhysicsSpace().add(character); 

     BlenderKey blenderKey = new BlenderKey("Models/Oto/Oto.mesh.xml"); 

     Spatial man = (Spatial) assetManager.loadModel(blenderKey); 
     man.setLocalTranslation(new Vector3f(-10, 4.5f, -10)); 

     man.setShadowMode(ShadowMode.CastAndReceive); 
     rootNode.attachChild(man); 

    } 

    private void setupChaseCamera() { 
     flyCam.setEnabled(false); 
     chaseCam = new ChaseCamera(cam, model, inputManager); 
    } 

    private void setupAnimationController() { 
     animationControl = model.getControl(AnimControl.class); 
     animationControl.addListener(this); 
     animationChannel = animationControl.createChannel(); 
     // shootingChannel = animationControl.createChannel(); 
     // shootingChannel.addBone(animationControl.getSkeleton().getBone(
     // "uparm.right")); 
     // shootingChannel.addBone(animationControl.getSkeleton().getBone(
     // "arm.right")); 
     // shootingChannel.addBone(animationControl.getSkeleton().getBone(
     // "hand.right")); 
    } 

    @Override 
    public void simpleUpdate(float tpf) { 
     Vector3f camDir = cam.getDirection().clone().multLocal(0.1f); 
     Vector3f camLeft = cam.getLeft().clone().multLocal(0.1f); 
     camDir.y = 0; 
     camLeft.y = 0; 
     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()); 
     } 
     if (!character.onGround()) { 
      airTime = airTime + tpf; 
     } else { 
      airTime = 0; 
     } 
     if (walkDirection.length() == 0) { 
      if (!"Idle1".equals(animationChannel.getAnimationName())) { 
       animationChannel.setAnim("Idle1", 1f); 
      } 
     } else { 
      character.setViewDirection(walkDirection); 
      if (airTime > .3f) { 
       if (!"stand".equals(animationChannel.getAnimationName())) { 
        animationChannel.setAnim("stand"); 
       } 
      } else if (!"Walk".equals(animationChannel.getAnimationName())) { 
       animationChannel.setAnim("Walk", 0.7f); 
      } 
     } 
     character.setWalkDirection(walkDirection); 
    } 

    public void onAction(String binding, boolean value, float tpf) { 
     if (binding.equals("CharLeft")) { 
      if (value) { 
       left = true; 
      } else { 
       left = false; 
      } 
     } else if (binding.equals("CharRight")) { 
      if (value) { 
       right = true; 
      } else { 
       right = false; 
      } 
     } else if (binding.equals("CharUp")) { 
      if (value) { 
       up = true; 
      } else { 
       up = false; 
      } 
     } else if (binding.equals("CharDown")) { 
      if (value) { 
       down = true; 
      } else { 
       down = false; 
      } 
     } else if (binding.equals("CharSpace")) { 
      character.jump(); 
     } else if (binding.equals("CharShoot") && !value) { 
      bulletControl(); 
     } 
    } 

    private void bulletControl() { 
     shootingChannel.setAnim("Dodge", 0.1f); 
     shootingChannel.setLoopMode(LoopMode.DontLoop); 
     Geometry bulletg = new Geometry("bullet", bullet); 
     bulletg.setMaterial(matBullet); 
     bulletg.setShadowMode(ShadowMode.CastAndReceive); 
     bulletg.setLocalTranslation(character.getPhysicsLocation().add(
       cam.getDirection().mult(5))); 
     RigidBodyControl bulletControl = new BombControl(bulletCollisionShape, 
       1); 
     bulletControl.setCcdMotionThreshold(0.1f); 
     bulletControl.setLinearVelocity(cam.getDirection().mult(80)); 
     bulletg.addControl(bulletControl); 
     rootNode.attachChild(bulletg); 
     getPhysicsSpace().add(bulletControl); 
    } 

    public void collision(PhysicsCollisionEvent event) { 
     if (event.getObjectA() instanceof BombControl) { 
      final Spatial node = event.getNodeA(); 
      effect.killAllParticles(); 
      effect.setLocalTranslation(node.getLocalTranslation()); 
      effect.emitAllParticles(); 
     } else if (event.getObjectB() instanceof BombControl) { 
      final Spatial node = event.getNodeB(); 
      effect.killAllParticles(); 
      effect.setLocalTranslation(node.getLocalTranslation()); 
      effect.emitAllParticles(); 
     } 
    } 

    public void onAnimCycleDone(AnimControl control, AnimChannel channel, 
      String animName) { 
     if (channel == shootingChannel) { 
      channel.setAnim("stand"); 
     } 
    } 

    public void onAnimChange(AnimControl control, AnimChannel channel, 
      String animName) { 
    } 

    // Load an image from the net, making sure it has already been 
    // loaded when the method returns 
    public Image loadPicture(String imageName) { 
     return null; 
    } 

    // Load and play a sound from /usr/local/hacks/sounds/ 

    public void playSound(String name) { 
     URL u = null; 

     try { 
      u = new URL("file:" + "/usr/local/hacks/sounds/" + name + ".au"); 
     } catch (MalformedURLException e) { 
     } 

     AudioClip a = Applet.newAudioClip(u); 
     a.play(); 
    } 
} 
+1

Est-ce que votre question "dois-je générer le labyrinthe en Java au moment de l'exécution ou charger un fichier' .scene'? ", Ou est votre question" Quels sont les bons [algorithmes] (http://en.wikipedia.org/ wiki/Maze_generation_algorithm) pour [génération de labyrinthe] (http://www.astrolog.org/labyrnth/algrithm.htm#create) "? – tiwo

Répondre

3

Dans votre exemple, vous avez environ 100+ briques - imaginez combien d'entre eux, vous aurez besoin pour donjon complet et comment il va tuer votre performance physique :). Il est presque impossible de créer un jeu jouable avec cette approche.

Vous devez créer un maillage statique et le diviser en couloirs, pièces, etc. pour que vous ne puissiez dessiner qu'une partie visible de votre niveau. Si vous voulez vraiment créer un environnement destructible, vous devez toujours utiliser un maillage statique et en remplacer dynamiquement des parties avec les briques lorsque le mur devrait être détruit.

Questions connexes