ActiveProtect/Models/LaserBeamRiderMissile.cs

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