107 lines
4.2 KiB
C#
107 lines
4.2 KiB
C#
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 readonly Vector3D separationPoint;
|
||
|
||
public TerminalSensitiveMissile(MissileConfig config, ISimulationManager manager)
|
||
: base(config, manager)
|
||
{
|
||
submunitions = new TerminalSensitiveSubmunition[SubmunitionCount];
|
||
|
||
//计算分离点坐标,高度为SeparationHeight,距离目标的距离为SeparationDistance
|
||
separationPoint = Vector3D.PointOnLine(base.SimulationManager.GetEntityById(TargetId).Position, base.Position, SeparationDistance) + new Vector3D(0, SeparationHeight, 0);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新导弹
|
||
/// </summary>
|
||
/// <param name="deltaTime">时间步长</param>
|
||
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(
|
||
new MissileConfig
|
||
{
|
||
Id = $"{Id}_Sub_{i}",
|
||
InitialPosition = this.Position,
|
||
InitialOrientation = orientationToTarget, // 设置为朝向目标的方向
|
||
InitialSpeed = 200, // 子弹初始速度
|
||
MaxSpeed = 2000,
|
||
TargetIndex = 0,
|
||
MaxFlightTime = 50,
|
||
MaxFlightDistance = 1000,
|
||
MaxAcceleration = 50,
|
||
ProportionalNavigationCoefficient = 3,
|
||
Mass = 10,
|
||
ExplosionRadius = 10
|
||
},
|
||
SimulationManager);
|
||
|
||
SimulationManager.AddElement(submunitions[i]);
|
||
submunitions[i].Activate();
|
||
}
|
||
|
||
// 母弹完成任务,可以被移除
|
||
IsActive = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取导弹状态
|
||
/// </summary>
|
||
/// <returns>导弹状态</returns>
|
||
public override string GetStatus()
|
||
{
|
||
return $"{base.GetStatus()}\n母弹, 分离点: {separationPoint}";
|
||
}
|
||
|
||
}
|
||
} |