LADXHD/InGame/Overlay/HUDOverlay.cs
2023-12-14 17:21:22 -05:00

117 lines
5.9 KiB
C#

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.Base.UI;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.Overlay
{
public class HudOverlay
{
private readonly ItemSlotOverlay _itemSlotOverlay = new ItemSlotOverlay();
private readonly UiRectangle _heartBackground;
private readonly UiRectangle _rubeeBackground;
private readonly DictAtlasEntry _saveIcon;
private Rectangle _gameUiWindow;
private Point _heartPosition;
private Point _rubeePosition;
private Vector2 _saveIconPosition;
private const int FadeOffsetBackground = 10;
private const int FadeOffset = 13;
private const int SaveIconTime = 1000;
private float _saveIconTransparency;
private float _saveIconCounter;
public HudOverlay()
{
_heartBackground = new UiRectangle(Rectangle.Empty, "heart", Values.ScreenNameGame, Values.OverlayBackgroundColor, Values.OverlayBackgroundBlurColor, null) { Radius = Values.UiBackgroundRadius };
Game1.EditorUi.AddElement(_heartBackground);
_rubeeBackground = new UiRectangle(Rectangle.Empty, "rubee", Values.ScreenNameGame, Values.OverlayBackgroundColor, Values.OverlayBackgroundBlurColor, null) { Radius = Values.UiBackgroundRadius };
Game1.EditorUi.AddElement(_rubeeBackground);
_saveIcon = Resources.GetSprite("save_icon");
}
public void Update(float fadePercentage, float transparency)
{
_saveIconCounter -= Game1.DeltaTime;
if (_saveIconCounter < 0)
_saveIconCounter = 0;
_saveIconTransparency = Math.Min(Math.Clamp(_saveIconCounter / 100, 0, 1), Math.Clamp((SaveIconTime - _saveIconCounter) / 100, 0, 1));
// TODO_Opt: maybe add settings for wide screen positioning
var scale = Math.Min(Game1.WindowWidth / (float)Values.MinWidth, Game1.WindowHeight / (float)Values.MinHeight);
// not so gud
_gameUiWindow.Width = (int)(Values.MinWidth * scale);
_gameUiWindow.Height = (int)(Values.MinHeight * scale);
var ar = MathHelper.Clamp(Game1.WindowWidth / (float)Game1.WindowHeight, 1, 2);
_gameUiWindow.Width = MathHelper.Clamp((int)(Game1.WindowHeight * ar), 0, Game1.WindowWidth);
_gameUiWindow.Height = MathHelper.Clamp((int)(Game1.WindowWidth / ar), 0, Game1.WindowHeight);
_gameUiWindow.X = Game1.WindowWidth / 2 - _gameUiWindow.Width / 2;
_gameUiWindow.Y = Game1.WindowHeight / 2 - _gameUiWindow.Height / 2;
// top left
_heartPosition = new Point(_gameUiWindow.X + 16 * Game1.UiScale, _gameUiWindow.Y + 16 * Game1.UiScale);
_heartBackground.Rectangle = ItemDrawHelper.GetHeartRectangle(_heartPosition, Game1.UiScale);
_heartBackground.Rectangle.X -= (int)(fadePercentage * FadeOffsetBackground * Game1.UiScale);
_heartBackground.BackgroundColor = Values.OverlayBackgroundColor * transparency;
_heartBackground.BlurColor = Values.OverlayBackgroundBlurColor * transparency;
// top right
_rubeePosition = new Point(
_gameUiWindow.X + _gameUiWindow.Width - ItemDrawHelper.RubeeSize.X * Game1.UiScale - 16 * Game1.UiScale,
_gameUiWindow.Y + 16 * Game1.UiScale);
_rubeeBackground.Rectangle = ItemDrawHelper.GetRubeeRectangle(new Point(_rubeePosition.X, _rubeePosition.Y), Game1.UiScale);
_rubeeBackground.Rectangle.X += (int)(fadePercentage * FadeOffsetBackground * Game1.UiScale);
_rubeeBackground.BackgroundColor = Values.OverlayBackgroundColor * transparency;
_rubeeBackground.BlurColor = Values.OverlayBackgroundBlurColor * transparency;
// bottom left
_itemSlotOverlay.UpdatePositions(_gameUiWindow, new Point(-(int)(fadePercentage * FadeOffsetBackground * Game1.UiScale), 0), Game1.UiScale);
_itemSlotOverlay.SetTransparency(transparency);
// bottom right
_saveIconPosition = new Vector2(
_gameUiWindow.X + _gameUiWindow.Width - _saveIcon.SourceRectangle.Width * Game1.UiScale - 16 * Game1.UiScale,
_gameUiWindow.Y + _gameUiWindow.Height - _saveIcon.SourceRectangle.Height * Game1.UiScale - 16 * Game1.UiScale);
}
public void DrawTop(SpriteBatch spriteBatch, float fadePercentage, float transparency)
{
// draw the item slots
ItemSlotOverlay.Draw(spriteBatch, _itemSlotOverlay.ItemSlotPosition - new Point((int)(fadePercentage * FadeOffset * Game1.UiScale), 0), Game1.UiScale, transparency);
//DrawHelper.DrawSmallKeys(spriteBatch, _keyPosition, Game1.UiScale, Color.White * transparency);
// draw the rubees
ItemDrawHelper.DrawRubee(spriteBatch, _rubeePosition + new Point((int)(fadePercentage * FadeOffset * Game1.UiScale), 0), Game1.UiScale, Color.Black * transparency);
// draw the heart position
ItemDrawHelper.DrawHearts(spriteBatch, _heartPosition - new Point((int)(fadePercentage * FadeOffset * Game1.UiScale), 0), Game1.UiScale, Color.White * transparency);
}
public void DrawBlur(SpriteBatch spriteBatch)
{
// draw the save icon
Resources.RoundedCornerBlurEffect.Parameters["blurColor"].SetValue((Values.OverlayBackgroundBlurColor * _saveIconTransparency).ToVector4());
DrawHelper.DrawNormalized(spriteBatch, _saveIcon.Texture, _saveIconPosition, _saveIcon.ScaledRectangle, Values.OverlayBackgroundColor * _saveIconTransparency, Game1.UiScale);
}
public void ShowSaveIcon()
{
_saveIconCounter = SaveIconTime;
}
}
}