示例#1
0
        private void OnStartup(EntityUid uid, JitteringComponent jittering, ComponentStartup args)
        {
            if (!EntityManager.TryGetComponent(uid, out ISpriteComponent? sprite))
            {
                return;
            }

            var animationPlayer = EntityManager.EnsureComponent <AnimationPlayerComponent>(uid);

            animationPlayer.Play(GetAnimation(jittering, sprite), _jitterAnimationKey);
        }
示例#2
0
        private void OnShutdown(EntityUid uid, JitteringComponent jittering, ComponentShutdown args)
        {
            if (EntityManager.TryGetComponent(uid, out AnimationPlayerComponent? animationPlayer))
            {
                animationPlayer.Stop(_jitterAnimationKey);
            }

            if (EntityManager.TryGetComponent(uid, out SpriteComponent? sprite))
            {
                sprite.Offset = Vector2.Zero;
            }
        }
示例#3
0
        private void OnAnimationCompleted(EntityUid uid, JitteringComponent jittering, AnimationCompletedEvent args)
        {
            if (args.Key != _jitterAnimationKey)
            {
                return;
            }

            if (EntityManager.TryGetComponent(uid, out AnimationPlayerComponent? animationPlayer) &&
                EntityManager.TryGetComponent(uid, out ISpriteComponent? sprite))
            {
                animationPlayer.Play(GetAnimation(jittering, sprite), _jitterAnimationKey);
            }
        }
示例#4
0
        private Animation GetAnimation(JitteringComponent jittering, ISpriteComponent sprite)
        {
            var amplitude = MathF.Min(4f, jittering.Amplitude / 100f + 1f) / 10f;
            var offset    = new Vector2(_random.NextFloat(amplitude / 4f, amplitude),
                                        _random.NextFloat(amplitude / 4f, amplitude / 3f));

            offset.X *= _random.Pick(_sign);
            offset.Y *= _random.Pick(_sign);

            if (Math.Sign(offset.X) == Math.Sign(jittering.LastJitter.X) ||
                Math.Sign(offset.Y) == Math.Sign(jittering.LastJitter.Y))
            {
                // If the sign is the same as last time on both axis we flip one randomly
                // to avoid jitter staying in one quadrant too much.
                if (_random.Prob(0.5f))
                {
                    offset.X *= -1;
                }
                else
                {
                    offset.Y *= -1;
                }
            }

            // Animation length shouldn't be too high so we will cap it at 2 seconds...
            var length = Math.Min((1f / jittering.Frequency), 2f);

            jittering.LastJitter = offset;

            return(new Animation()
            {
                Length = TimeSpan.FromSeconds(length),
                AnimationTracks =
                {
                    new AnimationTrackComponentProperty()
                    {
                        ComponentType = typeof(ISpriteComponent),
                        Property = nameof(ISpriteComponent.Offset),
                        KeyFrames =
                        {
                            new AnimationTrackProperty.KeyFrame(sprite.Offset,     0f),
                            new AnimationTrackProperty.KeyFrame(offset,        length),
                        }
                    }
                }
            });
        }