LADXHD/InGame/GameObjects/NPCs/ObjLetterBoy.cs

79 lines
2.9 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using Microsoft.Xna.Framework;
using ProjectZ.Base;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.NPCs
{
class ObjLetterBoy : GameObject
{
private readonly Animator _animator;
private readonly string _dialogId;
private float _lookCounter;
private bool _look;
public ObjLetterBoy() : base("letter_boy") { }
public ObjLetterBoy(Map.Map map, int posX, int posY, string dialogId) : base(map)
{
EntityPosition = new CPosition(posX + 8, posY + 16, 0);
EntitySize = new Rectangle(-12, -24, 24, 40);
_dialogId = dialogId;
_animator = AnimatorSaveLoad.LoadAnimator("NPCs/npc_letter_boy");
_animator.Play("idle");
var sprite = new CSprite(EntityPosition);
var animationComponent = new AnimationComponent(_animator, sprite, Vector2.Zero);
var body = new BodyComponent(EntityPosition, -8, -13, 16, 12, 8);
AddComponent(BodyComponent.Index, body);
AddComponent(CollisionComponent.Index, new BodyCollisionComponent(body, Values.CollisionTypes.Normal | Values.CollisionTypes.PushIgnore));
AddComponent(InteractComponent.Index, new InteractComponent(new CBox(EntityPosition, -7, -10, 14, 24, 8), Interact));
AddComponent(BaseAnimationComponent.Index, animationComponent);
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(DrawComponent.Index, new BodyDrawComponent(body, sprite, Values.LayerPlayer));
AddComponent(DrawShadowComponent.Index, new BodyDrawShadowComponent(body, sprite));
}
private void Update()
{
// look at the player
var box = new RectangleF(EntityPosition.X - 14, EntityPosition.Y - 8, 28, 16);
if (MapManager.ObjLink.BodyRectangle.Intersects(box))
{
if (!_look)
{
_lookCounter = 250;
_look = true;
var _direction = EntityPosition.X < MapManager.ObjLink.PosX ? 1 : -1;
_animator.Play("look_" + _direction);
}
}
else if (_look)
{
if (_lookCounter > 0)
{
_lookCounter -= Game1.DeltaTime;
}
else
{
_look = false;
_animator.Play("idle");
}
}
}
private bool Interact()
{
Game1.GameManager.StartDialogPath(_dialogId);
return true;
}
}
}