使用 Fire()设置导弹的初始阶段

This commit is contained in:
Tian jianyong 2025-03-06 12:07:50 +08:00
parent ac690dad52
commit 2096062cbd
14 changed files with 334 additions and 169 deletions

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -16,7 +16,7 @@ namespace ThreatSource.Indicator
/// - 状态监控
/// 通过激光照射目标实现半主动激光制导
/// </remarks>
public class LaserDesignator : SimulationElement
public class LaserDesignator : SimulationElement, IIndicator
{
/// <summary>
/// 获取或设置目标ID

View File

@ -270,28 +270,11 @@ namespace ThreatSource.Missile
/// </summary>
/// <remarks>
/// 发射过程:
/// - 激活导弹
/// - 开始计时和计数
/// - 启动发动机
/// - 初始化运动状态
/// </remarks>
public virtual void Fire()
{
OnFire();
Activate();
}
/// <summary>
/// 发射导弹
/// </summary>
/// <remarks>
/// 发射过程:
/// - 激活导弹
/// - 开始计时和计数
/// - 启动发动机
/// - 初始化运动状态
/// </remarks>
public virtual void OnFire()
{
// 子类可以重写此方法来处理发射时的特殊逻辑
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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;
}

View File

@ -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>

View File

@ -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();
}
// 母弹完成任务,可以被移除

View File

@ -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>

View File

@ -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;
}
}

View File

@ -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 ? "" : "")}");
}
}
}

View File

@ -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;
}
}