104 lines
3.7 KiB
C#
104 lines
3.7 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using ActiveProtect.SimulationEnvironment;
|
||
|
||
namespace ActiveProtect.Models
|
||
{
|
||
public class TerminalSensitiveMissile : MissileBase
|
||
{
|
||
private TerminalSensitiveSubmunition[] submunitions;
|
||
|
||
private Vector3D guidanceCommand;
|
||
|
||
// 分离高度 1000米
|
||
private const double SeparationHeight = 1000;
|
||
|
||
// 分离点距离目标水平距离
|
||
private const double SeparationDistance = 1000;
|
||
|
||
private Vector3D separationPoint;
|
||
// 子弹数量
|
||
private const int SubmunitionCount = 2;
|
||
|
||
public TerminalSensitiveMissile(string id, MissileConfig missileConfig, ISimulationManager simulationManager)
|
||
: base(id, missileConfig, simulationManager)
|
||
{
|
||
submunitions = new TerminalSensitiveSubmunition[SubmunitionCount];
|
||
guidanceCommand = Vector3D.Zero;
|
||
|
||
//计算分离点坐标,高度为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);
|
||
// 无动力抛物线飞行
|
||
ApplyGravity(deltaTime);
|
||
|
||
Console.WriteLine($"分离点距离: {(separationPoint - Position).Magnitude()}");
|
||
|
||
//计算到目标的距离
|
||
double distanceToTarget = (SimulationManager.GetEntityById(TargetId).Position - Position).Magnitude();
|
||
|
||
//距离分离点距离小于50米,或者距离目标小于1400米,则分离
|
||
if ((separationPoint - Position).Magnitude() <= 50 || distanceToTarget <= 1400)
|
||
{
|
||
Console.WriteLine("分离");
|
||
PerformSeparation();
|
||
}
|
||
}
|
||
|
||
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 = 300,
|
||
TargetIndex = 0,
|
||
MaxFlightTime = 10,
|
||
MaxFlightDistance = 1000,
|
||
MaxAcceleration = 50,
|
||
ProportionalNavigationCoefficient = 0.1,
|
||
Mass = 10
|
||
},
|
||
SimulationManager);
|
||
|
||
SimulationManager.AddElement(submunitions[i]);
|
||
}
|
||
|
||
// 母弹完成任务,可以被移除
|
||
IsActive = false;
|
||
}
|
||
|
||
private void ApplyGravity(double deltaTime)
|
||
{
|
||
Velocity += new Vector3D(0, -9.8, 0) * deltaTime;
|
||
}
|
||
|
||
public override string GetStatus()
|
||
{
|
||
return $"{base.GetStatus()}\nMother Missile Stage: {currentStage}, Separation Point: {separationPoint}";
|
||
}
|
||
|
||
protected override Vector3D GetGuidanceCommand()
|
||
{
|
||
return guidanceCommand;
|
||
}
|
||
|
||
}
|
||
}
|