如何通过碰撞检测获取对象参数?

时间:2013-11-28 12:45:49

标签: java collision-detection jmonkeyengine

我开始使用jMonkey开发游戏。 我刚刚创建了一个“实体”类中的对象,我自己创建了一个包含3D模型,物理等的对象。 这是代码:

package mygame.entities;

import com.jme3.asset.AssetManager;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;


public class Entity {

private AssetManager assetManager;
private Node rootNode;
public  Spatial model;
private Geometry object;
private String itsName;
private int life;
private boolean destroyAble;
private boolean destroyed;

public Entity(BulletAppState bas, AssetManager manager, Node rootNode, String name, int                                 lifes, boolean destroyable, float x, float y, float z) {
    itsName = name;
    life = lifes;
    destroyAble = destroyable;
    model = manager.loadModel("Models/woodlog.j3o");
    model.setLocalTranslation(x, y, z);
    model.setShadowMode(ShadowMode.Cast);
    model.setName(name);
    model.setUserData("lifes", 3);
    RigidBodyControl body = new RigidBodyControl(2);
    model.addControl(body);
    bas.getPhysicsSpace().add(body);
    rootNode.attachChild(model);   
}

public String getName() {
    return itsName;
}

public int getLife() {
    return life;
}

public void setLife(int lifes) {
    life = lifes;
}

public boolean isDestroyable() {
    return destroyAble;
}

public boolean isDestroyed() {
    if (destroyAble && life <= 0) {
        destroyed = true;
    } else {
        destroyed = false;
    }
    return destroyed;
  }
}

在jMonkey网站上的教程的帮助下,我设法实现了“射击”。 沿着我的凸轮方向的简单光线。以下是与某些内容发生冲突时会发生什么的代码:

} else if (binding.equals("Fire") && !isPressed) {
    // 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 results.
    System.out.println(results.size());
    if (results.size() >= 1) {
      System.out.println(results.getCollision(0).getGeometry().getName());
      //Material material = results.getCollision(0).getGeometry().getMaterial();
      //material.setColor("Color", ColorRGBA.randomColor());
    }
  }

这样就可以了!这一行:

System.out.println(results.getCollision(0).getGeometry().getName());

显示我刚拍摄的“几何”的名称。但现在的问题是,我的对象不是几何!而且我不知道如何实现我无论如何都得到了这个对象的名字。对我来说最好的方法是如果results.getCollision(0)会返回我的对象​​,所以我可以说“object.getName();”

有谁知道我怎么能这样做?我会非常感谢任何想法:) 干杯 - 丹尼尔

2 个答案:

答案 0 :(得分:0)

您可以在Java 7中使用类似的东西:

switch (results.getCollision(0).getClass().getName()){
case "ObjectName1":
    Code
break;
case "ObjectName2":
    Code
break;
}

或Java 6中的那个

String objectName=results.getCollision(0).getClass().getName()){
if ("ObjectName1"==objectName){
    Code
}elseif ("ObjectName2"==objectName){
    Code
}

答案 1 :(得分:0)

选项1,as Kiwy suggests是为每个几何体赋予唯一名称,并使用它来查找对象。选项2是扩展几何,使 您的对象或包含您的对象。这需要使用instanceof和铸造。

在这个例子中,我将Geometry扩展为OwnedGeometry以随身携带所有者

public class OwnedGeometry extends Geometry {

    MyClass owner;

    public  OwnedGeometry(String name, Mesh mesh,MyClass owner){
        super(name,mesh);
        this.owner=owner;
    }

    public MyClass getOwner(){
        return owner;
    }
}

此类可以完全按照之前使用的Geometry一样使用,它只是随身携带额外的字段。

然后,当您收到几何图形时,您可以检索所有者

CollisionResults results = new CollisionResults();
// Aim the ray from cam loc to cam direction.
Ray ray = new Ray(cam.getLocation(), cam.getDirection());
//Collect intersections between Ray and Shootables in results list.
shootables.collideWith(ray, results);

System.out.println(results.size());
if (results.size() >= 1) {
  Geometry closest=results.getCollision(0).getGeometry());
  if (closest instanceof OwnedGeometry){
      OwnedGeometry ownedGeometry=(OwnedGeometry)closest;
      MyClass myClass=ownedGeometry.getOwner;
      //success!
  }
}

此方法可直接返回您的课程,但需要一些不理想的实例和演员