132 lines
4.5 KiB
C#
132 lines
4.5 KiB
C#
using ActiveProtect.SimulationEnvironment;
|
|
|
|
namespace ActiveProtect.Models
|
|
{
|
|
public class LaserBeamRiderMissile : MissileBase
|
|
{
|
|
/// <summary>
|
|
/// 激光驾束制导导弹阶段
|
|
/// </summary>
|
|
private enum LBRM_Stage
|
|
{
|
|
Launch, // 发射阶段
|
|
Cruise, // 巡航阶段
|
|
Explode, // 爆炸阶段
|
|
SelfDestruct // 自毁阶段
|
|
}
|
|
private LBRM_Stage currentStage;
|
|
private LaserBeamRiderGuidanceSystem LaserBeamRiderGuidanceSystem;
|
|
private MissileConfig missileConfig;
|
|
|
|
|
|
public LaserBeamRiderMissile(string id, MissileConfig missileConfig, ISimulationManager simulationManager)
|
|
: base(id, missileConfig, simulationManager)
|
|
{
|
|
LaserBeamRiderGuidanceSystem = new LaserBeamRiderGuidanceSystem();
|
|
currentStage = LBRM_Stage.Launch;
|
|
this.missileConfig = missileConfig;
|
|
}
|
|
|
|
private void OnLaserBeamStart(LaserBeamStartEvent evt)
|
|
{
|
|
if (evt?.LaserBeamRider != null)
|
|
{
|
|
LaserBeamRiderGuidanceSystem?.UpdateLaserBeamRider(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
|
|
}
|
|
}
|
|
|
|
private void OnLaserBeamUpdate(LaserBeamUpdateEvent evt)
|
|
{
|
|
if (evt?.LaserBeamRider != null)
|
|
{
|
|
LaserBeamRiderGuidanceSystem?.UpdateLaserBeamRider(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
|
|
}
|
|
}
|
|
|
|
private void OnLaserBeamStop(LaserBeamStopEvent evt)
|
|
{
|
|
if (evt?.LaserBeamRider != null)
|
|
{
|
|
LaserBeamRiderGuidanceSystem?.DeactivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection);
|
|
}
|
|
}
|
|
|
|
public override void Update(double deltaTime)
|
|
{
|
|
switch (currentStage)
|
|
{
|
|
case LBRM_Stage.Launch:
|
|
UpdateLaunchStage(deltaTime);
|
|
break;
|
|
case LBRM_Stage.Cruise:
|
|
UpdateCruiseStage(deltaTime);
|
|
break;
|
|
case LBRM_Stage.Explode:
|
|
UpdateExplodeStage(deltaTime);
|
|
break;
|
|
case LBRM_Stage.SelfDestruct:
|
|
SelfDestruct();
|
|
break;
|
|
}
|
|
|
|
base.Update(deltaTime);
|
|
}
|
|
|
|
private void UpdateLaunchStage(double deltaTime)
|
|
{
|
|
// 发射阶段
|
|
GuidanceAcceleration = Vector3D.Zero;
|
|
if (FlightTime >= 0.01)
|
|
{
|
|
currentStage = LBRM_Stage.Cruise;
|
|
}
|
|
}
|
|
|
|
private void UpdateCruiseStage(double deltaTime)
|
|
{
|
|
// 巡航阶段
|
|
LaserBeamRiderGuidanceSystem.Update(deltaTime, Position, Velocity);
|
|
GuidanceAcceleration = LaserBeamRiderGuidanceSystem.GetGuidanceAcceleration();
|
|
if (DistanceToTarget <= missileConfig.DistanceParams.ExplosionDistance)
|
|
{
|
|
currentStage = LBRM_Stage.Explode;
|
|
}
|
|
}
|
|
|
|
private void UpdateExplodeStage(double deltaTime)
|
|
{
|
|
// 爆炸阶段
|
|
Explode();
|
|
}
|
|
|
|
private void UpdateSelfDestructStage(double deltaTime)
|
|
{
|
|
// 自毁阶段
|
|
SelfDestruct();
|
|
}
|
|
|
|
public override string GetStatus()
|
|
{
|
|
string baseStatus = base.GetStatus().Replace("导弹", "激光驾束制导导弹");
|
|
string additionalStatus = $"\n 激光引导: {(LaserBeamRiderGuidanceSystem.HasGuidance ? "有效" : "无效")}";
|
|
return baseStatus + additionalStatus;
|
|
}
|
|
|
|
public override void Activate()
|
|
{
|
|
base.Activate();
|
|
SimulationManager.SubscribeToEvent<LaserBeamStartEvent>(OnLaserBeamStart);
|
|
SimulationManager.SubscribeToEvent<LaserBeamStopEvent>(OnLaserBeamStop);
|
|
SimulationManager.SubscribeToEvent<LaserBeamUpdateEvent>(OnLaserBeamUpdate);
|
|
}
|
|
|
|
public override void Deactivate()
|
|
{
|
|
base.Deactivate();
|
|
SimulationManager.UnsubscribeFromEvent<LaserBeamStartEvent>(OnLaserBeamStart);
|
|
SimulationManager.UnsubscribeFromEvent<LaserBeamStopEvent>(OnLaserBeamStop);
|
|
SimulationManager.UnsubscribeFromEvent<LaserBeamUpdateEvent>(OnLaserBeamUpdate);
|
|
}
|
|
}
|
|
}
|