attractions and swiping, that took long
This commit is contained in:
parent
234eaa4f72
commit
d612a62306
7 changed files with 156 additions and 17 deletions
42
ThemeParkClicker/Attractions/Attraction.cs
Normal file
42
ThemeParkClicker/Attractions/Attraction.cs
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using MLEM.Startup;
|
||||||
|
using MLEM.Textures;
|
||||||
|
|
||||||
|
namespace ThemeParkClicker.Attractions {
|
||||||
|
public class Attraction {
|
||||||
|
|
||||||
|
public static readonly Dictionary<string, Constructor> Attractions = new Dictionary<string, Constructor>();
|
||||||
|
public static readonly UniformTextureAtlas Texture = new UniformTextureAtlas(MlemGame.LoadContent<Texture2D>("Textures/Attractions"), 16, 16);
|
||||||
|
|
||||||
|
static Attraction() {
|
||||||
|
Attractions.Add("Carousel", () => new Attraction(new[,] {{true}}, Texture[0, 0, 1, 1], 0.25F, 50));
|
||||||
|
Attractions.Add("FoodCourt", () => new Attraction(new[,] {{true, true}}, Texture[1, 0, 2, 1], 0.6F, 300));
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly bool[,] area;
|
||||||
|
public int Width => this.area.GetLength(0);
|
||||||
|
public int Height => this.area.GetLength(1);
|
||||||
|
public readonly TextureRegion TextureRegion;
|
||||||
|
public readonly float GenerationPerSecond;
|
||||||
|
public readonly long InitialPrice;
|
||||||
|
|
||||||
|
public Attraction(bool[,] area, TextureRegion texture, float generationPerSecond, long initialPrice) {
|
||||||
|
this.area = area;
|
||||||
|
this.TextureRegion = texture;
|
||||||
|
this.GenerationPerSecond = generationPerSecond;
|
||||||
|
this.InitialPrice = initialPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasTileAt(int x, int y) {
|
||||||
|
return this.area[y, x];
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate Attraction Constructor();
|
||||||
|
|
||||||
|
public long GetPrice() {
|
||||||
|
return this.InitialPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,3 +30,8 @@
|
||||||
/processor:FontDescriptionProcessor
|
/processor:FontDescriptionProcessor
|
||||||
/build:Fonts/Regular.spritefont
|
/build:Fonts/Regular.spritefont
|
||||||
|
|
||||||
|
#begin Textures/Attractions.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/build:Textures/Attractions.png
|
||||||
|
|
||||||
|
|
BIN
ThemeParkClicker/Content/Textures/Attractions.aseprite
Normal file
BIN
ThemeParkClicker/Content/Textures/Attractions.aseprite
Normal file
Binary file not shown.
BIN
ThemeParkClicker/Content/Textures/Attractions.png
Normal file
BIN
ThemeParkClicker/Content/Textures/Attractions.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
|
@ -25,6 +25,11 @@ namespace ThemeParkClicker {
|
||||||
return this.Tickets.ToString();
|
return this.Tickets.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void DoUpdate(GameTime gameTime) {
|
||||||
|
base.DoUpdate(gameTime);
|
||||||
|
this.Ui.Update(gameTime);
|
||||||
|
}
|
||||||
|
|
||||||
protected override void DoDraw(GameTime gameTime) {
|
protected override void DoDraw(GameTime gameTime) {
|
||||||
this.GraphicsDevice.Clear(ColorExtensions.FromHex(0x86cfcb));
|
this.GraphicsDevice.Clear(ColorExtensions.FromHex(0x86cfcb));
|
||||||
base.DoDraw(gameTime);
|
base.DoDraw(gameTime);
|
||||||
|
|
|
@ -5,14 +5,10 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MLEM.Startup" Version="3.3.2" />
|
<PackageReference Include="MLEM.Startup" Version="3.3.3-186" />
|
||||||
<PackageReference Include="MonoGame.Framework.Portable" Version="3.7.1.189">
|
<PackageReference Include="MonoGame.Framework.Portable" Version="3.7.1.189">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Content\Textures" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
|
@ -1,30 +1,43 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Coroutine;
|
using Coroutine;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using Microsoft.Xna.Framework.Input.Touch;
|
||||||
|
using MLEM.Extensions;
|
||||||
using MLEM.Font;
|
using MLEM.Font;
|
||||||
|
using MLEM.Formatting.Codes;
|
||||||
|
using MLEM.Misc;
|
||||||
using MLEM.Startup;
|
using MLEM.Startup;
|
||||||
using MLEM.Textures;
|
using MLEM.Textures;
|
||||||
using MLEM.Ui;
|
using MLEM.Ui;
|
||||||
using MLEM.Ui.Elements;
|
using MLEM.Ui.Elements;
|
||||||
|
using ThemeParkClicker.Attractions;
|
||||||
|
|
||||||
namespace ThemeParkClicker {
|
namespace ThemeParkClicker {
|
||||||
public class Ui {
|
public class Ui {
|
||||||
|
|
||||||
public static readonly UniformTextureAtlas Texture = new UniformTextureAtlas(MlemGame.LoadContent<Texture2D>("Textures/Ui"), 16, 16);
|
public static readonly UniformTextureAtlas Texture = new UniformTextureAtlas(MlemGame.LoadContent<Texture2D>("Textures/Ui"), 16, 16);
|
||||||
|
private readonly UiSystem uiSystem;
|
||||||
|
private readonly Element[] swipeRelations;
|
||||||
|
private Element currentUi;
|
||||||
|
private float swipeProgress;
|
||||||
|
private bool finishingSwipe;
|
||||||
|
|
||||||
public Ui(UiSystem uiSystem) {
|
public Ui(UiSystem uiSystem) {
|
||||||
uiSystem.GlobalScale = 4;
|
this.uiSystem = uiSystem;
|
||||||
uiSystem.AutoScaleWithScreen = true;
|
this.uiSystem.GlobalScale = 4;
|
||||||
uiSystem.AutoScaleReferenceSize = new Point(720, 1280);
|
this.uiSystem.AutoScaleWithScreen = true;
|
||||||
uiSystem.Style.Font = new GenericSpriteFont(MlemGame.LoadContent<SpriteFont>("Fonts/Regular"));
|
this.uiSystem.AutoScaleReferenceSize = new Point(720, 1280);
|
||||||
uiSystem.Style.TextScale = 0.1F;
|
this.uiSystem.Style.Font = new GenericSpriteFont(MlemGame.LoadContent<SpriteFont>("Fonts/Regular"));
|
||||||
|
this.uiSystem.Style.TextScale = 0.1F;
|
||||||
|
this.uiSystem.TextFormatter.AddImage("ticket", Texture[2, 0]);
|
||||||
|
|
||||||
// ticket store ui
|
// main ticket store ui
|
||||||
var rainingTickets = new List<RainingTicket>();
|
var rainingTickets = new List<RainingTicket>();
|
||||||
Group ticketStoreUi = new Group(Anchor.TopLeft, Vector2.One, false) {
|
var main = new Group(Anchor.TopLeft, Vector2.One, false) {
|
||||||
OnUpdated = (e, time) => {
|
OnUpdated = (e, time) => {
|
||||||
for (var i = rainingTickets.Count - 1; i >= 0; i--) {
|
for (var i = rainingTickets.Count - 1; i >= 0; i--) {
|
||||||
if (rainingTickets[i].Update())
|
if (rainingTickets[i].Update())
|
||||||
|
@ -38,10 +51,10 @@ namespace ThemeParkClicker {
|
||||||
ticket.Draw(batch, e.DisplayArea.Size, e.Scale);
|
ticket.Draw(batch, e.DisplayArea.Size, e.Scale);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
ticketStoreUi.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => GameImpl.Instance.DisplayTicketCount(), true) {
|
main.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => GameImpl.Instance.DisplayTicketCount(), true) {
|
||||||
TextScale = 0.3F
|
TextScale = 0.3F
|
||||||
});
|
});
|
||||||
var storeGroup = ticketStoreUi.AddChild(new CustomDrawGroup(Anchor.AutoLeft, Vector2.One));
|
var storeGroup = main.AddChild(new CustomDrawGroup(Anchor.AutoLeft, Vector2.One));
|
||||||
storeGroup.AddChild(new Image(Anchor.TopLeft, Vector2.One, Texture[0, 0, 2, 3]) {
|
storeGroup.AddChild(new Image(Anchor.TopLeft, Vector2.One, Texture[0, 0, 2, 3]) {
|
||||||
OnPressed = e => {
|
OnPressed = e => {
|
||||||
GameImpl.Instance.Tickets++;
|
GameImpl.Instance.Tickets++;
|
||||||
|
@ -50,11 +63,89 @@ namespace ThemeParkClicker {
|
||||||
CanBeSelected = true,
|
CanBeSelected = true,
|
||||||
CanBeMoused = true
|
CanBeMoused = true
|
||||||
});
|
});
|
||||||
ticketStoreUi.OnAreaUpdated += e => storeGroup.Size = new Vector2(e.DisplayArea.Width / e.Scale);
|
main.OnAreaUpdated += e => storeGroup.Size = new Vector2(e.DisplayArea.Width / e.Scale);
|
||||||
uiSystem.Add("TicketStore", ticketStoreUi);
|
this.currentUi = main;
|
||||||
|
this.uiSystem.Add("Main", main);
|
||||||
|
|
||||||
|
// buy ui
|
||||||
|
var buyUi = new Panel(Anchor.TopLeft, Vector2.One, Vector2.Zero, false, true, new Point(10, 30), false) {
|
||||||
|
ChildPadding = new Padding(5, 15, 5, 5),
|
||||||
|
IsHidden = true
|
||||||
|
};
|
||||||
|
foreach (var attraction in Attraction.Attractions) {
|
||||||
|
var instance = attraction.Value();
|
||||||
|
var button = buyUi.AddChild(new Button(Anchor.AutoLeft, new Vector2(1, 40)) {
|
||||||
|
ChildPadding = new Vector2(4),
|
||||||
|
Padding = new Padding(0, 0, 0, 4)
|
||||||
|
});
|
||||||
|
button.OnUpdated += (e, time) => {
|
||||||
|
button.IsDisabled = GameImpl.Instance.Tickets < instance.GetPrice();
|
||||||
|
};
|
||||||
|
var center = button.AddChild(new Group(Anchor.Center, new Vector2(0.8F, 1), false));
|
||||||
|
center.AddChild(new Paragraph(Anchor.AutoCenter, 1, attraction.Key, true));
|
||||||
|
center.AddChild(new Paragraph(Anchor.AutoCenter, 1, instance.GenerationPerSecond + "<i ticket>/s", true) {TextScale = 0.08F});
|
||||||
|
var image = button.AddChild(new Image(Anchor.CenterLeft, new Vector2(1), instance.TextureRegion) {
|
||||||
|
Padding = new Vector2(4)
|
||||||
|
});
|
||||||
|
button.OnAreaUpdated += e => image.Size = new Vector2(e.DisplayArea.Height / e.Scale);
|
||||||
|
button.AddChild(new Paragraph(Anchor.CenterRight, 1, p => instance.GetPrice() + "<i ticket>", true));
|
||||||
|
}
|
||||||
|
this.uiSystem.Add("Buy", buyUi);
|
||||||
|
|
||||||
|
this.swipeRelations = new Element[] {main, buyUi};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerator<IWait> WobbleElement(CustomDrawGroup element, float intensity = 0.01F) {
|
public void Update(GameTime time) {
|
||||||
|
// swiping between tabs
|
||||||
|
if (MlemGame.Input.GetGesture(GestureType.HorizontalDrag, out var gesture)) {
|
||||||
|
this.swipeProgress -= gesture.Delta.X / this.currentUi.DisplayArea.Width;
|
||||||
|
} else if (!this.finishingSwipe && this.swipeProgress != 0 && !MlemGame.Input.TouchState.Any()) {
|
||||||
|
// if we're not dragging or holding, we need to move back to our current ui
|
||||||
|
this.swipeProgress -= Math.Sign(this.swipeProgress) * 0.03F;
|
||||||
|
if (this.swipeProgress.Equals(0, 0.03F))
|
||||||
|
this.ResetSwipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.swipeProgress != 0) {
|
||||||
|
// actual swipe reaction logic
|
||||||
|
var curr = Array.IndexOf(this.swipeRelations, this.currentUi);
|
||||||
|
var next = curr + Math.Sign(this.swipeProgress);
|
||||||
|
if (next >= 0 && next < this.swipeRelations.Length) {
|
||||||
|
this.swipeRelations[next].IsHidden = false;
|
||||||
|
// if we've swiped a bit, we count this as a success and move to the next ui
|
||||||
|
this.finishingSwipe = Math.Abs(this.swipeProgress) >= 0.15F;
|
||||||
|
// if we're in the process of finishing a swipe, move without requiring input
|
||||||
|
if (this.finishingSwipe) {
|
||||||
|
if (!MlemGame.Input.TouchState.Any())
|
||||||
|
this.swipeProgress += Math.Sign(this.swipeProgress) * 0.05F;
|
||||||
|
// we're done with the swipe, so switch the active ui
|
||||||
|
if (this.swipeProgress.Equals(Math.Sign(this.swipeProgress), 0.05F)) {
|
||||||
|
this.currentUi = this.swipeRelations[next];
|
||||||
|
this.ResetSwipe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// when we're swiping into the void, we want to stop at the max
|
||||||
|
this.swipeProgress = MathHelper.Clamp(this.swipeProgress, -1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update element positions
|
||||||
|
this.currentUi.Root.Transform = Matrix.CreateTranslation(-this.swipeProgress * this.currentUi.DisplayArea.Width, 0, 0);
|
||||||
|
if (next >= 0 && next < this.swipeRelations.Length)
|
||||||
|
this.swipeRelations[next].Root.Transform = Matrix.CreateTranslation((Math.Sign(this.swipeProgress) - this.swipeProgress) * this.swipeRelations[next].DisplayArea.Width, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetSwipe() {
|
||||||
|
this.finishingSwipe = false;
|
||||||
|
this.swipeProgress = 0;
|
||||||
|
foreach (var element in this.swipeRelations) {
|
||||||
|
element.IsHidden = element != this.currentUi;
|
||||||
|
element.Root.Transform = Matrix.Identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerator<IWait> WobbleElement(CustomDrawGroup element, float intensity = 0.02F) {
|
||||||
var sin = 0F;
|
var sin = 0F;
|
||||||
while (sin < MathHelper.Pi) {
|
while (sin < MathHelper.Pi) {
|
||||||
element.ScaleOrigin(1 + (float) Math.Sin(sin) * intensity);
|
element.ScaleOrigin(1 + (float) Math.Sin(sin) * intensity);
|
||||||
|
|
Loading…
Reference in a new issue