mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
96 lines
3.7 KiB
C#
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");
|
|
}
|
|
}
|
|
} |