LADXHD/InGame/GameObjects/Things/ObjTransition.cs

80 lines
3.7 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Things
{
class ObjTransition : GameObject
{
public Color TransitionColor;
public float Percentage;
public float Brightness;
public float WobblePercentage;
public bool WobbleTransition;
private float _circleSize;
public ObjTransition(Map.Map map) : base(map)
{
SprEditorImage = Resources.SprObjects;
EditorIconSource = new Rectangle(240, 16, 16, 16);
// should be on top of every other object,
// except the player object but only while transitioning
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerTop, new CPosition(0, 0, 0)));
}
public void Draw(SpriteBatch spriteBatch)
{
var gameWidth = Game1.RenderWidth;
var gameHeight = Game1.RenderHeight;
if (!WobbleTransition)
{
_circleSize = (1 - Percentage) * (float)Math.Sqrt(gameWidth * gameWidth + gameHeight * gameHeight) / 2;
var playerPosition = new Vector2(
MapManager.ObjLink.PosX * MapManager.Camera.Scale,
(MapManager.ObjLink.PosY - 8 - MapManager.ObjLink.PosZ) * MapManager.Camera.Scale);
var centerX = gameWidth / 2.0f - (MapManager.Camera.Location.X - playerPosition.X);
var centerY = gameHeight / 2.0f - (MapManager.Camera.Location.Y - playerPosition.Y);
Resources.CircleShader.Parameters["softRad"].SetValue(15f);
Resources.CircleShader.Parameters["size"].SetValue(_circleSize);
Resources.CircleShader.Parameters["centerX"].SetValue(centerX);
Resources.CircleShader.Parameters["centerY"].SetValue(centerY);
Resources.CircleShader.Parameters["width"].SetValue(gameWidth);
Resources.CircleShader.Parameters["height"].SetValue(gameHeight);
// draw the circle
spriteBatch.Begin(SpriteSortMode.Immediate, null, SamplerState.PointWrap, null, null, Resources.CircleShader, Game1.GetMatrix);
spriteBatch.Draw(Resources.SprWhite, new Rectangle(0, 0, gameWidth, gameHeight), TransitionColor);
spriteBatch.End();
}
else
{
// draw the wobble transition effect
Game1.GameManager.ChangeRenderTarget();
Resources.WobbleEffect.Parameters["width"].SetValue(gameWidth);
Resources.WobbleEffect.Parameters["height"].SetValue(gameHeight);
Resources.WobbleEffect.Parameters["scale"].SetValue(MapManager.Camera.Scale);
Resources.WobbleEffect.Parameters["brightness"].SetValue(Brightness);
Resources.WobbleEffect.Parameters["offset"].SetValue(WobblePercentage * 30);
Resources.WobbleEffect.Parameters["offsetWidth"].SetValue((0.5f - MathF.Cos(WobblePercentage * 4) / 2) * 3);
Resources.WobbleEffect.Parameters["offsetHeight"].SetValue(16);
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointWrap, null, null, Resources.WobbleEffect);
spriteBatch.Draw(Game1.GameManager.GetLastRenderTarget(), Vector2.Zero, Color.White);
spriteBatch.End();
}
}
}
}