TouchyTickets/ThemeParkClicker/Ui.cs
2020-05-30 19:41:49 +02:00

68 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Numerics;
using Coroutine;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MLEM.Font;
using MLEM.Startup;
using MLEM.Textures;
using MLEM.Ui;
using MLEM.Ui.Elements;
namespace ThemeParkClicker {
public class Ui {
public static readonly UniformTextureAtlas Texture = new UniformTextureAtlas(MlemGame.LoadContent<Texture2D>("Textures/Ui"), 16, 16);
public Ui(UiSystem uiSystem) {
uiSystem.GlobalScale = 4;
uiSystem.AutoScaleWithScreen = true;
uiSystem.AutoScaleReferenceSize = new Point(720, 1280);
uiSystem.Style.Font = new GenericSpriteFont(MlemGame.LoadContent<SpriteFont>("Fonts/Regular"));
uiSystem.Style.TextScale = 0.1F;
// ticket store ui
var rainingTickets = new List<RainingTicket>();
Group ticketStoreUi = new Group(Anchor.TopLeft, Vector2.One, false) {
OnUpdated = (e, time) => {
for (var i = rainingTickets.Count - 1; i >= 0; i--) {
if (rainingTickets[i].Update())
rainingTickets.RemoveAt(i);
}
while (rainingTickets.Count < BigInteger.Min(GameImpl.Instance.Tickets / 100, 500))
rainingTickets.Add(new RainingTicket());
},
OnDrawn = (e, time, batch, alpha) => {
foreach (var ticket in rainingTickets)
ticket.Draw(batch, e.DisplayArea.Size, e.Scale);
}
};
ticketStoreUi.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => GameImpl.Instance.DisplayTicketCount(), true) {
TextScale = 0.3F
});
var storeGroup = ticketStoreUi.AddChild(new CustomDrawGroup(Anchor.AutoLeft, Vector2.One));
storeGroup.AddChild(new Image(Anchor.TopLeft, Vector2.One, Texture[0, 0, 2, 3]) {
OnPressed = e => {
GameImpl.Instance.Tickets++;
CoroutineHandler.Start(WobbleElement(storeGroup));
},
CanBeSelected = true,
CanBeMoused = true
});
ticketStoreUi.OnAreaUpdated += e => storeGroup.Size = new Vector2(e.DisplayArea.Width / e.Scale);
uiSystem.Add("TicketStore", ticketStoreUi);
}
private static IEnumerator<IWait> WobbleElement(CustomDrawGroup element, float intensity = 0.01F) {
var sin = 0F;
while (sin < MathHelper.Pi) {
element.ScaleOrigin(1 + (float) Math.Sin(sin) * intensity * element.Scale);
sin += 0.2F;
yield return new WaitEvent(CoroutineEvents.Update);
}
element.Transform = Matrix.Identity;
}
}
}