Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaClient/Source/Screens/CreditsPlayer.cs
T
2019-05-16 05:58:48 +03:00

128 lines
4.9 KiB
C#

using Microsoft.Xna.Framework;
using System;
using System.Xml.Linq;
namespace Barotrauma
{
class CreditsPlayer : GUIComponent
{
private GUIListBox listBox;
private readonly float scrollSpeed;
public CreditsPlayer(RectTransform rectT, string configFile) : base(null, rectT)
{
var doc = XMLExtensions.TryLoadXml(configFile);
scrollSpeed = doc.Root.GetAttributeFloat("scrollspeed", 100.0f);
int spacing = doc.Root.GetAttributeInt("spacing", 0);
listBox = new GUIListBox(new RectTransform(Vector2.One, rectT), style: null)
{
Spacing = spacing
};
foreach (XElement subElement in doc.Root.Elements())
{
switch (subElement.Name.ToString().ToLowerInvariant())
{
case "text":
AddTextElement(subElement, listBox.Content.RectTransform);
break;
case "spacing":
AddSpacingElement(subElement, listBox.Content.RectTransform);
break;
case "image":
AddImageElement(subElement, listBox.Content.RectTransform);
break;
}
}
listBox.UpdateScrollBarSize();
}
private void AddTextElement(XElement element, RectTransform parent)
{
var text = element.ElementInnerText().Replace(@"\n", "\n");
Color color = element.GetAttributeColor("color", Color.White);
float scale = element.GetAttributeFloat("scale", 1.0f);
Alignment alignment = Alignment.Center;
Enum.TryParse(element.GetAttributeString("alignment", "Center"), out alignment);
ScalableFont font = GUI.Font;
switch (element.GetAttributeString("font", "Font").ToLowerInvariant())
{
case "font":
font = GUI.Font;
break;
case "smallfont":
font = GUI.SmallFont;
break;
case "largefont":
font = GUI.LargeFont;
break;
case "videotitlefont":
font = GUI.VideoTitleFont;
break;
case "objectivetitlefont":
font = GUI.ObjectiveTitleFont;
break;
case "objectivenamefont":
font = GUI.ObjectiveNameFont;
break;
}
var textHolder = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.0f), parent), style: null);
var textBlock = new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.0f), textHolder.RectTransform, Anchor.Center),
text,
color,
font,
alignment,
wrap: true)
{
TextScale = scale
};
textBlock.RectTransform.IsFixedSize = textHolder.RectTransform.IsFixedSize = true;
textBlock.RectTransform.NonScaledSize = new Point(textBlock.Rect.Width, textBlock.Rect.Height);
textHolder.RectTransform.NonScaledSize = new Point(textHolder.Rect.Width, textBlock.Rect.Height);
}
private void AddSpacingElement(XElement element, RectTransform parent)
{
if (element.Attribute("absoluteheight") != null)
{
int absoluteHeight = element.GetAttributeInt("absoluteheight", 10);
var textHolder = new GUIFrame(new RectTransform(new Point(parent.NonScaledSize.X, absoluteHeight), parent), style: null);
}
else
{
float relativeHeight = element.GetAttributeFloat("relativeheight", 0.0f);
var textHolder = new GUIFrame(new RectTransform(new Vector2(1.0f, relativeHeight), parent), style: null);
}
}
private void AddImageElement(XElement element, RectTransform parent)
{
Sprite sprite = new Sprite(element);
if (element.Attribute("absoluteheight") != null)
{
int absoluteHeight = element.GetAttributeInt("absoluteheight", 10);
new GUIImage(new RectTransform(new Point(parent.NonScaledSize.X, absoluteHeight), parent), sprite, scaleToFit: true);
}
else
{
float relativeHeight = element.GetAttributeFloat("relativeheight", 0.0f);
new GUIImage(new RectTransform(new Vector2(1.0f, relativeHeight), parent), sprite, scaleToFit: true);
}
}
protected override void Update(float deltaTime)
{
listBox.BarScroll += scrollSpeed / listBox.TotalSize * deltaTime;
if (listBox.BarScroll >= 1.0f)
{
listBox.BarScroll = 0.0f;
}
}
}
}