Picking

Hi every one. I’m trying to start a simple application " chess game" . i have a problem with the mouse picking when i select the piece to move .

When i click once, the closest piece is identified and detached from the scene. When i click a second time, the piece is reattached at the location that i have clicked.Now i working with box to facilate the task. This is the script .when i click with the right mouse-button the box desappear but when i click with the left mouse-button it doesnt reappear. need ur help please:







ackage hello;

import com.jme3.app.SimpleApplication;

import com.jme3.collision.CollisionResult;

import com.jme3.collision.CollisionResults;

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.input.controls.MouseButtonTrigger;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Ray;

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;

import com.jme3.scene.shape.Sphere;

/** Sample 8 - how to let the user pick (select) objects in the scene

  • using the mouse or key presses. Can be used for shooting, opening doors, etc. /

    public class HelloPicking extends SimpleApplication {

    public static void main(String[] args) {

    HelloPicking app = new HelloPicking();

    app.start();

    }

    Node shootables;

    Node detaches;

    Geometry mark;



    @Override

    public void simpleInitApp() {

    initCrossHairs(); // a “+” in the middle of the screen to help aiming

    initKeys(); // load custom key mappings

    initMark(); // a red sphere to mark the hit

    /
    * create four colored boxes and a floor to shoot at: /

    shootables = new Node(“Shootables”);

    //les pieces detachees elle n’est pas liee au rootnode pour ke les peices ne seront pas visible

    detaches= new Node(“detaches”);



    rootNode.attachChild(shootables);

    shootables.attachChild(makeCube(“a Dragon”, -2f, 0f, 1f));

    shootables.attachChild(makeFloor());

    }





    /
    * Declaring the “Shoot” action and mapping to its triggers. /

    private void initKeys() {

    inputManager.addMapping(“Shoot”,

    new KeyTrigger(KeyInput.KEY_SPACE), // trigger 1: spacebar

    new MouseButtonTrigger(1)); // trigger 2: right-button click

    inputManager.addListener(actionListener, “Shoot”);

    // action pour la reaapparition de cube

    inputManager.addMapping(“Put”,new MouseButtonTrigger(0)); // trigger 2: left-button click

    inputManager.addListener(actionListener, “Put”);

    }







    /
    * Defining the “Shoot” action: Determine what was hit and how to respond. */

    private ActionListener actionListener = new ActionListener() {

    @Override

    public void onAction(String name, boolean keyPressed, float tpf) {

    if (name.equals(“Shoot”) && !keyPressed) {

    // 1. Reset results list.

    CollisionResults results = new CollisionResults();

    // 2. Aim the ray from cam loc to cam direction.

    Ray ray = new Ray(cam.getLocation(), cam.getDirection());

    // 3. Collect intersections between Ray and Shootables in results list.

    shootables.collideWith(ray, results);

    // 4. Print the results.

    System.out.println("

Collisions? " + results.size() + "
");
for (int i = 0; i < results.size(); i++) {
// For each hit, we know distance, impact point, name of geometry.
float dist = results.getCollision(i).getDistance();
Vector3f pt = results.getCollision(i).getContactPoint();
String hit = results.getCollision(i).getGeometry().getName();
System.out.println("* Collision #" + i);
System.out.println(" You shot " + hit + " at " + pt + ", " + dist + " wu away.");
}
// 5. Use the results (we mark the hit object)
if (results.size() > 0)
{
// The closest collision point is what was truly hit:
CollisionResult closest = results.getClosestCollision();
// Let's interact - we mark the hit with a red dot.
mark.setLocalTranslation(closest.getContactPoint());
Geometry hit= closest.getGeometry();
shootables.detachChild(hit);
detaches.attachChild(hit);
rootNode.attachChild(mark);
}
else {
// No hits? Then remove the red mark.
rootNode.detachChild(mark);
}
}
// definir l'action Put
if (name.equals("Put") && !keyPressed)
{
// 1. Reset results list.
CollisionResults resultat = new CollisionResults();
// 2. Aim the ray from cam loc to cam direction.
Ray ray1 = new Ray(cam.getLocation(), cam.getDirection());
// 3. Collect intersections between Ray and Shootables in results list.
shootables.collideWith(ray1, resultat);

// The closest collision point is what was truly hit:
CollisionResult closest2 = resultat.getClosestCollision();
// Vector3f v = closest2.getContactPoint();
Spatial hit2= detaches.getChild(0);
hit2.setLocalTranslation(closest2.getContactPoint());
detaches.detachChild(hit2);
rootNode.attachChild(hit2);






}

}
};


/** A cube object for target practice */
protected Geometry makeCube(String name, float x, float y, float z) {
Box box = new Box(new Vector3f(x, y, z), 1, 1, 1);
Geometry cube = new Geometry(name, box);
Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.randomColor());
cube.setMaterial(mat1);
return cube;
}
/** A floor to show that the "shot" can go through several objects. */
protected Geometry makeFloor() {
Box box = new Box(new Vector3f(0,-4,-5), 15,.2f,15);
Geometry floor = new Geometry("the Floor", box);
Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.Gray);
floor.setMaterial(mat1);
return floor;
}
/** A red ball that marks the last spot that was "hit" by the "shot". */
protected void initMark() {
Sphere sphere = new Sphere(30, 30, 0.2f);
mark = new Geometry("BOOM!", sphere);
Material mark_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mark_mat.setColor("Color", ColorRGBA.Red);
mark.setMaterial(mark_mat);
}
/** A centred plus sign to help the player aim. */
protected void initCrossHairs() {
guiNode.detachAllChildren();
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapText ch = new BitmapText(guiFont, false);
ch.setSize(guiFont.getCharSet().getRenderedSize() * 2);
ch.setText("+"); // crosshairs
ch.setLocalTranslation( // center
settings.getWidth()/2 - guiFont.getCharSet().getRenderedSize()/3*2,
settings.getHeight()/2 + ch.getLineHeight()/2, 0);
guiNode.attachChild(ch);
}
}

I wrote the actionlistener by my own cause it was very ugly ^^

Now, it should work… Please use next time [“java”] ["/java"]



[java]package Unit_and_Control;



import com.jme3.app.SimpleApplication;

import com.jme3.collision.CollisionResult;

import com.jme3.collision.CollisionResults;

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.input.controls.MouseButtonTrigger;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Ray;

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;

import com.jme3.scene.shape.Sphere;

/** Sample 8 – how to let the user pick (select) objects in the scene

  • using the mouse or key presses. Can be used for shooting, opening doors, etc. /

    public class HelloPicking extends SimpleApplication {

    public static void main(String[] args) {

    HelloPicking app = new HelloPicking();

    app.start();

    }

    Node shootables;

    Node detaches;

    Geometry mark;



    @Override

    public void simpleInitApp() {

    initCrossHairs(); // a "+" in the middle of the screen to help aiming

    initKeys(); // load custom key mappings

    initMark(); // a red sphere to mark the hit

    /
    * create four colored boxes and a floor to shoot at: /

    shootables = new Node("Shootables");

    //les pieces detachees elle n’est pas liee au rootnode pour ke les peices ne seront pas visible

    detaches= new Node("detaches");



    rootNode.attachChild(shootables);

    shootables.attachChild(makeCube("a Dragon", 0f, 0f, 1f));

    rootNode.attachChild(makeFloor());

    }



    /
    * Declaring the "Shoot" action and mapping to its triggers. /

    private void initKeys() {

    inputManager.addMapping("Shoot",

    new KeyTrigger(KeyInput.KEY_SPACE), // trigger 1: spacebar

    new MouseButtonTrigger(1)); // trigger 2: right-button click

    inputManager.addListener(actionListener, "Shoot");

    // action pour la reaapparition de cube

    inputManager.addMapping("Put",new MouseButtonTrigger(0)); // trigger 2: left-button click

    inputManager.addListener(actionListener, "Put");

    }



    private Spatial selected = null;



    /
    * Defining the "Shoot" action: Determine what was hit and how to respond. /

    private ActionListener actionListener = new ActionListener() {

    @Override

    public void onAction(String name, boolean keyPressed, float tpf) {

    if(name.equals("Shoot")&&!keyPressed){

    CollisionResults results = new CollisionResults();

    Ray ray = new Ray(cam.getLocation(),cam.getDirection());

    shootables.collideWith(ray, results);

    if(results.size() > 0){

    CollisionResult closest = results.getClosestCollision();

    mark.setLocalTranslation(closest.getContactPoint());

    rootNode.attachChild(mark);

    selected = closest.getGeometry();

    shootables.detachChild(selected);

    }

    }else if(name.equals("Put")&&!keyPressed&&selected!=null){

    CollisionResults results = new CollisionResults();

    Ray ray = new Ray(cam.getLocation(),cam.getDirection());

    rootNode.collideWith(ray, results);

    if(results.size() > 0){

    CollisionResult closest = results.getClosestCollision();

    rootNode.detachChild(mark);

    shootables.attachChild(selected);

    Vector3f test = closest.getContactPoint();

    selected.setLocalTranslation(test);

    //deselect

    selected = null;

    }

    }



    }

    };



    /
    * A cube object for target practice /

    protected Geometry makeCube(String name, float x, float y, float z) {

    Box box = new Box(new Vector3f(x, y, z), 1, 1, 1);

    Geometry cube = new Geometry(name, box);

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

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

    cube.setMaterial(mat1);

    return cube;

    }

    /
    * A floor to show that the "shot" can go through several objects. /

    protected Geometry makeFloor() {

    Box box = new Box(new Vector3f(0,-4,-5), 15,.2f,15);

    Geometry floor = new Geometry("the Floor", box);

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

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

    floor.setMaterial(mat1);

    return floor;

    }

    /
    * A red ball that marks the last spot that was "hit" by the "shot". /

    protected void initMark() {

    Sphere sphere = new Sphere(30, 30, 0.2f);

    mark = new Geometry("BOOM!", sphere);

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

    mark_mat.setColor("Color", ColorRGBA.Red);

    mark.setMaterial(mark_mat);

    }

    /
    * A centred plus sign to help the player aim. /

    protected void initCrossHairs() {

    guiNode.detachAllChildren();

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

    BitmapText ch = new BitmapText(guiFont, false);

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

    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]
1 Like