我偶然发现了这个问题。在我的引擎中,我终于想出了在满足条件后如何将对象添加到场景中。但是我仍然无法弄清楚如何从场景中删除对象。
这是游戏循环
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);
}
}
希望这有助于:)
答案 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);
}
}