private void InitializeNewContainerContext(ILifetimeScope container) { if (container == null) { throw new ArgumentNullException(nameof(container)); } var gameInitializables = container.Resolve <IEnumerable <IGameInitializable> >(); var gameStartables = container.Resolve <IEnumerable <IGameStartable> >(); CurrentGameTickables = container.Resolve <IEnumerable <IGameTickable> >(); CurrentGameFixedTickables = container.Resolve <IEnumerable <IGameFixedTickable> >(); EventQueueAsync.Enqueue(async() => { foreach (var initializable in gameInitializables) { await initializable.OnGameInitialized(); } foreach (var startable in gameStartables) { await startable.OnGameStart(); } }); LifetimeDependencyScope = container; }
public async Task Service() { //Just do one a tick. if (EventQueue.Any()) { if (EventQueue.TryDequeue(out var action)) { action?.Invoke(); } } if (EventQueueAsync.Any()) { if (EventQueueAsync.TryDequeue(out var action)) { await action.Invoke(); } } foreach (var tickable in CurrentGameTickables) { tickable.Tick(); } long currentMilliseconds = TimeService.CurrentTimeInMilliseconds(); if (LastMilliseconds == -1) { LastMilliseconds = currentMilliseconds; } else if (currentMilliseconds - 600 >= LastMilliseconds) { //It's been 600ms, time for another tick. LastMilliseconds = currentMilliseconds; foreach (var fixedTickable in CurrentGameFixedTickables) { fixedTickable.OnGameFixedTick(); } } }
public void EnqueueAsync(Func <Task> actionEventAsync) { EventQueueAsync.Enqueue(actionEventAsync); }