using FL.FGUI; using FL.Map; using FL.Nodes; using System; using System.Collections.Generic; using XGame; using XGame.Framework; using XGame.Framework.FGUI; using XGame.Framework.Interfaces; using XGame.Framework.Map; using XGame.Framework.Nodes; using XGame.Framework.Quality; using XGame.Framework.Time; using XGame.Framework.UI; namespace FL.Launch { public class FLGameLogic : IGameLogic { #region 接口实现 private ITimeModule _timeModule; private IMapModule _mapModule; private IUIModule _uiModule; private INodeTree _nodeTree; /// /// 按照Map、UI、NodeTree的顺序刷新 /// private List _updates; /// /// 按照Map、UI、NodeTree的顺序刷新 /// private List _lateUpdates; void IGameLogic.Init() { Log.Debug("FLGameLogic.Init"); InitModules(); InitUpdates(); } void IGameLogic.Start() { Log.Debug("FLGameLogic.Start"); var appNode = _nodeTree.Root as FLAppNode; var async = appNode.LoadAsync(); async.On(_ => { appNode.Enable(); if (_nodeTree is IUpdate nodeUpdate) { _updates.Add(nodeUpdate); } if (_nodeTree is ILateUpdate nodeLateUpdate) { _lateUpdates.Add(nodeLateUpdate); } }); } void IGameLogic.Update(int millisecond) { foreach (var update in _updates) { update?.Update(millisecond); } } void IGameLogic.LateUpdate(int millisecond) { foreach (var lateUpdate in _lateUpdates) { lateUpdate?.LateUpdate(millisecond); } } void IGameLogic.Dispose() { Log.Debug("FLGameLogic.Dispose"); _updates.Clear(); _lateUpdates.Clear(); EventSingle.Dispose(); UIKeys.Dispose(); UINestedKeys.Dispose(); MapKeys.Dispose(); (_timeModule as IDisposable)?.Dispose(); (_mapModule as IDisposable)?.Dispose(); (_uiModule as IDisposable)?.Dispose(); (_nodeTree as IDisposable)?.Dispose(); } #endregion private void InitModules() { var qualityModule = new QualityModule(); var timeModule = new TimeModule(); timeModule.Initialize(); _timeModule = timeModule; //UI var uiBuilder = new FguiModuleBuilder(); uiBuilder.Build(qualityModule, _timeModule); _uiModule = uiBuilder.Product; //Map var mapBuilder = new MapModuleBuilder(); mapBuilder.Build(qualityModule, timeModule, _uiModule); _mapModule = mapBuilder.Product; //NodeTree var nodeBuild = new NodeTreeBuilder(); nodeBuild.Build(qualityModule, timeModule, _uiModule, _mapModule, typeof(FLAppNode)); _nodeTree = nodeBuild.Product; } private void InitUpdates() { _updates = new List(); _lateUpdates = new List(); if (_mapModule is IUpdate mapUpdate) { _updates.Add(mapUpdate); } if (_mapModule is ILateUpdate mapLateUpdate) { _lateUpdates.Add(mapLateUpdate); } if (_uiModule is IUpdate uiUpdate) { _updates.Add(uiUpdate); } if (_uiModule is ILateUpdate uiLateUpdate) { _lateUpdates.Add(uiLateUpdate); } } } }