ActiveProtect/src/Models/Jammer/JammerBase.cs

208 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}