/// <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); }
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)); }
public override Vector2d GetFrameCamera(int frame) { base.GetFrameCamera(frame); var box = CameraBoundingBox.Create(_frames[frame].RiderCenter, _zoom); return(box.Clamp(CameraMotionReducer(frame))); }