2013-11-28 2 views
2

Я начал работать над игрой с jMonkey. Я только что создал объект из класса «Entity», который я создал сам, который содержит 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()); 

отображает название этой «геометрии», которую я только что снял. Но проблема в том, что мой объект не является геометрией! И я не знаю, как я могу реализовать, что я получаю имя этого объекта в любом случае. Лучшим способом для меня было бы, если result.getCollision (0) вернет мой объект, чтобы я мог просто сказать «object.getName();»

Кто-нибудь знает, как я могу это сделать? Буду очень благодарен за любые идеи :) ура - Даниэль

+0

вы должны рассмотреть чтобы изменить ваш титул, который абсолютно не ясен. – Kiwy

+0

После того, как вы застрелили объект, вы должны найти его имя, нанесенное татуировкой на ухо. :-) –

+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 
} 
+0

Это выдает следующие данные: com.jme3.collision.CollisionResult Это на самом деле не помогает мне ...:( – Pixell

+0

, но это название класса, с которым вы попали со своей стрельбой. – Kiwy

+0

Да, но я не могу получить доступ к моему объекту из Entity, не так ли? – Pixell

0

Вариант 1 , as Kiwy suggests - дать каждой геометрии уникальное имя и использовать его для поиска вашего объекта. Вариант 2 состоит в том, чтобы расширить геометрию так, чтобы она либо была вашего объекта, либо содержит вашего объекта. Это требует некоторого использования instanceof и кастинга.

В этом примере я буду расширять геометрии 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; 
    } 
} 

Этот класс может использоваться точно так же, как вы использовали ранее геометрии, он просто несет, что дополнительное поле вокруг с ним.

Затем, когда вы получаете геометрию вы можете получить владелец

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! 
    } 
} 

Этот метод дает свой класс обратно напрямую, но требует немного InstanceOf и отливку, которая не является идеальным

+0

Wow большое спасибо за этот отличный ответ! :) Я постараюсь, если это сработает. Вы сказали, что это не идеально ... Есть ли лучшее решение? Существует метод под названием .setUserData (String, key), с которым я мог бы просто применить к нему имя или «жизни». Но будет ли он работать с 3D-моделью? Моя реальная проблема в том, что я хочу изменить тип геометрии. Поэтому я могу применять такие вещи, как «isDestroyable» ... – Pixell

+0

@Pixell Это то, что я использую в своей собственной программе, поэтому я думаю, что это необходимое зло, но часто экземпляр чрезмерно используется, поэтому, прежде чем использовать его, часто стоит сделать небольшую проверку здравомыслия просто Чтобы убедиться. Если вы хотите использовать эти методы, все зависит от того, насколько сложна ваша MyClass, если она будет соответствовать этой структуре. Я работаю над игрой в стиле minecraft, поэтому мне нужен полноценный объект с другого конца (кусок), но если ваши объекты проще, вы можете уйти с .setUserData (String, key) –

+0

Я вижу. Хорошо, я постараюсь изо всех сил и большое спасибо за эту идею. Думаю, мне просто нужно выяснить, какой путь работает лучше всего, когда игра достигла еще одного стадиона. :) – Pixell

Смежные вопросы