ActiveProtect/src/Models/Wanner/WarnerBase.cs

98 lines
2.6 KiB
C#

using System;
using ActiveProtect.Simulation;
using ActiveProtect.Utility;
namespace ActiveProtect.Models
{
/// <summary>
/// 告警设备基类
/// </summary>
public abstract class WarnerBase : SimulationElement, IWarner
{
/// <summary>
/// 是否处于告警状态
/// </summary>
public bool IsWarning { get; protected set; }
/// <summary>
/// 告警持续时间(秒)
/// </summary>
protected double WarningDuration { get; set; }
/// <summary>
/// 当前告警时间(秒)
/// </summary>
protected double CurrentWarningTime { get; set; }
/// <summary>
/// 所属坦克ID
/// </summary>
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} 已停用");
}
}
}