예제 #1
0
        protected override void UpdateInitialTransforms()
        {
            base.UpdateInitialTransforms();

            normalAnimation.Show();
            hitAnimation.Hide();
        }
예제 #2
0
        protected override void UpdateStateTransforms(ArmedState state)
        {
            switch (state)
            {
            case ArmedState.Idle:
                UnproxyContent();
                break;

            case ArmedState.Miss:
                this.FadeOut(300);
                break;

            case ArmedState.Hit:
                ProxyContent();

                normalAnimation.Hide();
                hitAnimation.Show();

                const float gravity_time        = 300;
                float       randomness          = -0.5f + (float)random.NextDouble();
                float       rotation            = -180 + randomness * 50f;
                float       gravityTravelHeight = randomness * 50f + (HitObject.Lane == LanedHitLane.Air ? 500f : 400f);

                this.RotateTo(rotation, gravity_time);
                this.MoveToY(-gravityTravelHeight, gravity_time, Easing.Out)
                .Then()
                .MoveToY(gravityTravelHeight * 2, gravity_time * 2, Easing.In);

                this.FadeOut(300);
                break;
            }
        }
예제 #3
0
        protected override void CheckForResult(bool userTriggered, double timeOffset)
        {
            if (userTriggered)
            {
                DrawableMiniBossTick nextTick = null;

                foreach (var t in ticks)
                {
                    if (!t.IsHit)
                    {
                        nextTick = t;
                        break;
                    }
                }

                nextTick?.TriggerResult(HitResult.Great);

                var numHits    = ticks.Count(r => r.IsHit);
                var completion = (float)numHits / HitObject.RequiredHits;

                normalAnimation.Hide();
                hitAnimation.Show();
                hitAnimation.ScaleTo(base_sprite_scale + Math.Min(target_sprite_scale - base_sprite_scale, (target_sprite_scale - base_sprite_scale) * completion), 260, Easing.OutQuint);

                // TODO: update bonus score somehow?

                if (HitObject.HitWindows.CanBeHit(timeOffset))
                {
                    OnAttacked(this, timeOffset);
                }
            }
            else
            {
                if (timeOffset < 0)
                {
                    return;
                }

                int numHits = 0;

                foreach (var tick in ticks)
                {
                    if (tick.IsHit)
                    {
                        numHits++;
                        continue;
                    }

                    tick.TriggerResult(HitResult.Miss);
                }

                var hitResult = numHits == HitObject.RequiredHits
                    ? HitResult.Great
                    : numHits > HitObject.RequiredHits / 2
                        ? HitResult.Good
                        : HitResult.Miss;

                ApplyResult(r => r.Type = hitResult);
            }
        }
예제 #4
0
        protected override void CheckForResult(bool userTriggered, double timeOffset)
        {
            if (Time.Current < HitObject.StartTime || AllJudged)
            {
                return;
            }

            if (userTriggered && timeOffset < 0)
            {
                var nextTick = ticks.FirstOrDefault(t => !t.IsHit);
                nextTick?.TriggerResult(HitResult.Perfect);

                var numHits    = ticks.Count(r => r.IsHit);
                var completion = (float)numHits / HitObject.RequiredHits;

                normalAnimation.Hide();
                hitAnimation.Show();
                hitAnimation.ScaleTo(base_sprite_scale + Math.Min(target_sprite_scale - base_sprite_scale, (target_sprite_scale - base_sprite_scale) * completion), 260, Easing.OutQuint);

                OnAttacked(this, timeOffset);
            }
            else if (!userTriggered && timeOffset >= 0)
            {
                int numHits = 0;

                foreach (var tick in ticks)
                {
                    if (tick.IsHit)
                    {
                        numHits++;
                        continue;
                    }

                    tick.TriggerResult(HitResult.Miss);
                }

                var hitResult = numHits == HitObject.RequiredHits
                    ? HitResult.Perfect
                    : numHits > HitObject.RequiredHits / 2
                        ? HitResult.Great
                        : HitResult.Miss;

                ApplyResult(r => r.Type = hitResult);
            }
        }