LADXHD/InGame/GameObjects/MidBoss/MBossBallAndChain.cs

78 lines
2.9 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.MidBoss
{
internal class MBossBallAndChain : GameObject
{
private readonly MBossBallAndChainSoldier _owner;
private readonly CSprite _sprite;
private Rectangle _sourceRectangleLink = new Rectangle(179, 181, 4, 4);
private bool _isActive;
public MBossBallAndChain(Map.Map map, MBossBallAndChainSoldier owner) : base(map)
{
EntityPosition = new CPosition(owner.EntityPosition.X - 5, owner.EntityPosition.Y - 8 + 2, 0);
EntitySize = new Rectangle(-8, -16, 16, 16);
_owner = owner;
_sprite = new CSprite(Resources.SprMidBoss, EntityPosition, new Rectangle(184, 175, 16, 16), new Vector2(-8, -16));
var damageCollider = new CBox(EntityPosition, -6, -8 - 6, 0, 12, 12, 8);
AddComponent(DamageFieldComponent.Index, new DamageFieldComponent(damageCollider, HitType.Enemy, 4));
AddComponent(HittableComponent.Index, new HittableComponent(damageCollider, OnHit));
AddComponent(PushableComponent.Index, new PushableComponent(damageCollider, OnPush));
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerBottom, EntityPosition));
}
public void Activate()
{
_isActive = true;
}
public void Deactivate()
{
_isActive = false;
}
private Values.HitCollision OnHit(GameObject gameObject, Vector2 direction, HitType damageType, int damage, bool pieceOfPower)
{
if (!_isActive)
return Values.HitCollision.None;
_owner.BlockBall();
return Values.HitCollision.RepellingParticle;
}
private bool OnPush(Vector2 direction, PushableComponent.PushType type)
{
if (!_isActive)
return false;
if (type == PushableComponent.PushType.Impact)
_owner.BlockBall();
return true;
}
private void Draw(SpriteBatch spriteBatch)
{
var handPosition = new Vector2(_owner.EntityPosition.X - 5, _owner.EntityPosition.Y - 15);
var direction = new Vector2(EntityPosition.X, EntityPosition.Y - 8) - handPosition;
// draw the chain
for (var i = 0; i < 3; i++)
{
var linkPosition = handPosition + direction * ((i + 1) / 4.0f) - new Vector2(2, 2);
spriteBatch.Draw(Resources.SprMidBoss, linkPosition, _sourceRectangleLink, Color.White);
}
_sprite.Draw(spriteBatch);
}
}
}