mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
112 lines
3.9 KiB
C#
112 lines
3.9 KiB
C#
|
using System;
|
||
|
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.GameObjects.Base.Components.AI;
|
||
|
using ProjectZ.InGame.Things;
|
||
|
|
||
|
namespace ProjectZ.InGame.GameObjects.Things
|
||
|
{
|
||
|
internal class ObjLeaf : GameObject
|
||
|
{
|
||
|
private readonly AiComponent _aiComponent;
|
||
|
private readonly CSprite _sprite;
|
||
|
private readonly DrawShadowSpriteComponent _shadowSprite;
|
||
|
|
||
|
private Vector2 _velocity;
|
||
|
|
||
|
private double _objTimer;
|
||
|
|
||
|
private readonly float _direction;
|
||
|
private readonly float _fallSpeed = 0.075f;
|
||
|
|
||
|
private readonly int _despawnTime = 250;
|
||
|
|
||
|
public ObjLeaf(Map.Map map, int posX, int posY, float posZ, Vector2 velocity) : base(map)
|
||
|
{
|
||
|
_velocity = velocity;
|
||
|
|
||
|
_objTimer = (int)(Game1.RandomNumber.Next(0, 250) * velocity.X);
|
||
|
_direction = velocity.X / 2f;
|
||
|
|
||
|
EntityPosition = new CPosition(posX, posY, posZ);
|
||
|
EntitySize = new Rectangle(-2, -9, 12, 10);
|
||
|
|
||
|
_aiComponent = new AiComponent();
|
||
|
|
||
|
var stateFalling = new AiState(StateFalling);
|
||
|
|
||
|
var stateLieing = new AiState(StateLie);
|
||
|
stateLieing.Trigger.Add(new AiTriggerRandomTime(() => _aiComponent.ChangeState("fading"), 250, 750));
|
||
|
|
||
|
var stateDespawning = new AiState(StateFading);
|
||
|
stateDespawning.Trigger.Add(new AiTriggerCountdown(_despawnTime, FadeTick, FadeEnd));
|
||
|
|
||
|
_aiComponent.States.Add("falling", stateFalling);
|
||
|
_aiComponent.States.Add("lie", stateLieing);
|
||
|
_aiComponent.States.Add("fading", stateDespawning);
|
||
|
|
||
|
_aiComponent.ChangeState("falling");
|
||
|
|
||
|
|
||
|
_shadowSprite = new DrawShadowSpriteComponent(Resources.SprShadow,
|
||
|
EntityPosition, new Rectangle(0, 0, 65, 66), new Vector2(-1, -3), 1.0f, 0.0f);
|
||
|
_shadowSprite.Width = 10;
|
||
|
_shadowSprite.Height = 4;
|
||
|
|
||
|
var sourceRectangle = Resources.SourceRectangle("leaf");
|
||
|
_sprite = new CSprite(Resources.SprObjects, EntityPosition, sourceRectangle, new Vector2(0, -6));
|
||
|
_sprite.Color = Color.White * 0.8f;
|
||
|
|
||
|
AddComponent(AiComponent.Index, _aiComponent);
|
||
|
AddComponent(DrawComponent.Index, new DrawCSpriteComponent(_sprite, Values.LayerPlayer));
|
||
|
AddComponent(DrawShadowComponent.Index, _shadowSprite);
|
||
|
}
|
||
|
|
||
|
public void StateFalling()
|
||
|
{
|
||
|
_objTimer += Game1.DeltaTime;
|
||
|
|
||
|
// fall down
|
||
|
EntityPosition.Z -= Game1.TimeMultiplier * _fallSpeed;
|
||
|
|
||
|
// fall state
|
||
|
_sprite.DrawOffset.X = (float)Math.Sin(_objTimer / 150f * _direction) * 3;
|
||
|
_shadowSprite.DrawOffset.X = _sprite.DrawOffset.X - 1;
|
||
|
EntityPosition.Move(_velocity);
|
||
|
|
||
|
// flip the leaf depending on the direction it is moving
|
||
|
if (Math.Cos(_objTimer / 150f) + _velocity.X < 0)
|
||
|
_sprite.SpriteEffect = SpriteEffects.None;
|
||
|
else
|
||
|
_sprite.SpriteEffect = SpriteEffects.FlipHorizontally;
|
||
|
|
||
|
_velocity *= (float)Math.Pow(0.85, Game1.TimeMultiplier);
|
||
|
|
||
|
if (EntityPosition.Z <= 0)
|
||
|
{
|
||
|
EntityPosition.Z = 0;
|
||
|
_aiComponent.ChangeState("lie");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void StateLie() { }
|
||
|
|
||
|
public void StateFading() { }
|
||
|
|
||
|
// fade away
|
||
|
public void FadeTick(double currentState)
|
||
|
{
|
||
|
_sprite.Color = Color.White * (float)(currentState / _despawnTime) * 0.9f;
|
||
|
_shadowSprite.Color = _sprite.Color;
|
||
|
}
|
||
|
|
||
|
// remove the leaf
|
||
|
public void FadeEnd()
|
||
|
{
|
||
|
Map.Objects.DeleteObjects.Add(this);
|
||
|
}
|
||
|
}
|
||
|
}
|