153 lines
5.0 KiB
C#
153 lines
5.0 KiB
C#
using System;
|
|
using ActiveProtect.SimulationEnvironment;
|
|
|
|
namespace ActiveProtect.Models
|
|
{
|
|
/// <summary>
|
|
/// 红外测角仪类
|
|
/// </summary>
|
|
public class InfraredTracker : SimulationElement
|
|
{
|
|
/// <summary>
|
|
/// 当前跟踪的导弹ID
|
|
/// </summary>
|
|
public string? TrackedMissileId { get; private set; }
|
|
|
|
/// <summary>
|
|
/// 目标ID
|
|
/// </summary>
|
|
public string? TargetId { get; private set; }
|
|
|
|
|
|
private readonly InfraredTrackerConfig config;
|
|
|
|
/// <summary>
|
|
/// 构造函数
|
|
/// </summary>
|
|
public InfraredTracker(string id, string targetId, InfraredTrackerConfig config, ISimulationManager manager)
|
|
: base(id, config.InitialPosition, config.InitialOrientation, 0, manager)
|
|
{
|
|
TargetId = targetId;
|
|
this.config = config;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新红外测角仪状态
|
|
/// </summary>
|
|
public override void Update(double deltaTime)
|
|
{
|
|
if (!IsActive) return;
|
|
|
|
UpdateTracking();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新跟踪状态
|
|
/// </summary>
|
|
private void UpdateTracking()
|
|
{
|
|
if (TrackedMissileId == null || TargetId == null) return;
|
|
|
|
var target = SimulationManager.GetEntityById(TargetId);
|
|
|
|
if (SimulationManager.GetEntityById(TrackedMissileId) is not InfraredCommandGuidedMissile missile || target == null) return;
|
|
|
|
// 计算导弹到测角仪的距离
|
|
double distanceToMissile = Vector3D.Distance(Position, missile.Position);
|
|
|
|
// 检查导弹是否在跟踪范围内
|
|
if (distanceToMissile <= config.MaxTrackingRange)
|
|
{
|
|
// 计算测角仪到导弹的向量
|
|
Vector3D trackerToMissile = missile.Position - Position;
|
|
|
|
// 计算测角仪到目标的向量
|
|
Vector3D trackerToTarget = target.Position - Position;
|
|
|
|
// 发送制导指令事件
|
|
PublishGuidanceCommandEvent(missile.Id, trackerToMissile, trackerToTarget, Id);
|
|
}
|
|
else
|
|
{
|
|
// 导弹超出跟踪范围,停止跟踪
|
|
StopTracking();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 停止跟踪
|
|
/// </summary>
|
|
public void StopTracking()
|
|
{
|
|
TrackedMissileId = null;
|
|
TargetId = null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 发布制导指令事件
|
|
/// </summary>
|
|
private void PublishGuidanceCommandEvent(string missileId, Vector3D trackerToMissileVector, Vector3D trackerToTargetVector, string senderId)
|
|
{
|
|
var evt = new InfraredGuidanceCommandEvent
|
|
{
|
|
TargetMissileId = missileId,
|
|
TrackerToMissileVector = trackerToMissileVector,
|
|
TrackerToTargetVector = trackerToTargetVector,
|
|
SenderId = senderId
|
|
};
|
|
SimulationManager.PublishEvent(evt);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理红外指令制导导弹点亮红外热源事件
|
|
/// </summary>
|
|
private void OnInfraredGuidanceMissileLight(InfraredGuidanceMissileLightEvent evt)
|
|
{
|
|
// 处理导弹点亮红外热源事件
|
|
TrackedMissileId ??= evt.SenderId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理红外指令制导导弹熄灭红外热源事件
|
|
/// </summary>
|
|
private void OnInfraredGuidanceMissileLightOff(InfraredGuidanceMissileLightOffEvent evt)
|
|
{
|
|
// 处理导弹熄灭红外热源事件
|
|
if (evt.SenderId == TrackedMissileId) StopTracking();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 激活红外测角仪
|
|
/// </summary>
|
|
public override void Activate()
|
|
{
|
|
base.Activate();
|
|
SimulationManager.SubscribeToEvent<InfraredGuidanceMissileLightEvent>(OnInfraredGuidanceMissileLight);
|
|
SimulationManager.SubscribeToEvent<InfraredGuidanceMissileLightOffEvent>(OnInfraredGuidanceMissileLightOff);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 销毁红外测角仪
|
|
/// </summary>
|
|
public override void Deactivate()
|
|
{
|
|
base.Deactivate();
|
|
SimulationManager.UnsubscribeFromEvent<InfraredGuidanceMissileLightEvent>(OnInfraredGuidanceMissileLight);
|
|
SimulationManager.UnsubscribeFromEvent<InfraredGuidanceMissileLightOffEvent>(OnInfraredGuidanceMissileLightOff);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取红外测角仪状态
|
|
/// </summary>
|
|
public override string GetStatus()
|
|
{
|
|
return $"红外测角仪 {Id}:\n" +
|
|
$" 位置: {Position}\n" +
|
|
$" 跟踪导弹: {TrackedMissileId ?? "无"}\n" +
|
|
$" 目标: {TargetId ?? "无"}\n" +
|
|
$" 状态: {(IsActive ? "活动" : "已销毁")}\n";
|
|
}
|
|
|
|
}
|
|
}
|