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); } }
public void AddJudgement(DrawableRushJudgement judgement) => judgementContainer.Add(judgement);
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); } } }