using System; using ActiveProtect.Simulation; using ActiveProtect.Utility; namespace ActiveProtect.Models { /// /// 告警设备基类 /// public abstract class WarnerBase : SimulationElement, IWarner { /// /// 是否处于告警状态 /// public bool IsWarning { get; protected set; } /// /// 告警持续时间(秒) /// protected double WarningDuration { get; set; } /// /// 当前告警时间(秒) /// protected double CurrentWarningTime { get; set; } /// /// 所属坦克ID /// protected string TankId { get; set; } protected WarnerBase(string id, Vector3D position, Orientation orientation, ISimulationManager manager, string tankId, double warningDuration) : base(id, position, orientation, 0, manager) { TankId = tankId; WarningDuration = warningDuration; CurrentWarningTime = 0; IsWarning = false; } public virtual void StartWarning() { if (!IsWarning) { IsWarning = true; CurrentWarningTime = 0; Console.WriteLine($"告警器 {Id} 开始告警"); } } public virtual void StopWarning() { if (IsWarning) { IsWarning = false; CurrentWarningTime = 0; Console.WriteLine($"告警器 {Id} 停止告警"); } } public abstract string GetWarningStatus(); public override void Update(double deltaTime) { if (!IsActive) return; if (IsWarning) { CurrentWarningTime += deltaTime; if (CurrentWarningTime >= WarningDuration) { StopWarning(); } } // 更新位置(跟随坦克) if (SimulationManager.GetEntityById(TankId) is Tank tank) { Position = tank.Position; Orientation = tank.Orientation; } } public override void Activate() { base.Activate(); Console.WriteLine($"告警器 {Id} 已激活"); } public override void Deactivate() { StopWarning(); base.Deactivate(); Console.WriteLine($"告警器 {Id} 已停用"); } } }