使用 Fire()设置导弹的初始阶段
This commit is contained in:
parent
ac690dad52
commit
2096062cbd
@ -10,15 +10,12 @@ namespace ThreatSource.Tests.Missile
|
||||
public class InfraredImagingTerminalGuidedMissileTests
|
||||
{
|
||||
private readonly SimulationManager _simulationManager;
|
||||
private readonly TestSimulationAdapter _testAdapter;
|
||||
private readonly InfraredImagingTerminalGuidedMissile _missile;
|
||||
private readonly MissileProperties _properties;
|
||||
|
||||
public InfraredImagingTerminalGuidedMissileTests()
|
||||
{
|
||||
_simulationManager = new SimulationManager();
|
||||
_testAdapter = new TestSimulationAdapter(_simulationManager);
|
||||
_simulationManager.SetSimulationAdapter(_testAdapter);
|
||||
|
||||
_properties = new MissileProperties
|
||||
{
|
||||
@ -55,44 +52,46 @@ namespace ThreatSource.Tests.Missile
|
||||
[Fact]
|
||||
public void Update_StageTransition_WorksCorrectly()
|
||||
{
|
||||
// Arrange
|
||||
var tank = new Tank("target1", new Vector3D(1000, 0, 0), 0, _simulationManager);
|
||||
// 1. 启动仿真系统
|
||||
_simulationManager.StartSimulation(0.1);
|
||||
|
||||
// 2. 发射前检查
|
||||
Assert.False(_missile.IsActive);
|
||||
|
||||
// 3. 发射导弹
|
||||
_missile.Fire();
|
||||
Assert.False(_missile.IsGuidance);
|
||||
|
||||
// 4. 检查实体状态
|
||||
var entity = _simulationManager.GetEntityById("missile1");
|
||||
Assert.NotNull(entity);
|
||||
Assert.IsType<InfraredImagingTerminalGuidedMissile>(entity);
|
||||
|
||||
// 5. 发射阶段 (0.1秒)
|
||||
_simulationManager.Update(0.1);
|
||||
Assert.False(_missile.IsGuidance);
|
||||
|
||||
// 6. 巡航阶段 (3秒)
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
_simulationManager.Update(0.1);
|
||||
Assert.False(_missile.IsGuidance);
|
||||
}
|
||||
|
||||
// 7. 末制导阶段
|
||||
var tank = new Tank("target1", new Vector3D(500, 0, 0), 0, _simulationManager);
|
||||
_simulationManager.RegisterEntity("target1", tank);
|
||||
tank.Activate();
|
||||
|
||||
_missile.Fire();
|
||||
_missile.Activate();
|
||||
|
||||
// Act & Assert
|
||||
// 发射阶段
|
||||
_missile.Update(0.01);
|
||||
var status = _missile.GetStatus();
|
||||
Assert.Contains("Launch", status);
|
||||
|
||||
// 巡航阶段
|
||||
for (double time = 0; time < 1.0; time += 0.1)
|
||||
{
|
||||
_missile.Update(0.1);
|
||||
}
|
||||
status = _missile.GetStatus();
|
||||
Assert.Contains("Cruise", status);
|
||||
|
||||
// 末制导阶段
|
||||
for (double time = 0; time < 3.0; time += 0.1)
|
||||
{
|
||||
tank.Update(0.1);
|
||||
_missile.Update(0.1);
|
||||
}
|
||||
status = _missile.GetStatus();
|
||||
Assert.Contains("Terminal", status);
|
||||
|
||||
_simulationManager.Update(0.1);
|
||||
Assert.True(_missile.IsGuidance);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Update_ExceedsMaxFlightTime_SelfDestructs()
|
||||
public void Update_ExceedsMaxFlightTime_Deactivates()
|
||||
{
|
||||
// Arrange
|
||||
_missile.Fire();
|
||||
_missile.Activate();
|
||||
var maxFlightTime = _properties.MaxFlightTime;
|
||||
|
||||
// Act
|
||||
@ -102,15 +101,15 @@ namespace ThreatSource.Tests.Missile
|
||||
}
|
||||
|
||||
// Assert
|
||||
Assert.False(_missile.IsActive, "超出最大飞行时间应该自毁");
|
||||
string status = _missile.GetStatus();
|
||||
Assert.Contains("状态: 非激活", status);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Update_ExceedsMaxFlightDistance_SelfDestructs()
|
||||
public void Update_ExceedsMaxFlightDistance_Deactivates()
|
||||
{
|
||||
// Arrange
|
||||
_missile.Fire();
|
||||
_missile.Activate();
|
||||
var maxDistance = _properties.MaxFlightDistance;
|
||||
var timeToExceedDistance = maxDistance / _properties.InitialSpeed + 1;
|
||||
|
||||
@ -121,34 +120,31 @@ namespace ThreatSource.Tests.Missile
|
||||
}
|
||||
|
||||
// Assert
|
||||
Assert.False(_missile.IsActive, "超出最大飞行距离应该自毁");
|
||||
string status = _missile.GetStatus();
|
||||
Assert.Contains("状态: 非激活", status);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetStatus_ReturnsCorrectStatus()
|
||||
{
|
||||
// Arrange
|
||||
_missile.Fire();
|
||||
|
||||
// Act
|
||||
string status = _missile.GetStatus();
|
||||
|
||||
// Assert
|
||||
var expectedParts = new[]
|
||||
{
|
||||
"导弹",
|
||||
_missile.Id,
|
||||
"位置",
|
||||
_missile.Position.ToString(),
|
||||
"速度",
|
||||
_missile.Speed.ToString(),
|
||||
"飞行时间",
|
||||
_missile.FlightTime.ToString(),
|
||||
"飞行距离",
|
||||
_missile.FlightDistance.ToString()
|
||||
};
|
||||
|
||||
foreach (var part in expectedParts)
|
||||
{
|
||||
Assert.Contains(part, status);
|
||||
}
|
||||
Assert.Contains($"导弹 {_missile.Id}", status);
|
||||
Assert.Contains("状态: 激活", status);
|
||||
Assert.Contains("位置:", status);
|
||||
Assert.Contains("速度:", status);
|
||||
Assert.Contains("速度分量:", status);
|
||||
Assert.Contains("朝向:", status);
|
||||
Assert.Contains("飞行时间:", status);
|
||||
Assert.Contains("飞行距离:", status);
|
||||
Assert.Contains("发动机工作时间:", status);
|
||||
Assert.Contains("有引导:", status);
|
||||
Assert.Contains("失去引导时间:", status);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@ -169,5 +165,33 @@ namespace ThreatSource.Tests.Missile
|
||||
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
|
||||
Assert.Equal(_missile.IsActive, state.IsActive);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Activate_DeactivateTest()
|
||||
{
|
||||
// Arrange & Act
|
||||
_missile.Activate();
|
||||
|
||||
// Assert
|
||||
Assert.True(_missile.IsActive);
|
||||
|
||||
// Act
|
||||
_missile.Deactivate();
|
||||
|
||||
// Assert
|
||||
Assert.False(_missile.IsActive);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Fire_InitializesCorrectly()
|
||||
{
|
||||
// Act
|
||||
_missile.Fire();
|
||||
|
||||
// Assert
|
||||
Assert.Equal(_properties.InitialSpeed, _missile.Speed);
|
||||
Assert.Equal(_properties.InitialPosition, _missile.Position);
|
||||
Assert.Equal(_properties.InitialOrientation, _missile.Orientation);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -15,6 +15,7 @@ namespace ThreatSource.Tests.Missile
|
||||
private readonly TestSimulationAdapter _testAdapter;
|
||||
private readonly TerminalSensitiveMissile _missile;
|
||||
private readonly MissileProperties _properties;
|
||||
private readonly MissileProperties _submunitionProperties;
|
||||
private readonly Tank _tank;
|
||||
|
||||
public TerminalSensitiveMissileTests(ITestOutputHelper output)
|
||||
@ -53,7 +54,21 @@ namespace ThreatSource.Tests.Missile
|
||||
Type = MissileType.TerminalSensitiveMissile
|
||||
};
|
||||
|
||||
_missile = new TerminalSensitiveMissile("tank1", _properties, _simulationManager);
|
||||
_submunitionProperties = new MissileProperties
|
||||
{
|
||||
MaxSpeed = 2000,
|
||||
MaxFlightTime = 60,
|
||||
MaxFlightDistance = 2000,
|
||||
MaxAcceleration = 300,
|
||||
ProportionalNavigationCoefficient = 4,
|
||||
Mass = 10,
|
||||
ExplosionRadius = 5,
|
||||
HitProbability = 0.9,
|
||||
SelfDestructHeight = 20,
|
||||
Type = MissileType.TerminalSensitiveSubmunition
|
||||
};
|
||||
|
||||
_missile = new TerminalSensitiveMissile("tank1", _properties, _submunitionProperties, 1, _simulationManager);
|
||||
_simulationManager.RegisterEntity("missile1", _missile);
|
||||
}
|
||||
|
||||
|
||||
@ -16,7 +16,7 @@ namespace ThreatSource.Indicator
|
||||
/// - 状态监控
|
||||
/// 通过激光照射目标实现半主动激光制导
|
||||
/// </remarks>
|
||||
public class LaserDesignator : SimulationElement
|
||||
public class LaserDesignator : SimulationElement, IIndicator
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置目标ID
|
||||
|
||||
@ -270,28 +270,11 @@ namespace ThreatSource.Missile
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 激活导弹
|
||||
/// - 开始计时和计数
|
||||
/// - 启动发动机
|
||||
/// - 初始化运动状态
|
||||
/// </remarks>
|
||||
public virtual void Fire()
|
||||
{
|
||||
OnFire();
|
||||
Activate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 激活导弹
|
||||
/// - 开始计时和计数
|
||||
/// - 启动发动机
|
||||
/// - 初始化运动状态
|
||||
/// </remarks>
|
||||
public virtual void OnFire()
|
||||
{
|
||||
// 子类可以重写此方法来处理发射时的特殊逻辑
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ namespace ThreatSource.Missile
|
||||
/// - 根据当前阶段更新状态
|
||||
/// - 调用基类的运动更新
|
||||
/// </remarks>
|
||||
protected override void UpdateMotionState(double deltaTime)
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
// 点亮红外热源
|
||||
LightInfraredSource();
|
||||
@ -122,7 +122,7 @@ namespace ThreatSource.Missile
|
||||
break;
|
||||
}
|
||||
|
||||
base.UpdateMotionState(deltaTime);
|
||||
base.Update(deltaTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -199,6 +199,20 @@ namespace ThreatSource.Missile
|
||||
SimulationManager.PublishEvent(new InfraredGuidanceMissileLightEvent { RadiationPower = this.RadiationPower, SenderId = this.Id });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// - 设置当前阶段为发射阶段
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = ICGM_Stage.Launch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 熄灭红外热源
|
||||
/// </summary>
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using ThreatSource.Simulation;
|
||||
using ThreatSource.Guidance;
|
||||
using ThreatSource.Utils;
|
||||
|
||||
namespace ThreatSource.Missile
|
||||
{
|
||||
@ -83,7 +84,6 @@ namespace ThreatSource.Missile
|
||||
public InfraredImagingTerminalGuidedMissile(MissileProperties config, ISimulationManager manager)
|
||||
: base(config, manager)
|
||||
{
|
||||
currentStage = IRTG_Stage.Launch;
|
||||
guidanceSystem = new InfraredImagingGuidanceSystem(
|
||||
config.Id + "_guidance",
|
||||
config.MaxAcceleration,
|
||||
@ -104,8 +104,6 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
base.Update(deltaTime);
|
||||
|
||||
switch (currentStage)
|
||||
{
|
||||
case IRTG_Stage.Launch:
|
||||
@ -118,6 +116,7 @@ namespace ThreatSource.Missile
|
||||
UpdateTerminalGuidanceStage(deltaTime);
|
||||
break;
|
||||
}
|
||||
base.Update(deltaTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -133,7 +132,8 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
private void UpdateLaunchStage(double deltaTime)
|
||||
{
|
||||
if (FlightTime > 1) // 假设发射阶段持续1秒
|
||||
GuidanceAcceleration = Vector3D.Zero;
|
||||
if (FlightTime > 0.1) // 假设发射阶段持续1秒
|
||||
{
|
||||
currentStage = IRTG_Stage.Cruise;
|
||||
}
|
||||
@ -152,7 +152,7 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
private void UpdateCruiseStage(double deltaTime)
|
||||
{
|
||||
if (FlightTime > 4) // 假设巡航阶段持续3秒
|
||||
if (FlightTime > 3) // 假设巡航阶段持续3秒
|
||||
{
|
||||
currentStage = IRTG_Stage.TerminalGuidance;
|
||||
}
|
||||
@ -176,6 +176,20 @@ namespace ThreatSource.Missile
|
||||
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// - 设置当前阶段为发射阶段
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = IRTG_Stage.Launch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 激活导弹
|
||||
/// </summary>
|
||||
|
||||
@ -72,7 +72,6 @@ namespace ThreatSource.Missile
|
||||
config.MaxAcceleration,
|
||||
config.ProportionalNavigationCoefficient,
|
||||
manager);
|
||||
currentStage = LBRM_Stage.Launch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -195,6 +194,20 @@ namespace ThreatSource.Missile
|
||||
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// - 设置当前阶段为发射阶段
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = LBRM_Stage.Launch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 激活导弹
|
||||
/// </summary>
|
||||
|
||||
@ -86,7 +86,19 @@ namespace ThreatSource.Missile
|
||||
|
||||
// 设置制导系统的ParentId属性
|
||||
guidanceSystem.ParentId = config.Id;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// - 设置当前阶段为发射阶段
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = LSAGM_Stage.Launch;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using ThreatSource.Simulation;
|
||||
using ThreatSource.Guidance;
|
||||
using ThreatSource.Utils;
|
||||
|
||||
namespace ThreatSource.Missile
|
||||
{
|
||||
@ -83,7 +84,6 @@ namespace ThreatSource.Missile
|
||||
public MillimeterWaveTerminalGuidedMissile(MissileProperties properties, ISimulationManager manager)
|
||||
: base(properties, manager)
|
||||
{
|
||||
currentStage = MWTG_Stage.Launch;
|
||||
guidanceSystem = new MillimeterWaveGuidanceSystem(
|
||||
properties.Id + "_guidance",
|
||||
properties.MaxAcceleration,
|
||||
@ -105,8 +105,6 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
base.Update(deltaTime);
|
||||
|
||||
switch (currentStage)
|
||||
{
|
||||
case MWTG_Stage.Launch:
|
||||
@ -119,6 +117,7 @@ namespace ThreatSource.Missile
|
||||
UpdateTerminalGuidanceStage(deltaTime);
|
||||
break;
|
||||
}
|
||||
base.Update(deltaTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -134,6 +133,7 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
private void UpdateLaunchStage(double deltaTime)
|
||||
{
|
||||
GuidanceAcceleration = Vector3D.Zero;
|
||||
if (FlightTime > 0.1)
|
||||
{
|
||||
currentStage = MWTG_Stage.Cruise;
|
||||
@ -177,6 +177,20 @@ namespace ThreatSource.Missile
|
||||
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// - 设置当前阶段为发射阶段
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = MWTG_Stage.Launch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 激活导弹
|
||||
/// </summary>
|
||||
|
||||
@ -64,6 +64,29 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
private const double SeparationRange = 50;
|
||||
|
||||
/// <summary>
|
||||
/// 末敏弹的飞行阶段
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 枚举定义了末敏弹的飞行阶段
|
||||
/// 包括发射阶段、巡航阶段和分离阶段
|
||||
/// </remarks>
|
||||
private enum TSGM_Stage
|
||||
{
|
||||
Launch, // 发射阶段
|
||||
Cruise, // 巡航阶段
|
||||
Separation // 分离阶段
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 导弹当前的飞行阶段
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于控制导弹的行为状态
|
||||
/// 在不同阶段执行不同的更新逻辑
|
||||
/// </remarks>
|
||||
private TSGM_Stage currentStage;
|
||||
|
||||
/// <summary>
|
||||
/// 子弹的属性
|
||||
/// </summary>
|
||||
@ -148,6 +171,20 @@ namespace ThreatSource.Missile
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射导弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// - 设置当前阶段为发射阶段
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = TSGM_Stage.Launch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新导弹的状态
|
||||
/// </summary>
|
||||
@ -168,17 +205,72 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
base.Update(deltaTime);
|
||||
|
||||
if(IsActive)
|
||||
switch (currentStage)
|
||||
{
|
||||
double distanceToSeparationPoint = (separationPoint - Position).Magnitude();
|
||||
//距离分离点距离小于50米,则分离
|
||||
if (distanceToSeparationPoint <= SeparationRange)
|
||||
{
|
||||
PerformSeparation();
|
||||
}
|
||||
case TSGM_Stage.Launch:
|
||||
UpdateLaunchStage(deltaTime);
|
||||
break;
|
||||
case TSGM_Stage.Cruise:
|
||||
UpdateCruiseStage(deltaTime);
|
||||
break;
|
||||
case TSGM_Stage.Separation:
|
||||
UpdateSeparationStage(deltaTime);
|
||||
break;
|
||||
}
|
||||
base.Update(deltaTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新发射阶段的状态
|
||||
/// </summary>
|
||||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||||
/// <remarks>
|
||||
/// 发射阶段特点:
|
||||
/// - 不使用制导加速度
|
||||
/// - 仅依靠发动机推力
|
||||
/// - 持续时间为0.1秒
|
||||
/// - 结束后进入巡航阶段
|
||||
/// </remarks>
|
||||
private void UpdateLaunchStage(double deltaTime)
|
||||
{
|
||||
GuidanceAcceleration = Vector3D.Zero;
|
||||
if (FlightTime > 0.1)
|
||||
{
|
||||
currentStage = TSGM_Stage.Cruise;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新巡航阶段的状态
|
||||
/// </summary>
|
||||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||||
/// <remarks>
|
||||
/// 巡航阶段特点:
|
||||
/// - 保持稳定飞行
|
||||
/// - 不使用制导系统
|
||||
/// - 结束后进入分离阶段
|
||||
/// </remarks>
|
||||
private void UpdateCruiseStage(double deltaTime)
|
||||
{
|
||||
double distanceToSeparationPoint = (separationPoint - Position).Magnitude();
|
||||
//距离分离点距离小于50米,则分离
|
||||
if (distanceToSeparationPoint <= SeparationRange)
|
||||
{
|
||||
currentStage = TSGM_Stage.Separation;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新分离阶段的状态
|
||||
/// </summary>
|
||||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||||
/// <remarks>
|
||||
/// 分离阶段特点:
|
||||
/// - 分离子弹药
|
||||
/// </remarks>
|
||||
private void UpdateSeparationStage(double deltaTime)
|
||||
{
|
||||
PerformSeparation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -193,16 +285,6 @@ namespace ThreatSource.Missile
|
||||
/// 5. 将子弹药注册到仿真系统
|
||||
/// 6. 激活所有子弹药
|
||||
/// 7. 停用母弹
|
||||
///
|
||||
/// 子弹药参数设置:
|
||||
/// - 初始位置:母弹当前位置
|
||||
/// - 初始速度:200米/秒
|
||||
/// - 最大速度:2000米/秒
|
||||
/// - 最大飞行时间:50秒
|
||||
/// - 最大飞行距离:1000米
|
||||
/// - 最大加速度:50米/秒²
|
||||
/// - 比例导引系数:3
|
||||
/// - 质量:10千克
|
||||
/// </remarks>
|
||||
private void PerformSeparation()
|
||||
{
|
||||
@ -254,6 +336,7 @@ namespace ThreatSource.Missile
|
||||
Debug.WriteLine($"注册末敏弹子弹 {submunitions[i].Id}");
|
||||
submunitions[i].Activate();
|
||||
Debug.WriteLine($"激活末敏弹子弹 {submunitions[i].Id}");
|
||||
submunitions[i].Fire();
|
||||
}
|
||||
|
||||
// 母弹完成任务,可以被移除
|
||||
|
||||
@ -189,8 +189,9 @@ namespace ThreatSource.Missile
|
||||
/// <remarks>
|
||||
/// 用于控制螺旋扫描的方向
|
||||
/// 影响传感器的指向
|
||||
/// 初始角度为0(北)
|
||||
/// </remarks>
|
||||
private double spiralAngle;
|
||||
private double spiralAngle = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 扫描方向向量
|
||||
@ -273,8 +274,6 @@ namespace ThreatSource.Missile
|
||||
{
|
||||
TargetId = targetId;
|
||||
|
||||
currentStage = SubmunitionStage.Separation;
|
||||
spiralAngle = 0;
|
||||
// 初始化扫描方向为正北
|
||||
scanDirection = new Vector3D(0, 0, 1).Normalize();
|
||||
|
||||
@ -285,6 +284,19 @@ namespace ThreatSource.Missile
|
||||
rangefinder = new LaserRangefinder(this, 500, 1.06, 100, 0.5); // 激光测距仪,测量距离500米,波长1.06µm,测量频率100Hz,测量精度0.5米
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射子弹
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 发射过程:
|
||||
/// - 调用基类发射方法
|
||||
/// </remarks>
|
||||
public override void Fire()
|
||||
{
|
||||
base.Fire();
|
||||
currentStage = SubmunitionStage.Separation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新子弹状态
|
||||
/// </summary>
|
||||
@ -298,8 +310,6 @@ namespace ThreatSource.Missile
|
||||
/// </remarks>
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
base.Update(deltaTime);
|
||||
|
||||
// 更新传感器
|
||||
infraredDetector.Update(deltaTime);
|
||||
radiometer.Update(deltaTime);
|
||||
@ -327,6 +337,7 @@ namespace ThreatSource.Missile
|
||||
UpdateAttackStage(deltaTime);
|
||||
break;
|
||||
}
|
||||
base.Update(deltaTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -422,7 +422,6 @@ namespace ThreatSource.Simulation
|
||||
{
|
||||
if (entities.TryGetValue(id, out var entity))
|
||||
{
|
||||
Debug.WriteLine($"[实体管理] 获取实体: {id} ({entity.GetType().Name})");
|
||||
return entity;
|
||||
}
|
||||
|
||||
@ -431,7 +430,6 @@ namespace ThreatSource.Simulation
|
||||
var externalEntity = _simulationAdapter.GetEntity(id);
|
||||
if (externalEntity != null)
|
||||
{
|
||||
Debug.WriteLine($"[实体管理] 从外部系统获取实体: {id}");
|
||||
return externalEntity;
|
||||
}
|
||||
}
|
||||
@ -464,7 +462,6 @@ namespace ThreatSource.Simulation
|
||||
result.Add(typedEntity);
|
||||
}
|
||||
}
|
||||
Debug.WriteLine($"[实体管理] 获取类型 {typeof(T).Name} 的实体,找到 {result.Count} 个");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,9 +23,9 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
public event EventHandler? SimulationEnded;
|
||||
|
||||
private readonly ISimulationManager simulationManager;
|
||||
private readonly Dictionary<string, SimulationElement> missiles;
|
||||
private readonly Dictionary<string, BaseMissile> missiles;
|
||||
private readonly Dictionary<string, SimulationElement> targets;
|
||||
private readonly Dictionary<string, SimulationElement> sensors;
|
||||
private readonly Dictionary<string, SimulationElement> indicators;
|
||||
private Dictionary<string, bool> missileActiveStatus;
|
||||
private readonly double timeStep = 0.01; // 时间步长,单位:秒
|
||||
|
||||
@ -35,9 +35,9 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
public ComprehensiveMissileSimulator()
|
||||
{
|
||||
simulationManager = new SimulationManager();
|
||||
missiles = new Dictionary<string, SimulationElement>();
|
||||
missiles = new Dictionary<string, BaseMissile>();
|
||||
targets = new Dictionary<string, SimulationElement>();
|
||||
sensors = new Dictionary<string, SimulationElement>();
|
||||
indicators = new Dictionary<string, SimulationElement>();
|
||||
missileActiveStatus = new Dictionary<string, bool>();
|
||||
InitializeSimulation();
|
||||
}
|
||||
@ -60,13 +60,6 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
|
||||
// 添加各种传感器和指示器
|
||||
AddSensorsAndDesignators();
|
||||
|
||||
// 初始化所有导弹的激活状态为false
|
||||
foreach (var missile in missiles.Keys)
|
||||
{
|
||||
missileActiveStatus[missile] = false;
|
||||
missiles[missile].Activate(); // 激活导弹,但不会更新状态
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -80,7 +73,6 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
};
|
||||
targets[targetId] = target;
|
||||
simulationManager.RegisterEntity(targetId, target);
|
||||
target.Activate(); // 添加这行,激活目标
|
||||
Console.WriteLine($"添加目标 {targetId},位置:{position}");
|
||||
}
|
||||
|
||||
@ -109,7 +101,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
var missile = new LaserSemiActiveGuidedMissile(properties, simulationManager);
|
||||
missiles["LSGM_1"] = missile;
|
||||
simulationManager.RegisterEntity("LSGM_1", missile);
|
||||
Console.WriteLine($"注册激光半主动导弹 LSGM_1");
|
||||
Console.WriteLine($"注册激光半主动制导导弹 LSGM_1");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -137,7 +129,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
var missile = new LaserBeamRiderMissile(properties, simulationManager);
|
||||
missiles["LBRM_1"] = missile;
|
||||
simulationManager.RegisterEntity("LBRM_1", missile);
|
||||
Console.WriteLine($"注册激光束骑导弹 LBRM_1");
|
||||
Console.WriteLine($"注册激光驾束制导导弹 LBRM_1");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -178,7 +170,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
var missile = new TerminalSensitiveMissile("Tank_1", properties, submunitionProperties, 1, simulationManager);
|
||||
missiles["TSM_1"] = missile;
|
||||
simulationManager.RegisterEntity("TSM_1", missile);
|
||||
Console.WriteLine($"注册末敏导弹 TSM_1");
|
||||
Console.WriteLine($"注册末敏弹 TSM_1");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -206,7 +198,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
var missile = new InfraredCommandGuidedMissile(properties, simulationManager);
|
||||
missiles["ICGM_1"] = missile;
|
||||
simulationManager.RegisterEntity("ICGM_1", missile);
|
||||
Console.WriteLine($"注册红外指令导弹 ICGM_1");
|
||||
Console.WriteLine($"注册红外指令制导导弹 ICGM_1");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -234,7 +226,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
var missile = new InfraredImagingTerminalGuidedMissile(properties, simulationManager);
|
||||
missiles["ITGM_1"] = missile;
|
||||
simulationManager.RegisterEntity("ITGM_1", missile);
|
||||
Console.WriteLine($"注册红外成像导弹 ITGM_1");
|
||||
Console.WriteLine($"注册红外成像末制导导弹 ITGM_1");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -262,7 +254,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
var missile = new MillimeterWaveTerminalGuidedMissile(properties, simulationManager);
|
||||
missiles["MMWG_1"] = missile;
|
||||
simulationManager.RegisterEntity("MMWG_1", missile);
|
||||
Console.WriteLine($"注册毫米波导弹 MMWG_1");
|
||||
Console.WriteLine($"注册毫米波末制导导弹 MMWG_1");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -285,7 +277,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
},
|
||||
simulationManager
|
||||
);
|
||||
sensors["LD_1"] = laserDesignator;
|
||||
indicators["LD_1"] = laserDesignator;
|
||||
simulationManager.RegisterEntity("LD_1", laserDesignator);
|
||||
Console.WriteLine("注册激光目标指示器 LD_1");
|
||||
|
||||
@ -304,7 +296,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
},
|
||||
simulationManager
|
||||
);
|
||||
sensors["LBR_1"] = laserBeamRider;
|
||||
indicators["LBR_1"] = laserBeamRider;
|
||||
simulationManager.RegisterEntity("LBR_1", laserBeamRider);
|
||||
Console.WriteLine("注册激光驾束仪 LBR_1");
|
||||
|
||||
@ -324,7 +316,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
},
|
||||
simulationManager
|
||||
);
|
||||
sensors["IT_1"] = infraredTracker;
|
||||
indicators["IT_1"] = infraredTracker;
|
||||
simulationManager.RegisterEntity("IT_1", infraredTracker);
|
||||
Console.WriteLine("注册红外测角仪 IT_1");
|
||||
}
|
||||
@ -346,9 +338,9 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
missileActiveStatus[id] = false;
|
||||
missiles[id].Deactivate();
|
||||
}
|
||||
foreach (var sensor in sensors.Values)
|
||||
foreach (var indicator in indicators.Values)
|
||||
{
|
||||
sensor.Deactivate();
|
||||
indicator.Deactivate();
|
||||
}
|
||||
|
||||
// 激活选中的导弹
|
||||
@ -379,22 +371,22 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
switch (missileId)
|
||||
{
|
||||
case "LSGM_1": // 激光半主动制导导弹
|
||||
if (sensors.ContainsKey("LD_1"))
|
||||
if (indicators.ContainsKey("LD_1"))
|
||||
{
|
||||
sensors["LD_1"].Activate();
|
||||
indicators["LD_1"].Activate();
|
||||
}
|
||||
break;
|
||||
case "LBRM_1": // 激光驾束制导导弹
|
||||
if (sensors.ContainsKey("LBR_1"))
|
||||
if (indicators.ContainsKey("LBR_1"))
|
||||
{
|
||||
sensors["LBR_1"].Activate();
|
||||
indicators["LBR_1"].Activate();
|
||||
}
|
||||
break;
|
||||
case "ICGM_1": // 红外指令制导导弹
|
||||
case "ITGM_1": // 红外成像末制导导弹
|
||||
if (sensors.ContainsKey("IT_1"))
|
||||
if (indicators.ContainsKey("IT_1"))
|
||||
{
|
||||
sensors["IT_1"].Activate();
|
||||
indicators["IT_1"].Activate();
|
||||
}
|
||||
break;
|
||||
case "TSM_1": // 末敏弹
|
||||
@ -496,17 +488,10 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
{
|
||||
if (missileActiveStatus[missile.Id])
|
||||
{
|
||||
missile.Activate();
|
||||
missile.Fire();
|
||||
}
|
||||
}
|
||||
|
||||
// 确保所有目标都处于激活状态
|
||||
foreach (var target in targets.Values)
|
||||
{
|
||||
target.Activate();
|
||||
Console.WriteLine($"激活目标:{target.Id}");
|
||||
}
|
||||
|
||||
// 打印仿真开始前的组件状态
|
||||
PrintSimulationRegisteredComponents();
|
||||
|
||||
@ -565,7 +550,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
}
|
||||
|
||||
// 打印激活的传感器状态
|
||||
foreach (var sensor in sensors.Values.Where(s => s.IsActive))
|
||||
foreach (var sensor in indicators.Values.Where(s => s.IsActive))
|
||||
{
|
||||
Console.WriteLine("\n========== 传感器状态 ==========");
|
||||
Console.WriteLine(sensor.GetStatus());
|
||||
@ -624,7 +609,7 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
|
||||
// 重置所有传感器状态
|
||||
var activeSensors = simulationManager.GetEntitiesByType<SimulationElement>()
|
||||
.Where(e => sensors.ContainsValue(e));
|
||||
.Where(e => indicators.ContainsValue(e));
|
||||
foreach (var sensor in activeSensors)
|
||||
{
|
||||
sensor.Deactivate();
|
||||
@ -674,11 +659,11 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
/// <summary>
|
||||
/// 获取当前活动的传感器列表
|
||||
/// </summary>
|
||||
public (string Id, string Name, bool IsActive)[] GetActiveSensors()
|
||||
public (string Id, string Name, bool IsActive)[] GetActiveIndicators()
|
||||
{
|
||||
return sensors.Select(s => (
|
||||
return indicators.Select(s => (
|
||||
s.Value.Id,
|
||||
GetSensorDisplayName(s.Value),
|
||||
GetIndicatorDisplayName(s.Value),
|
||||
s.Value.IsActive
|
||||
)).ToArray();
|
||||
}
|
||||
@ -686,30 +671,30 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
/// <summary>
|
||||
/// 获取传感器的显示名称
|
||||
/// </summary>
|
||||
private string GetSensorDisplayName(SimulationElement sensor)
|
||||
private string GetIndicatorDisplayName(SimulationElement indicator)
|
||||
{
|
||||
return sensor switch
|
||||
return indicator switch
|
||||
{
|
||||
LaserDesignator _ => "激光目标指示器",
|
||||
LaserBeamRider _ => "激光驾束仪",
|
||||
InfraredTracker _ => "红外测角仪",
|
||||
_ => sensor.Id
|
||||
_ => indicator.Id
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 切换传感器的激活状态
|
||||
/// </summary>
|
||||
public void ToggleSensor(string sensorId)
|
||||
public void ToggleIndicator(string indicatorId)
|
||||
{
|
||||
if (sensors.TryGetValue(sensorId, out var sensor))
|
||||
if (indicators.TryGetValue(indicatorId, out var indicator))
|
||||
{
|
||||
if (sensor.IsActive)
|
||||
sensor.Deactivate();
|
||||
if (indicator.IsActive)
|
||||
indicator.Deactivate();
|
||||
else
|
||||
sensor.Activate();
|
||||
indicator.Activate();
|
||||
|
||||
Console.WriteLine($"传感器 {GetSensorDisplayName(sensor)} 已{(sensor.IsActive ? "激活" : "停用")}");
|
||||
Console.WriteLine($"指示器 {GetIndicatorDisplayName(indicator)} 已{(indicator.IsActive ? "激活" : "停用")}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -142,10 +142,10 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
{
|
||||
Console.WriteLine("\n第二步:配置传感器和指示器");
|
||||
Console.WriteLine("当前传感器状态:");
|
||||
var sensors = simulator.GetActiveSensors();
|
||||
for (int i = 0; i < sensors.Length; i++)
|
||||
var indicators = simulator.GetActiveIndicators();
|
||||
for (int i = 0; i < indicators.Length; i++)
|
||||
{
|
||||
Console.WriteLine($" {i + 1}. {sensors[i].Name} [{(sensors[i].IsActive ? "激活" : "未激活")}]");
|
||||
Console.WriteLine($" {i + 1}. {indicators[i].Name} [{(indicators[i].IsActive ? "激活" : "未激活")}]");
|
||||
}
|
||||
Console.WriteLine(" 0. 继续下一步");
|
||||
Console.WriteLine(" exit. 退出程序");
|
||||
@ -157,9 +157,9 @@ namespace ThreatSource.Tools.MissileSimulation
|
||||
if (int.TryParse(input, out int choice))
|
||||
{
|
||||
if (choice == 0) return true;
|
||||
if (choice >= 1 && choice <= sensors.Length)
|
||||
if (choice >= 1 && choice <= indicators.Length)
|
||||
{
|
||||
simulator.ToggleSensor(sensors[choice - 1].Id);
|
||||
simulator.ToggleIndicator(indicators[choice - 1].Id);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user