/** * @brief decide whether this object should be updated **/ private bool ShouldBeUpdated(GameObjectList _gameObjectList) { // Don't update the gameObject if it is not in GameObjectList // Case: 1. GameObject a.Update() -> AddGameObject(b), b.AttachToGameObject(c) // 2. c.Update() -> b.Update() // Here, b has not been added to contentList (not been BindToScene and Initialize yet) if (!_gameObjectList.ContainKey(GUID)) { return(false); } return(true); }
public static GameObjectList LoadFromNode(XmlNode node, Scene scene) { GameObjectList gameObjectList = new GameObjectList(); Serialable.BeginSupportingDelayBinding(); foreach (XmlNode gameObject in node.ChildNodes) { GameObject newGameObject = (GameObject)(Serialable.DoUnserial(gameObject)); gameObjectList.AddGameObject(newGameObject); } Serialable.EndSupportingDelayBinding(); return(gameObjectList); }
/** * @brief [Called by GameObjectList only] recursively remove self from gameObjectList */ public void RemoveGameObjectTreeFromGameObjectList(GameObjectList _gameObjectList) { if (m_children != null) { GameObject[] tempChildren = m_children.ToArray(); foreach (GameObject child in tempChildren) { child.RemoveGameObjectTreeFromGameObjectList(_gameObjectList); } } DetachFromParent(); _gameObjectList.RemoveSingleGameObject(this); }
/** * @brief [Called by GameObjectList only] update every component in game mode * * @param lastTimeFrame the time interval since last frame * */ public void Update(int lastTimeFrame, GameObjectList _gameObjectList) { if (!ShouldBeUpdated(_gameObjectList)) { return; } if (m_components != null) { foreach (KeyValuePair <string, CatComponent> key_value in m_components) { key_value.Value.Update(lastTimeFrame); } } UpdateAbsTranformation(lastTimeFrame); if (m_children != null) { foreach (GameObject child in m_children) { child.Update(lastTimeFrame, _gameObjectList); } } }
private void InGameUpdateProcess(int _skewedTimeInMS) { if (Mgr <Scene> .Singleton.GetPhysicsSystem() != null) { Mgr <Scene> .Singleton.GetPhysicsSystem().Update(_skewedTimeInMS); } if (Mgr <Scene> .Singleton._gameObjectList != null) { Scene curScene = Mgr <Scene> .Singleton; GameObjectList gameObjectList = Mgr <Scene> .Singleton._gameObjectList; gameObjectList.UpdateAdd(curScene); gameObjectList.UpdateRemove(curScene); } // if (Mgr<Scene>.Singleton._colliderList != null) { // Mgr<Scene>.Singleton._colliderList.UpdateRemove(); // } if (Mgr <Camera> .Singleton != null) { Mgr <Camera> .Singleton.Update(_skewedTimeInMS); } if (Mgr <CatProject> .Singleton.MotionDelegator != null) { Mgr <CatProject> .Singleton.MotionDelegator.Update(_skewedTimeInMS); } if (Mgr <Scene> .Singleton._gameObjectList != null) { Mgr <Scene> .Singleton._gameObjectList.Update(_skewedTimeInMS); } if (Mgr <Scene> .Singleton.m_shadowSystem != null) { Mgr <Scene> .Singleton.m_shadowSystem.Update(_skewedTimeInMS); } if (Mgr <CatProject> .Singleton.SoundManager != null) { Mgr <CatProject> .Singleton.SoundManager.Update(_skewedTimeInMS); } }
/** * @brief create a scene from an XML file * * @param node the XML node * @param game the game engine * * @result scene * */ public static Scene LoadScene(string _filename) // node is the current node { XmlDocument doc = new XmlDocument(); doc.Load(_filename); XmlNode node = doc.SelectSingleNode("Scene"); Scene newScene = new Scene(); // working list newScene._renderList = new RenderList(); //newScene._colliderList = new ColliderList(); newScene.m_physicsSystem = new PhysicsSystem(); newScene.m_shadowSystem = new ShadowSystem(Mgr <CatProject> .Singleton); newScene._renderList.SetShadowRender(newScene.m_shadowSystem); newScene._uiRenderer = new UIRenderer(); newScene.m_physicsSystem.Initialize(); if (Mgr <GameEngine> .Singleton._gameEngineMode == GameEngine.GameEngineMode.MapEditor) { newScene._debugDrawableList = new DebugDrawableList(); newScene._debugDrawableList.AddItem(newScene); newScene._selectableList = new RepeatableList <ISelectable>(); } // bind to current scene //Mgr<Scene>.Singleton = newScene; // init scene basic list // load and construct scene here XmlNode basic = node.SelectSingleNode("SceneBasic"); XmlElement sceneBasic = (XmlElement)basic; newScene.setYAngle(float.Parse(sceneBasic.GetAttribute("viewAngle"))); String playerGameObjectName = sceneBasic.GetAttribute("playerGameObjectName"); XmlElement XBound = (XmlElement)sceneBasic.SelectSingleNode("XBound"); newScene._XBound = new Vector2(float.Parse(XBound.GetAttribute("min")), float.Parse(XBound.GetAttribute("max"))); XmlElement YBound = (XmlElement)sceneBasic.SelectSingleNode("YBound"); newScene._YBound = new Vector2(float.Parse(YBound.GetAttribute("min")), float.Parse(YBound.GetAttribute("max"))); XmlElement ZBound = (XmlElement)sceneBasic.SelectSingleNode("ZBound"); newScene._ZBound = new Vector2(float.Parse(ZBound.GetAttribute("min")), float.Parse(ZBound.GetAttribute("max"))); // camera XmlNode nodeCamera = node.SelectSingleNode(typeof(Camera).ToString()); Serialable.BeginSupportingDelayBinding(); Camera camera = Serialable.DoUnserial((XmlElement)nodeCamera) as Camera; Serialable.EndSupportingDelayBinding(); //Mgr<Camera>.Singleton = camera; newScene.m_camera = camera; newScene.m_camera.UpdateView(); newScene.m_camera.UpdateProjection(); // postprocess manager XmlNode nodePostProcessManager = node.SelectSingleNode(typeof(PostProcessManager).ToString()); Serialable.BeginSupportingDelayBinding(); newScene.m_postProcessManager = Serialable.DoUnserial((XmlElement)nodePostProcessManager) as PostProcessManager; Serialable.EndSupportingDelayBinding(); // gameObjects XmlNode gameObjects = node.SelectSingleNode("GameObjects"); newScene._gameObjectList = GameObjectList.LoadFromNode(gameObjects, newScene); PostLoadScene(newScene); return(newScene); }