osu/osu.Game/Graphics/Backgrounds/Triangles.cs

83 lines
2.7 KiB
C#
Raw Normal View History

//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Linq;
using osu.Framework.Allocation;
2016-12-01 11:21:14 +00:00
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
using osu.Framework.MathUtils;
using OpenTK;
2017-01-30 07:53:12 +00:00
using OpenTK.Graphics;
namespace osu.Game.Graphics.Backgrounds
{
2016-12-01 18:12:35 +00:00
public class Triangles : Container<Triangle>
{
public override bool HandleInput => false;
2017-01-30 07:53:12 +00:00
public Color4 ColourLight = Color4.White;
public Color4 ColourDark = Color4.Black;
2016-12-01 11:21:14 +00:00
private float triangleScale = 1;
public float TriangleScale
{
get { return triangleScale; }
set
{
triangleScale = value;
Children.ForEach(t => t.ScaleTo(triangleScale));
}
}
private int aimTriangleCount => (int)((DrawWidth * DrawHeight) / 800 / triangleScale);
protected override void Update()
{
base.Update();
foreach (Drawable d in Children)
{
2016-12-01 11:21:14 +00:00
d.Position -= new Vector2(0, (float)(d.Scale.X * (50 / DrawHeight) * (Time.Elapsed / 880)) / triangleScale);
if (d.DrawPosition.Y + d.DrawSize.Y * d.Scale.Y < 0)
d.Expire();
}
bool useRandomX = Children.Count() < aimTriangleCount / 2;
while (Children.Count() < aimTriangleCount)
addTriangle(useRandomX);
}
2016-12-01 18:12:35 +00:00
protected virtual Triangle CreateTriangle()
{
2016-12-01 11:21:14 +00:00
var scale = triangleScale * RNG.NextSingle() * 0.4f + 0.2f;
2016-12-01 18:12:35 +00:00
const float size = 100;
2016-12-01 11:21:14 +00:00
2016-12-01 18:12:35 +00:00
return new Triangle
{
Origin = Anchor.TopCentre,
RelativePositionAxes = Axes.Both,
2016-12-01 11:21:14 +00:00
Scale = new Vector2(scale),
2016-12-01 18:12:35 +00:00
// Scaling height by 0.866 results in equiangular triangles (== 60° and equal side length)
2017-01-30 07:53:12 +00:00
Colour = GetTriangleShade(),
2016-12-01 18:12:35 +00:00
Size = new Vector2(size, 0.866f * size),
2016-12-01 11:21:14 +00:00
Depth = scale,
};
}
2017-01-30 07:53:12 +00:00
protected virtual Color4 GetTriangleShade() => Interpolation.ValueAt(RNG.NextSingle(), ColourDark, ColourLight, 0, 1);
2016-12-01 11:21:14 +00:00
private void addTriangle(bool randomX)
{
var sprite = CreateTriangle();
sprite.Position = new Vector2(RNG.NextSingle(), randomX ? RNG.NextSingle() : 1);
Add(sprite);
}
}
}