128 lines
4.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|