150 lines
5.9 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|