208 lines
6.6 KiB
C#
208 lines
6.6 KiB
C#
using System;
|
||
using ActiveProtect.Simulation;
|
||
using ActiveProtect.Utility;
|
||
|
||
namespace ActiveProtect.Models
|
||
{
|
||
/// <summary>
|
||
/// 干扰设备基类
|
||
/// 实现了干扰设备的基本功能和属性,为具体的干扰器类型提供通用实现
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 该基类提供了:
|
||
/// - 干扰状态管理
|
||
/// - 干扰功率控制
|
||
/// - 冷却时间管理
|
||
/// - 位置跟随功能
|
||
/// 继承自SimulationElement以支持仿真功能,实现IJammer接口
|
||
/// </remarks>
|
||
public abstract class JammerBase : SimulationElement, IJammer
|
||
{
|
||
/// <summary>
|
||
/// 获取或设置一个值,该值指示干扰器是否正在工作
|
||
/// </summary>
|
||
/// <value>
|
||
/// true表示正在干扰;false表示未在干扰
|
||
/// </value>
|
||
public bool IsJamming { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 获取或设置当前干扰功率值
|
||
/// </summary>
|
||
/// <value>
|
||
/// 当前干扰功率,单位:瓦特(W)
|
||
/// </value>
|
||
public double CurrentJammingPower { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 获取或设置最大干扰功率
|
||
/// </summary>
|
||
/// <value>
|
||
/// 干扰器能够输出的最大功率,单位:瓦特(W)
|
||
/// </value>
|
||
protected double MaxJammingPower { get; set; }
|
||
|
||
/// <summary>
|
||
/// 获取或设置功率增长率
|
||
/// </summary>
|
||
/// <value>
|
||
/// 干扰功率的增长速率,单位:瓦特/秒(W/s)
|
||
/// </value>
|
||
protected double PowerIncreaseRate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 获取或设置最大冷却时间
|
||
/// </summary>
|
||
/// <value>
|
||
/// 干扰器停止后需要的最大冷却时间,单位:秒(s)
|
||
/// </value>
|
||
protected double MaxCooldownTime { get; set; }
|
||
|
||
/// <summary>
|
||
/// 获取或设置当前冷却时间
|
||
/// </summary>
|
||
/// <value>
|
||
/// 当前剩余的冷却时间,单位:秒(s)
|
||
/// </value>
|
||
protected double CurrentCooldownTime { get; set; }
|
||
|
||
/// <summary>
|
||
/// 获取或设置所属坦克的唯一标识符
|
||
/// </summary>
|
||
/// <value>
|
||
/// 坦克的ID字符串
|
||
/// </value>
|
||
protected string TankId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 初始化干扰器基类的新实例
|
||
/// </summary>
|
||
/// <param name="id">干扰器的唯一标识符</param>
|
||
/// <param name="position">初始位置</param>
|
||
/// <param name="orientation">初始朝向</param>
|
||
/// <param name="manager">仿真管理器实例</param>
|
||
/// <param name="tankId">所属坦克ID</param>
|
||
/// <param name="maxJammingPower">最大干扰功率</param>
|
||
/// <param name="initialJammingPower">初始干扰功率</param>
|
||
/// <param name="powerIncreaseRate">功率增长率</param>
|
||
/// <param name="maxCooldownTime">最大冷却时间</param>
|
||
protected JammerBase(string id, Vector3D position, Orientation orientation,
|
||
ISimulationManager manager, string tankId, double maxJammingPower,
|
||
double initialJammingPower, double powerIncreaseRate, double maxCooldownTime)
|
||
: base(id, position, orientation, 0, manager)
|
||
{
|
||
TankId = tankId;
|
||
MaxJammingPower = maxJammingPower;
|
||
CurrentJammingPower = initialJammingPower;
|
||
PowerIncreaseRate = powerIncreaseRate;
|
||
MaxCooldownTime = maxCooldownTime;
|
||
CurrentCooldownTime = 0;
|
||
IsJamming = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 启动干扰器
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 仅在冷却完成且当前未处于干扰状态时才能启动
|
||
/// </remarks>
|
||
public virtual void StartJamming()
|
||
{
|
||
if (CurrentCooldownTime <= 0 && !IsJamming)
|
||
{
|
||
IsJamming = true;
|
||
Console.WriteLine($"干扰器 {Id} 开始干扰");
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 停止干扰器
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 停止时会重置干扰功率并进入冷却状态
|
||
/// </remarks>
|
||
public virtual void StopJamming()
|
||
{
|
||
if (IsJamming)
|
||
{
|
||
IsJamming = false;
|
||
CurrentCooldownTime = MaxCooldownTime;
|
||
CurrentJammingPower = MaxJammingPower * 0.4; // 重置为最大功率的40%
|
||
Console.WriteLine($"干扰器 {Id} 停止干扰,进入冷却");
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取干扰器的状态信息
|
||
/// </summary>
|
||
/// <returns>描述干扰器当前状态的字符串</returns>
|
||
public abstract string GetJammingStatus();
|
||
|
||
/// <summary>
|
||
/// 更新干扰器的状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">距离上次更新的时间间隔(秒)</param>
|
||
/// <remarks>
|
||
/// 更新内容包括:
|
||
/// - 干扰功率
|
||
/// - 冷却时间
|
||
/// - 位置(跟随坦克)
|
||
/// </remarks>
|
||
public override void Update(double deltaTime)
|
||
{
|
||
if (!IsActive) return;
|
||
|
||
if (IsJamming)
|
||
{
|
||
UpdateJammingPower(deltaTime);
|
||
PublishJammingEvent();
|
||
}
|
||
else if (CurrentCooldownTime > 0)
|
||
{
|
||
CurrentCooldownTime = Math.Max(0, CurrentCooldownTime - deltaTime);
|
||
}
|
||
|
||
// 更新位置(跟随坦克)
|
||
if (SimulationManager.GetEntityById(TankId) is Tank tank)
|
||
{
|
||
Position = tank.Position;
|
||
Orientation = tank.Orientation;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 激活干扰器
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 激活时会自动开始干扰
|
||
/// </remarks>
|
||
public override void Activate()
|
||
{
|
||
base.Activate();
|
||
StartJamming();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 停用干扰器
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 停用时会自动停止干扰
|
||
/// </remarks>
|
||
public override void Deactivate()
|
||
{
|
||
StopJamming();
|
||
base.Deactivate();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新干扰功率
|
||
/// </summary>
|
||
/// <param name="deltaTime">时间间隔(秒)</param>
|
||
protected abstract void UpdateJammingPower(double deltaTime);
|
||
|
||
/// <summary>
|
||
/// 发布干扰事件
|
||
/// </summary>
|
||
protected abstract void PublishJammingEvent();
|
||
}
|
||
} |