imrpoved UI system structure and added a basic text module for testing; Untested.

This commit is contained in:
2018-09-15 13:15:32 -05:00
parent b0ecc4f457
commit 3779f220ff
13 changed files with 277 additions and 95 deletions

View File

@@ -0,0 +1,38 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RhythmBullet.Zer01HD.UI.Modular
{
public class Module
{
public Vector2 Position = new Vector2();
public float Width, Height;
public ModuleGroup Parent;
public string Name;
public Color Color;
public virtual void Update(GameTime gameTime)
{
}
public virtual void Draw(SpriteBatch batch)
{
}
public void RemoveFromParent()
{
if (Parent == null)
{
throw new InvalidOperationException("Parent is null.");
}
Parent.RemoveModule(this);
}
}
}

View File

@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace RhythmBullet.Zer01HD.UI.Modular
{
public class ModuleGroup : Module
{
List<Module> modules = new List<Module>();
Rectangle scissorBounds;
RasterizerState scissorRasterizer = new RasterizerState();
public ModuleGroup(bool crop = false)
{
if (crop)
{
scissorRasterizer.ScissorTestEnable = true;
scissorBounds = new Rectangle();
}
}
public override void Draw(SpriteBatch batch)
{
if (scissorBounds != null)
{
batch.End();
batch.Begin(SpriteSortMode.Deferred, null, null, null, scissorRasterizer);
scissorBounds.Width = (int) Width;
scissorBounds.Height = (int) Height;
scissorBounds.X = (int) Position.X;
scissorBounds.Y = (int) Position.Y;
Rectangle scissor = scissorBounds;
scissorBounds = batch.GraphicsDevice.ScissorRectangle;
batch.GraphicsDevice.ScissorRectangle = scissor;
}
foreach (Module module in modules)
{
float offsetX = module.Position.X;
float offsetY = module.Position.Y;
module.Position.X = Position.X + offsetX;
module.Position.Y = Position.Y + offsetY;
module.Draw(batch);
module.Position.X = offsetX;
module.Position.Y = offsetY;
}
if (scissorBounds != null)
{
batch.GraphicsDevice.ScissorRectangle = scissorBounds;
batch.End();
batch.Begin();
}
}
public override void Update(GameTime gameTime)
{
foreach (Module module in modules)
{
module.Update(gameTime);
}
}
public void AddModule(params Module[] addModules)
{
foreach (Module module in addModules)
{
if (modules.Contains(module))
{
throw new InvalidOperationException(module.ToString() + " already exists in " + this.ToString());
}
module.Parent = this;
modules.Add(module);
}
}
public void RemoveModule(Module module)
{
module.Parent = null;
modules.Remove(module);
}
}
}

View File

@@ -0,0 +1,40 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RhythmBullet.Zer01HD.UI.Modular
{
class Text : Module
{
private SpriteFont font;
private float scale;
public string DisplayedText
{
get
{
return DisplayedText;
}
set
{
Vector2 size = font.MeasureString(value);
Width = size.X;
scale = Height / size.Y;
}
}
public Text(string displayedText, SpriteFont font, int height)
{
this.font = font;
Height = height;
}
public override void Draw(SpriteBatch batch)
{
batch.DrawString(font, DisplayedText, Position, Color);
base.Draw(batch);
}
}
}