using System; using System.Collections.Generic; namespace XGame.Framework.Time { public class TimeProxy : ITimeProxy, ITimeListener, ITimeListener { private ITimeModule _timeModule; private HashSet _alarms; private HashSet _timers; public TimeProxy(ITimeModule timeModule) { _timeModule = timeModule; } #region 接口实现 public long GetNowTime(ClockType clockTyp = ClockType.Server) { return _timeModule.GetNowTime(clockTyp); } public void SetTime(long timestamp, ClockType clockTyp = ClockType.Server) { _timeModule.SetTime(timestamp, clockTyp); } public IAlarm AddAlarm(Action action, long triggerTimeStamp, ClockType clockTyp = ClockType.Server) { var alarm = _timeModule.AddAlarm(action, triggerTimeStamp, clockTyp); alarm.Listener = this; AddAlarm(alarm); return alarm; } public ITimer AddDelayTimer(int delay, Action action) { var timer = _timeModule.AddDelayTimer(delay, action); timer.Listener = this; AddTimer(timer); return timer; } public ITimer AddDelayLooperTimer(int delay, int interval, Action action, int loopTimes = -1) { var timer = _timeModule.AddDelayLooperTimer(delay, interval, action, loopTimes); timer.Listener = this; AddTimer(timer); return timer; } public ITimer AddLooperTimer(int interval, Action action, int loopTimes = -1) { var timer = _timeModule.AddLooperTimer(interval, action, loopTimes); timer.Listener = this; AddTimer(timer); return timer; } public void CancelAll() { if (_alarms != null) { foreach(var alarm in _alarms) { alarm.Listener = null; alarm.Cancel(); } _alarms.Clear(); } if (_timers != null) { foreach(var timer in _timers) { timer.Listener = null; timer.Cancel(); } _timers.Clear(); } } public void SetAllTimeScales(float timeScale) { if (_timers != null) { foreach(var timer in _timers) { timer.TimeScale = timeScale; } } } void ITimeListener.OnCompleted(IAlarm alarm) { _alarms?.Remove(alarm); } void ITimeListener.OnCompleted(ITimer timer) { _timers?.Remove(timer); } #endregion private void AddAlarm(IAlarm alarm) { if (_alarms == null) _alarms = new HashSet(); _alarms.Add(alarm); } private void AddTimer(ITimer timer) { if (_timers == null) _timers = new HashSet(); _timers.Add(timer); } } }