Exemple #1
0
        /// <summary>
        /// reduces the amount of movement the camera has to do to capture the
        /// rider. It does so predictively
        /// </summary>
        /// <returns>The reduced position in game coords</returns>
        private Vector2d CameraMotionReducer(int frame)
        {
            const int forwardcount = 40;

            EnsureFrame(frame + forwardcount);
            Vector2d offset   = CalculateOffset(frame);
            var      box      = CameraBoundingBox.Create(Vector2d.Zero, _zoom);
            var      framebox = CameraBoundingBox.Create(
                _frames[frame].RiderCenter,
                _zoom);

            Vector2d center = Vector2d.Zero;
            int      math   = 0;

            for (int i = 0; i < forwardcount; i++)
            {
                var f = _frames[frame + i];
                offset  = box.Clamp(offset + f.CameraOffset);
                center += framebox.Clamp(f.RiderCenter + offset);
                math++;
            }
            // force the rider to center at the beginning
            // it looks awkward to predict heavily at the start.
            if (frame < forwardcount)
            {
                return(Vector2d.Lerp(
                           _frames[frame].RiderCenter,
                           center / math,
                           frame / (float)forwardcount));
            }
            return(center / math);
        }
Exemple #2
0
        protected Vector2d CalculateOffset(int frame)
        {
            var box = CameraBoundingBox.Create(Vector2d.Zero, _zoom);

            if (_prevframe != -1 &&
                _prevframe <= frame &&
                (frame - _prevframe) <= 1)
            {
                if (frame == _prevframe)
                {
                    return(_prevcamera);
                }
                if (frame % cacherate != 0)
                {
                    return(box.Clamp(StepCamera(box, ref _prevcamera, frame)));
                }
            }
            int      cachepos   = Math.Min(frame / cacherate, _framecache.Count - 1);
            int      framestart = cachepos * cacherate;
            Vector2d start      = _framecache[cachepos];

            for (int i = framestart; i <= frame; i++)
            {
                if (i % cacherate == 0 && i / cacherate == _framecache.Count)
                {
                    _framecache.Add(start);
                }
                start = StepCamera(box, ref start, i);
            }
            // Debug.WriteLine("Calculating " + framestart + "-" + (frame) + " for legacy camera");
            return(box.Clamp(start));
        }
Exemple #3
0
        public override Vector2d GetFrameCamera(int frame)
        {
            base.GetFrameCamera(frame);

            var box = CameraBoundingBox.Create(_frames[frame].RiderCenter, _zoom);

            return(box.Clamp(CameraMotionReducer(frame)));
        }