LADXHD/InGame/GameObjects/Things/ObjNote.cs

64 lines
2.4 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Things;
using System;
namespace ProjectZ.InGame.GameObjects.Things
{
public class ObjNote : GameObject
{
private readonly CSprite _sprite;
private readonly Vector3 _startPosition;
private readonly Vector3 _endPosition;
private readonly Vector2 _moveDir;
private float _counter;
private const int LiveTime = 1000;
public ObjNote(Map.Map map, Vector2 position, int direction) : base(map)
{
EntityPosition = new CPosition(position.X, position.Y, 8);
EntitySize = new Rectangle(-4, -32, 8, 32);
_startPosition = new Vector3(EntityPosition.X, EntityPosition.Y, EntityPosition.Z);
_endPosition = _startPosition + new Vector3(15 * direction, 0, 17);
_moveDir = new Vector2(_endPosition.X, _endPosition.Y + _endPosition.Z) -
new Vector2(_startPosition.X, _startPosition.Y + _startPosition.Z);
_moveDir.Normalize();
_sprite = new CSprite("note", EntityPosition, Vector2.Zero);
_sprite.Color = Color.Transparent;
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(DrawComponent.Index, new DrawCSpriteComponent(_sprite, Values.LayerPlayer));
}
private void Update()
{
_counter += Game1.DeltaTime;
// fade in/out
var transparency = 1.0f;
if (_counter > LiveTime - 100)
transparency = (LiveTime - _counter) / 100f;
else if (_counter < 100)
transparency = _counter / 100;
_sprite.Color = Color.White * transparency;
// update the position
var percentage = _counter / LiveTime;
var newPosition = Vector3.Lerp(_startPosition, _endPosition, percentage);
EntityPosition.Set(newPosition);
// offset to the sides
_sprite.DrawOffset = new Vector2(-3, -12) + _moveDir * (float)MathF.Sin(_counter * 0.015f) * 1.25f;
// despawn
if (_counter > LiveTime)
Map.Objects.DeleteObjects.Add(this);
}
}
}