Пример #1
0
        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);
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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++;
        }
Пример #5
0
        /// <summary>
        /// ќбновление позиций игровых объектов
        /// </summary>
        private void ApplySynchroFrame(SynchroFrame synchroFrame)
        {
            _gameSnapshot = new GameSnapshot(synchroFrame, _gameLevel);

            _gameSnapshot.ApplyEvents(_serverGameEvents.Where(x => x.TimeStamp >= _gameSnapshot.Time));
        }