Java从场景中删除对象

时间:2015-09-26 18:37:58

标签: java object

我偶然发现了这个问题。在我的引擎中,我终于想出了在满足条件后如何将对象添加到场景中。但是我仍然无法弄清楚如何从场景中删除对象。

这是游戏循环

while(isRunning == true)
    {   
        if(frames > 200)
        {
            building1 = false;
        }

        if(building1 == true) {
            if(frames > 100) {
                if(create_001 == true) {
                    model = true;

                    loadModel();

                    create_001 = false;
                }
            }
        }
[...]

(create_001 = false;)就在那里,因此只创建一次对象。

这就是加载模型的方式:

private Game game;

public void loadModel() {
    GameObject object = new GameObject();
    Mesh mesh = new Mesh(obj);
    Material material = new Material (new Texture(texture));
    MeshRenderer meshRenderer = new MeshRenderer(mesh, material);
    object.AddComponent(meshRenderer);
    game.AddObject(object);
}

正如你所看到的那样,我让对象在100帧之后出现并尝试在200帧之后再次移除对象,如果检查则取消建筑物1 - 但这不起作用。

在200帧之后,对象仍在那里,我不知道为什么,有人提出建议,因为我无法理解为什么它不会那样工作?

感谢您的帮助!

编辑:

这是我在addMocl方法结束时调用的AddObject方法的游戏类:

public abstract class Game
{
private GameObject m_root;

public void Init() {}
public void Input(float delta) { GetRootObject().InputAll(delta); }
public void Update(float delta) { GetRootObject().UpdateAll(delta); }
public void Render(RenderingEngine renderingEngine) { renderingEngine.Render(GetRootObject()); }
public void AddObject(GameObject object) { GetRootObject().AddChild(object); }

private GameObject GetRootObject()
{
    if(m_root == null)
        m_root = new GameObject();

    return m_root;
}

public void SetEngine(CoreEngine engine) { GetRootObject().SetEngine(engine); }
}

我可能需要一些删除Object方法,但实际上并不知道我需要如何设计它...我会尝试多一点,但我仍然愿意接受建议。

再次感谢您的帮助!

EDIT2;

嗯,这里有一些关于GameObject类的细节..似乎我们更接近问题的根源了:

private ArrayList<GameObject> m_children;
private CoreEngine m_engine;

public GameObject()
{
    m_children = new ArrayList<GameObject>();
    m_engine = null;
}

public GameObject AddChild(GameObject child)
{
    m_children.add(child);
    child.SetEngine(m_engine);

    return this;
}

感谢到目前为止的提示,我已经尝试了其他一些东西,但似乎没有任何工作,也许在GameObject类中可以做些什么?

非常感谢!

这是游戏对象的数组列表:

public ArrayList<GameObject> GetAllAttached()
{
    ArrayList<GameObject> result = new ArrayList<GameObject>();

    for(GameObject child : m_children)
        result.addAll(child.GetAllAttached());

    result.add(this);
    return result;
}

这里是setEngine方法:

public void SetEngine(CoreEngine engine)
{
    if(this.m_engine != engine)
    {
        this.m_engine = engine;

        for(GameComponent component : m_components)
            component.AddToEngine(engine);

        for(GameObject child : m_children)
            child.SetEngine(engine);
    }
}

希望这有助于:)

1 个答案:

答案 0 :(得分:0)

也许你需要调用一些“remove_object”if(frames&gt; 200)? 需要更完整的代码才能理解。

public abstract class Game {
  public void RemoveObject(GameObject object) {
    GetRootObject().RemoveChild(object); 
  }
}

class GameObject {
  public void RemoveChild(GameObject child) {
    m_children.remove(child);
  }
}
相关问题