ActiveProtect/Models/LaserSemiActiveGuidedMissile.cs

127 lines
4.9 KiB
C#

using ActiveProtect.SimulationEnvironment;
using System;
namespace ActiveProtect.Models
{
/// <summary>
/// 激光半主动制导导弹类,继承自基础导弹类
/// </summary>
public class LaserSemiActiveGuidedMissile : MissileBase
{
private LaserSemiActiveGuidanceSystem LaserGuidanceSystem;
private string LaserDesignatorId;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="id">导弹ID</param>
/// <param name="laserDesignatorId">激光指示器ID</param>
/// <param name="missileConfig">导弹配置</param>
/// <param name="simulationManager">仿真管理器</param>
public LaserSemiActiveGuidedMissile(string id, MissileConfig missileConfig, string laserDesignatorId, ISimulationManager simulationManager)
: base(id, missileConfig, simulationManager)
{
Vector3D initialTargetPosition = simulationManager.GetEntityById($"Tank_{missileConfig.TargetIndex + 1}").Position;
Vector3D initialTargetVelocity = simulationManager.GetEntityById($"Tank_{missileConfig.TargetIndex + 1}").Velocity;
LaserGuidanceSystem = new LaserSemiActiveGuidanceSystem(
missileConfig.ProportionalNavigationCoefficient,
missileConfig.InitialPosition,
initialTargetPosition,
initialTargetVelocity
);
LaserDesignatorId = laserDesignatorId;
}
/// <summary>
/// 处理激光照射事件
/// </summary>
/// <param name="evt">激光照射事件</param>
private void OnLaserIlluminationStart(LaserIlluminationStartEvent evt)
{
if (evt?.LaserDesignator != null && evt?.Target != null)
{
LaserGuidanceSystem.ActivateLaserDesignator(evt.LaserDesignator.Position, evt.Target.Position, evt.Target.Velocity,
evt.LaserDesignator.LaserPower, evt.LaserDesignator.LaserDivergenceAngle);
}
}
/// <summary>
/// 处理激光照射更新事件
/// </summary>
/// <param name="evt">激光照射更新事件</param>
private void OnLaserIlluminationUpdate(LaserIlluminationUpdateEvent evt)
{
if (evt?.LaserDesignator != null && evt?.Target != null)
{
LaserGuidanceSystem.UpdateLaserDesignator(evt.LaserDesignator.Position, evt.Target.Position, evt.Target.Velocity,
evt.LaserDesignator.LaserPower, evt.LaserDesignator.LaserDivergenceAngle);
}
}
/// <summary>
/// 处理激光照射停止事件
/// </summary>
/// <param name="evt">激光照射停止事件</param>
private void OnLaserIlluminationStop(LaserIlluminationStopEvent evt)
{
LaserGuidanceSystem.DeactivateLaserDesignator();
}
/// <summary>
/// 获取导弹状态信息
/// </summary>
/// <returns>状态信息字符串</returns>
public override string GetStatus()
{
string baseStatus = base.GetStatus().Replace("导弹", "激光半主动制导导弹");
string additionalStatus = $"\n 激光引导: {(LaserGuidanceSystem.HasGuidance ? "" : "")}";
return baseStatus + additionalStatus;
}
/// <summary>
/// 激活导弹
/// </summary>
public override void Activate()
{
base.Activate();
SimulationManager.SubscribeToEvent<LaserIlluminationStartEvent>(OnLaserIlluminationStart);
SimulationManager.SubscribeToEvent<LaserIlluminationUpdateEvent>(OnLaserIlluminationUpdate);
SimulationManager.SubscribeToEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
/// <summary>
/// 停用导弹
/// </summary>
public override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<LaserIlluminationStartEvent>(OnLaserIlluminationStart);
SimulationManager.UnsubscribeFromEvent<LaserIlluminationUpdateEvent>(OnLaserIlluminationUpdate);
SimulationManager.UnsubscribeFromEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
public override void Update(double deltaTime)
{
if (LaserGuidanceSystem.HasGuidance)
{
LaserGuidanceSystem.Update(deltaTime, Position, Velocity);
this.HasGuidance = true;
}
else
{
this.HasGuidance = false;
}
base.Update(deltaTime);
}
/// <summary>
/// 获取制导命令
/// </summary>
/// <returns>制导命令</returns>
protected override Vector3D GetGuidanceCommand()
{
return LaserGuidanceSystem.GetGuidanceCommand();
}
}
}