コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }