Some help with collision!

Hello! I got a problem when i try to enable collision to a box. I followed the HelloCollision Tutorial and i simply copy-pasted the code which makes the scene solid so i can create the similar for the box. But i get the error “The method addControl(Control) in the type Spatial is not applicable for the arguments (CollisionShape)”.

Am i doing something wrong?I searched but i couldn’t find something similar.



My code :

[java]package main;

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.font.BitmapText;

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.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Vector3f;

import com.jme3.scene.Geometry;

import com.jme3.scene.Node;

import com.jme3.scene.Spatial;

import com.jme3.scene.shape.Box;

/**

  • Example 9 - How to make walls and floors solid.
  • This version uses Physics and a custom Action Listener.
  • @author normen, with edits by Zathras

    /

    public class Collision extends SimpleApplication

    implements ActionListener{

    private Spatial blue;

    private Spatial sceneModel;

    private RigidBodyControl boxCol;

    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) {

    Collision app = new Collision();

    app.start();

    }

    public void simpleInitApp() {





    /
    * Set up Physics /

    bulletAppState = new BulletAppState();

    stateManager.attach(bulletAppState);

    // We re-use the flyby camera control for rotation, while positioning is handled by physics

    viewPort.setBackgroundColor(new ColorRGBA(0.7f,0.8f,1f,1f));

    flyCam.setMoveSpeed(500);

    initCrossHairs();

    setUpKeys();

    setUpLight();

    // We load the scene from the zip file and adjust its size.

    assetManager.registerLocator("town.zip", ZipLocator.class.getName());



    sceneModel = assetManager.loadModel("main.scene");



    Box box1 = new Box( new Vector3f(1,1,1), 1,1,1);

    blue = new Geometry("Box", box1);

    Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");

    mat1.setColor("Color", ColorRGBA.Blue);

    blue.setMaterial(mat1);

    blue.scale(10f);



    rootNode.attachChild(blue);

    // sceneModel.setLocalScale(0.5f);



    // We set up collision detection for the scene by creating a

    // compound collision shape and a static physics node with mass zero.

    CollisionShape sceneShape =

    CollisionShapeFactory.createMeshShape((Node) sceneModel);

    landscape = new RigidBodyControl(sceneShape, 0);



    sceneModel.addControl(landscape);





    CollisionShape boxShape=

    CollisionShapeFactory.createMeshShape(blue);

    boxCol= new RigidBodyControl(boxShape, 0);

    blue.addControl(boxShape);





    // We set up collision detection for the player by creating

    // a capsule collision shape and a physics character node.

    // The physics character node offers extra settings for

    // size, stepheight, jumping, falling, and gravity.

    // We also put the player in its starting position.

    CapsuleCollisionShape capsuleShape = new CapsuleCollisionShape(1.5f, 6f, 1);

    player = new CharacterControl(capsuleShape, 0.05f);

    player.setJumpSpeed(20);

    player.setFallSpeed(50);

    player.setGravity(50);

    player.setPhysicsLocation(new Vector3f(0, 10, 0));

    // We attach the scene and the player to the rootnode and the physics space,

    // to make them appear in the game world.

    rootNode.attachChild(sceneModel);

    bulletAppState.getPhysicsSpace().add(boxCol);

    bulletAppState.getPhysicsSpace().add(landscape);

    bulletAppState.getPhysicsSpace().add(player);

    }

    private void setUpLight() {

    // We add light so we see the scene

    AmbientLight ambLight = new AmbientLight();

    ambLight.setColor(ColorRGBA.White);

    rootNode.addLight(ambLight);

    DirectionalLight dl = new DirectionalLight();

    dl.setColor(ColorRGBA.White);

    dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal());

    rootNode.addLight(dl);

    }

    /
    * We over-write some navigational key mappings here, so we can
  • add physics-controlled walking and jumping: /

    private void setUpKeys() {

    inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_A));

    inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_D));

    inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_W));

    inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_S));

    inputManager.addMapping("Jumps", new KeyTrigger(KeyInput.KEY_J));

    inputManager.addListener(this, "Lefts");

    inputManager.addListener(this, "Rights");

    inputManager.addListener(this, "Ups");

    inputManager.addListener(this, "Downs");

    inputManager.addListener(this, "Jumps");

    }

    /
    * These are our custom actions triggered by key presses.
  • We do not walk yet, we just keep track of the direction the user pressed. */

    public void onAction(String binding, boolean value, float tpf) {

    if (binding.equals("Lefts")) {

    left = value;

    } else if (binding.equals("Rights")) {

    right = value;

    } else if (binding.equals("Ups")) {

    up = value;

    } else if (binding.equals("Downs")) {

    down = value;

    } else if (binding.equals("Jumps")) {

    player.jump();

    }

    }



    /**
  • This is the main event loop–walking happens here.
  • We check in which direction the player is walking by interpreting
  • the camera direction forward (camDir) and to the side (camLeft).
  • The setWalkDirection() command is what lets a physics-controlled player walk.
  • We also make sure here that the camera moves with player.

    /

    @Override

    public void simpleUpdate(float tpf) {

    System.out.println(player.getPhysicsLocation());

    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());

    }



    protected void initCrossHairs() {

    guiNode.detachAllChildren();

    guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");

    BitmapText ch = new BitmapText(guiFont, false);

    ch.setSize(guiFont.getCharSet().getRenderedSize() * 3);

    ch.setText("."); // crosshairs

    ch.setLocalTranslation( // center

    settings.getWidth()/2 - guiFont.getCharSet().getRenderedSize()/3
    2,

    settings.getHeight()/2 + ch.getLineHeight()/2, 0);

    guiNode.attachChild(ch);

    }

    }[/java]

that should have been underlined as an error in the IDE

change Line 72

[java]blue.addControl(boxShape);[/java]

to

[java]blue.addControl(boxCol);[/java]

Ok i think im blind!!! Thank you very much :))