public FollowNPCThenReturn(NPC npc, float lerpTime, int maxTime, float zoom = 1f) { _type = npc.type; // create the camera controller var camera = new CameraController(0f, new CameraController.EntityRelativePoint(Main.LocalPlayer, Vector2.Zero) { Zoom = new Vector2(Main.GameZoomTarget) }) .AddPoint(lerpTime, new CameraController.EntityRelativePoint(npc, Vector2.Zero) { Zoom = new Vector2(zoom) }, EaseFunction.EaseQuadInOut); camera.AmICompleted = () => { if (_setReturn) { return(_currentTime >= lerpTime); } // the npc is dead or the time exceeds the max time if (!npc.active || _type != npc.type || _currentTime > maxTime) { _currentTime = 0f; // reset camera and make it a different one, this one set to return to the player CameraController.CameraPointData data = camera.CurrentData; camera.Reset(); camera.AddPoint(0, new CameraController.StaticPoint(data), EaseFunction.Linear) .AddPoint(lerpTime, new CameraController.EntityRelativePoint(Main.LocalPlayer, Vector2.Zero) { Zoom = new Vector2(Main.GameZoomTarget) }, EaseFunction.EaseQuadInOut); _setReturn = true; } return(false); }; AddToQueue(camera); }
public FollowProjectileThenReturn(Projectile projectile, float lerpTime, float zoom = 1f) { _type = projectile.type; // create the camera controller var camera = new CameraController(0f, new CameraController.EntityRelativePoint(Main.LocalPlayer, Vector2.Zero)) .AddPoint(lerpTime, new CameraController.EntityRelativePoint(projectile, Vector2.Zero) { Zoom = new Vector2(zoom) }, EaseFunction.EaseQuadInOut); camera.AmICompleted = () => { if (_setReturn) { return(_currentTime >= lerpTime); } // the projectile is dead if (!projectile.active || _type != projectile.type) { _currentTime = 0f; // reset camera and make it a different one, this one set to return to the player CameraController.CameraPointData data = camera.CurrentData; camera.Reset(); camera.AddPoint(0f, new CameraController.StaticPoint(data), EaseFunction.Linear) .AddPoint(lerpTime, new CameraController.EntityRelativePoint(Main.LocalPlayer, Vector2.Zero), EaseFunction.EaseQuadInOut); _setReturn = true; } return(false); }; AddToQueue(camera); }
public DestroyerDeath(NPC headNPC) { // get the destroyer in order _destroyerInOrder = new List <NPC>(); _head = headNPC; NPC current = _head; while (current.ai[0] != 0) { _destroyerInOrder.Add(current); current = Main.npc[(int)current.ai[0]]; } _destroyerInOrder.Add(current); // try update all of the ai[2] values foreach (NPC npc in _destroyerInOrder) { npc.ai[2] = 1200f; npc.netUpdate = true; } // create camera controller object var cameraMoves = new CameraController(0f, new CameraController.EntityRelativePoint(Main.LocalPlayer, Vector2.Zero)) .AddPoint(2f, new CameraController.EntityRelativePoint(_head, Vector2.Zero), EaseFunction.EaseCubicInOut) .RepeatPoint(3f); // add it to the controllers AddToQueue(cameraMoves); float time = 3f; float timeBetween = 0.4f; float timeBetweenSubtractor = 0.06f; for (int i = 0; i < _destroyerInOrder.Count; i++) { // get function EaseFunction function = EaseFunction.Linear; if (i == _destroyerInOrder.Count - 1) { function = EaseFunction.EaseQuadOut; } // add move cameraMoves.AddPoint(time, new CameraController.EntityRelativePoint(_destroyerInOrder[i], Vector2.Zero), function); NPC npc = _destroyerInOrder[i]; // play an explosion AddToQueue(new ExpressionController(time, (int k) => { PlayExplosionAt(npc.Center); })); // then change the ai for the bodies at the right time to make them disappear AddToQueue(new ExpressionController(time + timeBetween * 0.04f, (int k) => { npc.ai[2] = 2000f; })); // change the timing time += timeBetween; if (timeBetween > 0.05f) { timeBetween -= timeBetweenSubtractor; if (timeBetweenSubtractor > 0.1f) { timeBetweenSubtractor *= 0.5f; } } else { timeBetween = 0.05f; } } // kill the head at the end AddToQueue(new ExpressionController(time + 2.98f, (int k) => { _head.StrikeNPC(1000, 0f, 1); })); // add the final camera moves cameraMoves.RepeatPoint(time + 1.5f) .AddPoint(time + 3f, new CameraController.EntityRelativePoint(Main.LocalPlayer, Vector2.Zero), EaseFunction.EaseQuadInOut); }