using System; using System.Collections.Generic; using ActiveProtect.SimulationEnvironment; namespace ActiveProtect.Models { public class TerminalSensitiveMissile : MissileBase { // 分离高度 1000米,默认 1000 米 private const double SeparationHeight = 1000; // 分离点距离目标水平距离,默认 1000 米 private const double SeparationDistance = 1000; // 分离时距离分离点的距离阈值,默认 50米 private const double SeparationRange = 50; // 分离时距目标距离阈值,默认 1400 米 private const double SeparationTargetDistance = 1400; // 子弹数量, 155 口径母弹,默认 2 个 private const int SubmunitionCount = 1; // 子弹数组 private TerminalSensitiveSubmunition[] submunitions; // 分离点位置 private Vector3D separationPoint; public MissileConfig missileConfig { get; set; } public TerminalSensitiveMissile(string id, MissileConfig missileConfig, ISimulationManager simulationManager) : base(id, missileConfig, simulationManager) { submunitions = new TerminalSensitiveSubmunition[SubmunitionCount]; this.missileConfig = missileConfig; //计算分离点坐标,高度为SeparationHeight,距离目标的距离为SeparationDistance separationPoint = Vector3D.PointOnLine(SimulationManager.GetEntityById(TargetId).Position, Position, SeparationDistance) + new Vector3D(0, SeparationHeight, 0); } public override void Update(double deltaTime) { base.Update(deltaTime); GuidanceAcceleration = new Vector3D(0, -9.8, 0); Console.WriteLine($"分离点距离: {(separationPoint - Position).Magnitude()}"); //计算到目标的距离 double distanceToTarget = (SimulationManager.GetEntityById(TargetId).Position - Position).Magnitude(); //距离分离点距离小于50米,或者距离目标小于1400米,则分离 if ((separationPoint - Position).Magnitude() <= SeparationRange || distanceToTarget <= SeparationTargetDistance) { Console.WriteLine("分离"); PerformSeparation(); } } // 分离动作,母弹抛出 2 个子弹,子弹朝向目标方向 // 初始化子弹,设置子弹参数 // 母弹完成任务,可以被移除 private void PerformSeparation() { // 获取目标位置 Vector3D targetPosition = SimulationManager.GetEntityById(TargetId).Position; // 创建并释放子弹 for (int i = 0; i < SubmunitionCount; i++) { // 计算子弹朝向目标的方向 Vector3D directionToTarget = (targetPosition - this.Position).Normalize(); Orientation orientationToTarget = Orientation.FromVector(directionToTarget); submunitions[i] = new TerminalSensitiveSubmunition($"{Id}_Sub_{i}", new MissileConfig { InitialPosition = this.Position, InitialOrientation = orientationToTarget, // 设置为朝向目标的方向 InitialSpeed = 200, // 子弹初始速度 MaxSpeed = 2000, TargetIndex = 0, MaxFlightTime = 50, MaxFlightDistance = 1000, MaxAcceleration = 50, ProportionalNavigationCoefficient = 0.1, Mass = 10 }, SimulationManager); SimulationManager.AddElement(submunitions[i]); submunitions[i].Activate(); } // 母弹完成任务,可以被移除 IsActive = false; } public override string GetStatus() { return $"{base.GetStatus()}\n母弹, 分离点: {separationPoint}"; } } }