...
나는 트리거 동작의 기본 클래스가 있고, 나는 트리거에서 상속 타이머 ...
//---------------------------------------------------------------------------------------------------------------------
public class TriggerArgs
{
public AstroObject obj;
}
//---------------------------------------------------------------------------------------------------------------------
public delegate void FireAction(AstroObject sender, TriggerArgs args);
//---------------------------------------------------------------------------------------------------------------------
public interface IFireable
{
void Fire(AstroObject sender, TriggerArgs args);
}
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
public abstract class Trigger : AstroObject
{
public Action Fired;
public List<FireAction> Actions;
protected abstract void CheckConditions(float Seconds);
protected bool IsFired;
public bool RearmOnFire = false;
//---------------------------------------------------------------------------------------------------------------------
protected override void LocalCreate(out int UpdateOrder)
{
UpdateOrder = Orders.Update.Trigger;
IsFired = false;
}
//---------------------------------------------------------------------------------------------------------------------
protected override void LocalDie() { }
//---------------------------------------------------------------------------------------------------------------------
public sealed override void Update(float Seconds)
{
CheckConditions(Seconds);
}
//---------------------------------------------------------------------------------------------------------------------
protected void Fire(TriggerArgs args)
{
if (IsFired) return;
foreach (FireAction f in Actions) f.Invoke(this, args);
if (Fired != null) Fired();
IsFired = !RearmOnFire;
}
//---------------------------------------------------------------------------------------------------------------------
public override void Render(Microsoft.Xna.Framework.Color color) { }
}
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
public class TimeTrigger : Trigger
{
public float Interval;
public float Elapsed;
//---------------------------------------------------------------------------------------------------------------------
protected override void LocalCreate(out int UpdateOrder)
{
base.LocalCreate(out UpdateOrder);
Elapsed = Interval;
}
//---------------------------------------------------------------------------------------------------------------------
public void Start() { Elapsed = Interval; IsFired = false; }
//---------------------------------------------------------------------------------------------------------------------
protected override void CheckConditions(float Seconds)
{
if (IsFired) return;
Elapsed -= Seconds;
if (Elapsed <= 0)
{
Elapsed = Interval;
Fire(null);
}
}
}
에 유용 할 수 있습니다 http://stackoverflow.com/questions/2795693/how-does-xna-timing-work –