LADXHD/InGame/GameObjects/Base/Components/BodyDrawComponent.cs
2023-12-14 17:21:22 -05:00

88 lines
3.9 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Base.Components
{
class BodyDrawComponent : DrawComponent
{
public int WaterOutlineOffsetY;
public bool WaterOutline = true;
public bool DeepWaterOutline = false;
public bool Gras = true;
private readonly BodyComponent _body;
public delegate void DrawFunc(SpriteBatch spriteBatch);
private DrawFunc _draw;
private static Rectangle _sourceGrass;
private static Rectangle _sourceWater;
public BodyDrawComponent(BodyComponent body, DrawFunc draw, int layer)
: base(layer, body.Position)
{
_body = body;
_draw = draw;
Draw = DrawFunction;
if (_sourceGrass == Rectangle.Empty)
_sourceGrass = Resources.SourceRectangle("grass");
if (_sourceWater == Rectangle.Empty)
_sourceWater = Resources.SourceRectangle("water");
}
public BodyDrawComponent(BodyComponent body, CSprite sprite, int layer)
: this(body, sprite.Draw, layer) { }
public void DrawFunction(SpriteBatch spriteBatch)
{
if (!IsActive)
return;
var isOnWater = _body.CurrentFieldState.HasFlag(MapStates.FieldStates.Water) && WaterOutline ||
_body.CurrentFieldState.HasFlag(MapStates.FieldStates.DeepWater) && DeepWaterOutline;
// draw the water stuff
if (_body.IsActive && isOnWater && _body.IsGrounded && _body.Position.Z <= 0)
{
spriteBatch.Draw(Resources.SprObjects, new Vector2(
_body.Position.X + _body.OffsetX + _body.Width / 2f - 6,
_body.Position.Y - _body.Position.Z + _body.OffsetY + _body.Height - 6 + WaterOutlineOffsetY),
new Rectangle(_sourceWater.X, _sourceWater.Y + (Game1.TotalGameTime % 133 > 66 ? 9 : 0), _sourceWater.Width, _sourceWater.Height / 2), Color.White);
}
_draw(spriteBatch);
// draw water effect
if (_body.IsActive && isOnWater && _body.IsGrounded && _body.Position.Z <= 0)
{
spriteBatch.Draw(Resources.SprObjects, new Vector2(
_body.Position.X + _body.OffsetX + _body.Width / 2f - 6,
_body.Position.Y - _body.Position.Z + _body.OffsetY + _body.Height - 2 + WaterOutlineOffsetY),
new Rectangle(_sourceWater.X, _sourceWater.Y + _sourceWater.Height / 2 + (Game1.TotalGameTime % 133 > 66 ? 9 : 0), _sourceWater.Width, _sourceWater.Height / 2), Color.White);
}
// draw grass if the body is standing on grass
if (_body.IsActive && Gras && _body.CurrentFieldState.HasFlag(MapStates.FieldStates.Grass) && _body.Position.Z < 4)
{
var flip = (_body.Position.X + _body.Position.Y) % 8 > 4;
spriteBatch.Draw(Resources.SprObjects, new Vector2(
_body.Position.X + _body.OffsetX + _body.Width / 2f - 8,
_body.Position.Y + _body.OffsetY + _body.Height - 8), _sourceGrass, Color.White,
0, Vector2.Zero, Vector2.One, !flip ? SpriteEffects.FlipHorizontally : SpriteEffects.None, 0);
spriteBatch.Draw(Resources.SprObjects, new Vector2(
_body.Position.X + _body.OffsetX + _body.Width / 2f,
_body.Position.Y + _body.OffsetY + _body.Height - 8), _sourceGrass, Color.White,
0, Vector2.Zero, Vector2.One, flip ? SpriteEffects.FlipHorizontally : SpriteEffects.None, 0);
}
}
}
}