ActiveProtect/Models/LaserSemiActiveGuidedMissile.cs

150 lines
5.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;
// 订阅事件
simulationManager.SubscribeToEvent<LaserIlluminationEvent>(OnLaserIllumination);
simulationManager.SubscribeToEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
/// <summary>
/// 处理激光照射事件
/// </summary>
/// <param name="evt">激光照射事件</param>
private void OnLaserIllumination(LaserIlluminationEvent evt)
{
Console.WriteLine($"激光半主动导弹 {Id} 接收到激光照射事件, 目标ID: {evt.TargetId}");
if (evt.TargetId == TargetId)
{
LaserGuidanceSystem.SetTargetIllumination(true);
}
}
/// <summary>
/// 处理激光照射停止事件
/// </summary>
/// <param name="evt">激光照射停止事件</param>
private void OnLaserIlluminationStop(LaserIlluminationStopEvent evt)
{
Console.WriteLine($"激光半主动导弹 {Id} 接收到激光照射停止事件, 目标ID: {evt.TargetId}");
if (evt.TargetId == TargetId)
{
LaserGuidanceSystem.SetTargetIllumination(false);
}
}
/// <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<LaserIlluminationEvent>(OnLaserIllumination);
SimulationManager.SubscribeToEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
/// <summary>
/// 停用导弹
/// </summary>
public override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<LaserIlluminationEvent>(OnLaserIllumination);
SimulationManager.UnsubscribeFromEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
public override void Update(double deltaTime)
{
// base.Update(deltaTime);
// 获取目标和激光指示器的位置
Vector3D targetPosition = SimulationManager.GetEntityById(TargetId).Position;
Vector3D laserDesignatorPosition = SimulationManager.GetEntityById(LaserDesignatorId).Position;
// 更新制导系统
LaserGuidanceSystem.SetTargetPosition(targetPosition);
LaserGuidanceSystem.SetLaserDesignatorPosition(laserDesignatorPosition);
LaserGuidanceSystem.Update(deltaTime, Position, Velocity);
base.Update(deltaTime);
// Vector3D guidanceCommand = LaserGuidanceSystem.GetGuidanceCommand();
// // 应用重力
// Vector3D gravity = new Vector3D(0, -9.8, 0);
// // 计算总加速度
// Vector3D totalAcceleration = guidanceCommand + gravity;
// // 使用四阶龙格-库塔方法更新导弹的位置和速度
// (Position, Velocity) = BasicGuidanceSystem.RungeKutta4(deltaTime, Position, Velocity, totalAcceleration);
// // 限制速度不超过最大速度
// if (Velocity.Magnitude() > MaxSpeed)
// {
// Velocity = Velocity.Normalize() * MaxSpeed;
// }
// // 更新其他状态
// Speed = Velocity.Magnitude();
// Orientation = Orientation.FromVector(Velocity);
// FlightTime += deltaTime;
// FlightDistance += Speed * deltaTime;
// DistanceToTarget = Vector3D.Distance(Position, targetPosition);
// // 添加调试输出
// Console.WriteLine($"Missile Update: Position = {Position}, Velocity = {Velocity}, Acceleration = {totalAcceleration}, TargetPosition = {targetPosition}");
// currentStage.Update(deltaTime);
}
protected override Vector3D GetGuidanceCommand()
{
return LaserGuidanceSystem.GetGuidanceCommand();
}
}
}