mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-26 06:28:35 +01:00
added possible element wobble
This commit is contained in:
parent
407f214f29
commit
72b473dc1d
2 changed files with 35 additions and 6 deletions
|
@ -134,6 +134,13 @@ namespace Demos {
|
||||||
root.AddChild(new Paragraph(Anchor.AutoLeft, 1, paragraph => "Slider is at " + (slider.CurrentValue * 100).Floor() + "%") {PositionOffset = new Vector2(0, 1)});
|
root.AddChild(new Paragraph(Anchor.AutoLeft, 1, paragraph => "Slider is at " + (slider.CurrentValue * 100).Floor() + "%") {PositionOffset = new Vector2(0, 1)});
|
||||||
root.AddChild(slider);
|
root.AddChild(slider);
|
||||||
|
|
||||||
|
// This button uses a coroutine from my Coroutine NuGet package (which is included with MLEM.Startup)
|
||||||
|
// but the important thing it does is change its visual scale and offset (check the method below for more info)
|
||||||
|
root.AddChild(new Button(Anchor.AutoCenter, new Vector2(0.5F, 10), "Wobble", "This button wobbles around visually when clicked, but this doesn't affect its actual size and positioning") {
|
||||||
|
OnClicked = (element, button) => CoroutineHandler.Start(this.WobbleButton(element)),
|
||||||
|
PositionOffset = new Vector2(0, 1)
|
||||||
|
});
|
||||||
|
|
||||||
// Below are some querying examples that help you find certain elements easily
|
// Below are some querying examples that help you find certain elements easily
|
||||||
|
|
||||||
var children = root.GetChildren();
|
var children = root.GetChildren();
|
||||||
|
@ -152,6 +159,23 @@ namespace Demos {
|
||||||
Console.WriteLine($"The root has {autoWidthChildren.Count()} auto-width children, {autoWidthButtons.Count()} of which are buttons");
|
Console.WriteLine($"The root has {autoWidthChildren.Count()} auto-width children, {autoWidthButtons.Count()} of which are buttons");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This method is used by the wobbling button (see above)
|
||||||
|
// Note that this particular example makes use of the Coroutine package
|
||||||
|
private IEnumerator<Wait> WobbleButton(Element button) {
|
||||||
|
var counter = 0F;
|
||||||
|
while (counter < 10) {
|
||||||
|
// The imporant bit is that it changes its added display scale and offset, allowing the button to still maintain the
|
||||||
|
// correct position and scaling for both anchoring and interacting purposes, but to show any kind of animation visually
|
||||||
|
// This could be useful, for example, to create a little feedback effect to clicking it where it changes size for a second
|
||||||
|
button.AddedDisplayScale = new Vector2((float) Math.Sin(counter));
|
||||||
|
button.AddedDisplayOffset = new Vector2((float) Math.Sin(counter / 2) * 4, 0);
|
||||||
|
counter += 0.1F;
|
||||||
|
yield return new WaitSeconds(0.01F);
|
||||||
|
}
|
||||||
|
button.AddedDisplayScale = Vector2.Zero;
|
||||||
|
button.AddedDisplayOffset = Vector2.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void DoDraw(GameTime gameTime) {
|
protected override void DoDraw(GameTime gameTime) {
|
||||||
this.GraphicsDevice.Clear(Color.CornflowerBlue);
|
this.GraphicsDevice.Clear(Color.CornflowerBlue);
|
||||||
base.DoDraw(gameTime);
|
base.DoDraw(gameTime);
|
||||||
|
|
|
@ -74,6 +74,10 @@ namespace MLEM.Ui.Elements {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public Point ScaledChildPadding => this.childPadding.Multiply(this.Scale);
|
public Point ScaledChildPadding => this.childPadding.Multiply(this.Scale);
|
||||||
|
public Vector2 AddedDisplayOffset;
|
||||||
|
public Point ScaledDisplayOffset => (this.AddedDisplayOffset * this.Scale).ToPoint();
|
||||||
|
public Vector2 AddedDisplayScale;
|
||||||
|
public Point ScaledDisplayScale => (this.AddedDisplayScale * this.Scale).ToPoint();
|
||||||
|
|
||||||
public MouseClickCallback OnClicked;
|
public MouseClickCallback OnClicked;
|
||||||
public GenericCallback OnSelected;
|
public GenericCallback OnSelected;
|
||||||
|
@ -123,7 +127,8 @@ namespace MLEM.Ui.Elements {
|
||||||
public Rectangle DisplayArea {
|
public Rectangle DisplayArea {
|
||||||
get {
|
get {
|
||||||
var padded = this.Area;
|
var padded = this.Area;
|
||||||
padded.Location += this.ScaledPadding;
|
padded.Inflate(this.ScaledDisplayScale.X, this.ScaledDisplayScale.Y);
|
||||||
|
padded.Location += this.ScaledPadding + this.ScaledDisplayOffset;
|
||||||
padded.Width -= this.ScaledPadding.X * 2;
|
padded.Width -= this.ScaledPadding.X * 2;
|
||||||
padded.Height -= this.ScaledPadding.Y * 2;
|
padded.Height -= this.ScaledPadding.Y * 2;
|
||||||
return padded;
|
return padded;
|
||||||
|
@ -358,23 +363,23 @@ namespace MLEM.Ui.Elements {
|
||||||
|
|
||||||
public IEnumerable<Element> GetChildren(Func<Element, bool> condition = null, bool regardChildrensChildren = false) {
|
public IEnumerable<Element> GetChildren(Func<Element, bool> condition = null, bool regardChildrensChildren = false) {
|
||||||
foreach (var child in this.Children) {
|
foreach (var child in this.Children) {
|
||||||
if (condition == null || condition(child))
|
|
||||||
yield return child;
|
|
||||||
if (regardChildrensChildren) {
|
if (regardChildrensChildren) {
|
||||||
foreach (var cc in child.GetChildren(condition, true))
|
foreach (var cc in child.GetChildren(condition, true))
|
||||||
yield return cc;
|
yield return cc;
|
||||||
}
|
}
|
||||||
|
if (condition == null || condition(child))
|
||||||
|
yield return child;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<T> GetChildren<T>(Func<T, bool> condition = null, bool regardChildrensChildren = false) where T : Element {
|
public IEnumerable<T> GetChildren<T>(Func<T, bool> condition = null, bool regardChildrensChildren = false) where T : Element {
|
||||||
foreach (var child in this.Children) {
|
foreach (var child in this.Children) {
|
||||||
if (child is T t && (condition == null || condition(t)))
|
|
||||||
yield return t;
|
|
||||||
if (regardChildrensChildren) {
|
if (regardChildrensChildren) {
|
||||||
foreach (var cc in child.GetChildren(condition, true))
|
foreach (var cc in child.GetChildren(condition, true))
|
||||||
yield return cc;
|
yield return cc;
|
||||||
}
|
}
|
||||||
|
if (child is T t && (condition == null || condition(t)))
|
||||||
|
yield return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue