public SynchroFrame SynchroFrame() { try { GameSession session; _sessionManager.SessionTable.TryGetValue(Id, out session); if (session == null) { return(null); } AGameObject[] gameObjects = GameObjectConverter.ArrayedObjects(session.GetSynchroFrame()); var synchroFrame = new SynchroFrame(gameObjects, session.GetTime()); Trace.WriteLine(synchroFrame); return(synchroFrame); } catch (Exception exc) { Trace.WriteLine("ERROR: Syncroframe broken", exc.ToString()); } return(null); }
public GameSnapshot(SynchroFrame serverSynchroFrame, GameLevel gameLevel) { _gameObjects = new Dictionary <Guid, DrawableGameObject>(); foreach (AGameObject serverGameObject in serverSynchroFrame) { DrawableGameObject newDrawableGameObject = GameFactory.CreateClientGameObject(serverGameObject); _gameObjects.Add(newDrawableGameObject.Id, newDrawableGameObject); } _gameLevel = gameLevel; Time = serverSynchroFrame.Time; }
public void GetLatestServerSynchroFrame() { try { lock (_synchroFrameLocker) { _lastServerSynchroFrame = _service.SynchroFrame(); // if (_lastServerSynchroFrame != null) // { // Trace.Write("Diff time = " + DifferenceTime); // } } } catch (Exception exc) { Trace.WriteLine("game:SynchroFrame" + exc); } }
public void Update(GameTime gameTime) { // todo // update explosions // UpdateExplosions(); #region применение синхрокадра if (_updateCouter % 30 == 0) { SynchroFrame serverSynchroFrame = ConnectionManager.Instance.SynchroFrame(); if (serverSynchroFrame == null) { GameController.Instance.GameOver(); return; } Trace.WriteLine(serverSynchroFrame); ApplySynchroFrame(serverSynchroFrame); // очистка списка GameEvent'ов c последнего синхрокадра _serverGameEvents.Clear(); } #endregion #region применение игровых событий if (_updateCouter % 5 == 0) { AGameEvent[] serverGameEvents = ConnectionManager.Instance.GetEvents(); _serverGameEvents.AddRange(serverGameEvents); Logger.PrintEvents(serverGameEvents); ApplyEvents(serverGameEvents); } #endregion #region экстрапол¤ци¤ long serverTime = _timeHelper.GetTime(); _drawableGameObjects = _gameSnapshot.ExtrapolateTo(serverTime); #endregion #region обнаружение столкновений foreach (DrawableGameObject gameObject in _drawableGameObjects) { foreach (DrawableGameObject slaver in _drawableGameObjects) { if (gameObject != slaver && slaver.Is(AGameObject.EnumObjectType.Block) && gameObject.Is(AGameObject.EnumObjectType.Block)) { if (gameObject.Radius * gameObject.Radius + slaver.Radius * slaver.Radius <= (gameObject.Coordinates - slaver.Coordinates).LengthSquared()) { gameObject.Coordinates += CollisionDetector.FitObjects(gameObject.Coordinates, gameObject.RunVector, gameObject.Bounding, slaver.Coordinates, slaver.RunVector, slaver.Bounding); } } } } #endregion #region обновление текстур foreach (DrawableGameObject gameObject in _drawableGameObjects) { gameObject.Update(gameTime); } #endregion _updateCouter++; }
/// <summary> /// ќбновление позиций игровых объектов /// </summary> private void ApplySynchroFrame(SynchroFrame synchroFrame) { _gameSnapshot = new GameSnapshot(synchroFrame, _gameLevel); _gameSnapshot.ApplyEvents(_serverGameEvents.Where(x => x.TimeStamp >= _gameSnapshot.Time)); }