// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Textures; using osu.Framework.Testing; using osu.Framework.Utils; using osu.Game.Graphics; using osu.Game.Skinning; using osuTK; namespace osu.Game.Tests.Visual.Gameplay { [TestFixture] public class TestSceneParticleSpewer : OsuTestScene { private TestParticleSpewer spewer; [Resolved] private SkinManager skinManager { get; set; } [BackgroundDependencyLoader] private void load() { Child = spewer = createSpewer(); AddToggleStep("toggle spawning", value => spewer.Active.Value = value); AddSliderStep("particle gravity", 0f, 250f, 0f, value => spewer.Gravity = value); AddSliderStep("particle velocity", 0f, 500f, 250f, value => spewer.MaxVelocity = value); } [SetUpSteps] public void SetUpSteps() { AddStep("create spewer", () => Child = spewer = createSpewer()); } [Test] public void TestPresence() { AddStep("start spewer", () => spewer.Active.Value = true); AddAssert("is present", () => spewer.IsPresent); AddWaitStep("wait for some particles", 3); AddStep("stop spewer", () => spewer.Active.Value = false); AddWaitStep("wait for clean screen", 8); AddAssert("is not present", () => !spewer.IsPresent); } private TestParticleSpewer createSpewer() { return new TestParticleSpewer(skinManager.DefaultLegacySkin.GetTexture("star2")) { Anchor = Anchor.Centre, Origin = Anchor.Centre, }; } private class TestParticleSpewer : ParticleSpewer { private const int lifetime = 1500; private const int rate = 250; public float Gravity; public float MaxVelocity = 250; protected override float ParticleGravity => Gravity; public TestParticleSpewer(Texture texture) : base(texture, rate, lifetime) { } protected override FallingParticle CreateParticle() => new FallingParticle { Velocity = new Vector2( RNG.NextSingle(-MaxVelocity, MaxVelocity), RNG.NextSingle(-MaxVelocity, MaxVelocity) ), Duration = RNG.NextSingle(lifetime), StartAngle = RNG.NextSingle(MathF.PI * 2), EndAngle = RNG.NextSingle(MathF.PI * 2), EndScale = RNG.NextSingle(0.5f, 1.5f) }; } } }