Exemplo n.º 1
0
        private void onNewResult(DrawableHitObject judgedObject, JudgementResult result)
        {
            DrawableRushHitObject rushJudgedObject = (DrawableRushHitObject)judgedObject;
            RushJudgementResult   rushResult       = (RushJudgementResult)result;

            PlayerSprite.HandleResult(rushJudgedObject, result);

            // Display hit explosions for objects that allow it.
            if (result.IsHit && rushJudgedObject.DisplayExplosion)
            {
                Drawable explosion = rushJudgedObject switch
                {
                    DrawableStarSheetHead head => sheetExplosionPool.Get(s => s.Apply(head)),
                    DrawableStarSheetTail tail => sheetExplosionPool.Get(s => s.Apply(tail)),
                    DrawableHeart heart => heartExplosionPool.Get(h => h.Apply(heart)),
                    _ => explosionPool.Get(h => h.Apply(rushJudgedObject)),
                };

                if (rushJudgedObject is IDrawableLanedHit laned)
                {
                    playfieldForLane(laned.Lane).AddExplosion(explosion);
                }
            }

            // Display health point difference if the judgement result implies it.
            var pointDifference = rushResult.Judgement.HealthPointIncreaseFor(rushResult);

            if (pointDifference != 0)
            {
                overPlayerEffectsContainer.Add(healthTextPool.Get(h => h.Apply(pointDifference)));
            }

            // Display judgement results in a drawable for objects that allow it.
            if (rushJudgedObject.DisplayResult)
            {
                DrawableRushJudgement judgementDrawable = judgementPool.Get(j => j.Apply(result, judgedObject));
                LanedHitLane          judgementLane     = LanedHitLane.Air;

                // TODO: showing judgements based on the judged object suggests that
                //       this may want to be inside the object class as well.
                switch (rushJudgedObject.HitObject)
                {
                case Sawblade sawblade:
                    judgementLane = sawblade.Lane.Opposite();
                    break;

                case LanedHit lanedHit:
                    judgementLane = lanedHit.Lane;
                    break;

                case MiniBoss _:
                    break;
                }

                playfieldForLane(judgementLane).AddJudgement(judgementDrawable);
            }
        }
Exemplo n.º 2
0
 public void AddJudgement(DrawableRushJudgement judgement) => judgementContainer.Add(judgement);
Exemplo n.º 3
0
        private void onNewResult(DrawableHitObject judgedObject, JudgementResult result)
        {
            DrawableRushHitObject rushJudgedObject = (DrawableRushHitObject)judgedObject;
            RushJudgementResult   rushResult       = (RushJudgementResult)result;

            PlayerSprite.HandleResult(rushJudgedObject, result);

            const float judgement_time = 250f;

            // Display hit explosions for objects that allow it.
            if (result.IsHit && rushJudgedObject.DisplayExplosion)
            {
                var explosion = rushJudgedObject.CreateHitExplosion();

                if (explosion != null)
                {
                    // TODO: low priority, but the explosion should be added in a container
                    //       that has the hit object container to avoid this kinda hacky check.
                    if (explosion.Depth <= 0)
                    {
                        overEffectContainer.Add(explosion);
                    }
                    else
                    {
                        underEffectContainer.Add(explosion);
                    }
                }
            }

            // Display health point difference if the judgement result implies it.
            var pointDifference = rushResult.Judgement.HealthPointIncreaseFor(rushResult);

            if (pointDifference != 0)
            {
                var healthText = new SpriteText
                {
                    RelativePositionAxes = Axes.Both,
                    Position             = new Vector2(0.75f, 0.5f),
                    Origin = Anchor.Centre,
                    Colour = pointDifference > 0 ? Color4.Green : Color4.Red,
                    Text   = $"{pointDifference:+0;-0}",
                    Font   = FontUsage.Default.With(size: 40),
                    Scale  = new Vector2(1.2f),
                };

                overPlayerEffectsContainer.Add(healthText);

                healthText.ScaleTo(1f, judgement_time)
                .Then()
                .FadeOutFromOne(judgement_time)
                .MoveToOffset(new Vector2(0f, -20f), judgement_time)
                .Expire(true);
            }

            // Display judgement results in a drawable for objects that allow it.
            if (rushJudgedObject.DisplayResult)
            {
                DrawableRushJudgement judgementDrawable = null;

                // TODO: showing judgements based on the judged object suggests that
                //       this may want to be inside the object class as well.
                switch (rushJudgedObject.HitObject)
                {
                case Sawblade sawblade:
                    judgementDrawable = new DrawableRushJudgement(result, rushJudgedObject)
                    {
                        Origin   = Anchor.Centre,
                        Position = new Vector2(0f, judgementPositionForLane(sawblade.Lane.Opposite())),
                        Scale    = new Vector2(1.2f)
                    };

                    break;

                case LanedHit lanedHit:
                    judgementDrawable = new DrawableRushJudgement(result, rushJudgedObject)
                    {
                        Origin   = Anchor.Centre,
                        Position = new Vector2(0f, judgementPositionForLane(lanedHit.Lane)),
                        Scale    = new Vector2(1.5f)
                    };

                    break;
                }

                if (judgementDrawable != null)
                {
                    judgementContainer.Add(judgementDrawable);

                    judgementDrawable.ScaleTo(1f, judgement_time)
                    .Then()
                    .MoveToOffset(new Vector2(-JUDGEMENT_MOVEMENT, 0f), judgement_time, Easing.In)
                    .Expire(true);
                }
            }
        }