LADXHD/InGame/GameObjects/Dungeon/ObjDungeonOneWay.cs
2023-12-14 17:21:22 -05:00

96 lines
3.7 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Things;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.Things;
using ProjectZ.InGame.GameObjects.Bosses;
namespace ProjectZ.InGame.GameObjects.Dungeon
{
internal class ObjDungeonOneWay : GameObject
{
private readonly ObjAnimator _animatorTop;
private readonly ObjAnimator _animatorBottom;
private Vector2 _startPosition;
private Vector2 _endPosition;
private bool _isRotation;
public ObjDungeonOneWay() : base("dungeonOneWay") { }
public ObjDungeonOneWay(Map.Map map, int posX, int posY) : base(map)
{
EntityPosition = new CPosition(posX, posY, 0);
_animatorTop = new Things.ObjAnimator(map, posX, posY, Values.LayerBottom, "Objects/dOneWay", "idle2", false);
Map.Objects.SpawnObject(_animatorTop);
_animatorBottom = new Things.ObjAnimator(map, posX, posY + 16, Values.LayerBottom, "Objects/dOneWay", "idle", false);
Map.Objects.SpawnObject(_animatorBottom);
var pushBox = new CBox(posX + 6, posY + 16, 0, 4, 16, 16);
AddComponent(PushableComponent.Index, new PushableComponent(pushBox, OnPush) { InertiaTime = 50 });
var collisionBox = new CBox(posX, posY, 0, 16, 32, 16);
AddComponent(CollisionComponent.Index, new BoxCollisionComponent(collisionBox, Values.CollisionTypes.Normal));
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
}
private bool OnPush(Vector2 direction, PushableComponent.PushType type)
{
if (type != PushableComponent.PushType.Continues || MapManager.ObjLink.Direction != 1)
return false;
StartRotation();
return true;
}
private void Update()
{
if (!_isRotation)
return;
MapManager.ObjLink.CanWalk = false;
if (_animatorBottom.Animator.CurrentFrameIndex < 4)
{
var frameTime = _animatorBottom.Animator.GetAnimationTime(0, _animatorBottom.Animator.CurrentFrameIndex) +
_animatorBottom.Animator.FrameCounter;
var maxTime = _animatorBottom.Animator.GetAnimationTime(0, 4);
var state = (float)frameTime / maxTime;
var currentPosition = Vector2.Lerp(_startPosition, _endPosition, state);
MapManager.ObjLink.SetPosition(currentPosition);
}
if (_animatorBottom.Animator.CurrentFrameIndex >= 4)
{
_isRotation = false;
MapManager.ObjLink.SetPosition(_endPosition);
MapManager.ObjLink.IsVisible = true;
}
}
private void StartRotation()
{
// hide the player
MapManager.ObjLink.IsVisible = false;
Game1.GameManager.PlaySoundEffect("D360-12-0C");
_isRotation = true;
// the player will be moved between these two points while transitioning to the other side
_startPosition = new Vector2(MapManager.ObjLink.EntityPosition.X, MapManager.ObjLink.EntityPosition.Y);
_endPosition = new Vector2(
EntityPosition.X + 8,
EntityPosition.Y - MapManager.ObjLink._body.OffsetY - MapManager.ObjLink._body.Height);
_animatorTop.Animator.Play("rotate2");
_animatorBottom.Animator.Play("rotate");
}
}
}