ActiveProtect/Docs/MissileStageStrategy.bak

168 lines
4.4 KiB
Plaintext

using System;
namespace ActiveProtect.Models
{
/// <summary>
/// 导弹飞行阶段枚举
/// </summary>
public enum FlightStage
{
Launch, // 发射阶段
Acceleration, // 加速阶段
Cruise, // 巡航阶段
TerminalGuidance, // 终端制导阶段
Attack, // 攻击阶段
Explosion, // 爆炸阶段
}
/// <summary>
/// 导弹飞行阶段策略接口
/// </summary>
public interface IMissileStageStrategy
{
void Update(double deltaTime);
}
/// <summary>
/// 发射阶段策略
/// </summary>
public class LaunchStageStrategy : IMissileStageStrategy
{
private readonly MissileBase missile;
private double launchTime = 0;
public LaunchStageStrategy(MissileBase missile)
{
this.missile = missile;
}
public void Update(double deltaTime)
{
launchTime += deltaTime;
if (launchTime >= MissileBase.LAUNCH_DURATION || missile.Speed >= missile.MaxSpeed * 0.1)
{
missile.ChangeStage(FlightStage.Acceleration);
}
}
}
/// <summary>
/// <summary>
/// 加速阶段策略
/// </summary>
public class AccelerationStageStrategy : IMissileStageStrategy
{
private readonly MissileBase missile;
public AccelerationStageStrategy(MissileBase missile)
{
this.missile = missile;
}
public void Update(double deltaTime)
{
if (missile.EngineBurnTime >= missile.MaxEngineBurnTime || missile.Speed >= missile.MaxSpeed)
{
missile.ChangeStage(FlightStage.Cruise);
}
}
}
/// <summary>
/// 巡航阶段策略
/// </summary>
public class CruiseStageStrategy : IMissileStageStrategy
{
private readonly MissileBase missile;
public CruiseStageStrategy(MissileBase missile)
{
this.missile = missile;
}
public void Update(double deltaTime)
{
if (missile.DistanceToTarget <= missile.DistanceParams.TerminalGuidanceDistance)
{
missile.ChangeStage(FlightStage.TerminalGuidance);
}
}
}
/// <summary>
/// 终端制导阶段策略
/// </summary>
public class TerminalGuidanceStageStrategy : IMissileStageStrategy
{
private readonly MissileBase missile;
public TerminalGuidanceStageStrategy(MissileBase missile)
{
this.missile = missile;
}
public void Update(double deltaTime)
{
if (missile.DistanceToTarget <= missile.DistanceParams.AttackDistance)
{
missile.ChangeStage(FlightStage.Attack);
}
}
}
/// <summary>
/// 攻击阶段策略
/// </summary>
public class AttackStageStrategy : IMissileStageStrategy
{
private readonly MissileBase missile;
public AttackStageStrategy(MissileBase missile)
{
this.missile = missile;
}
public void Update(double deltaTime)
{
if (missile.DistanceToTarget <= missile.DistanceParams.ExplosionDistance)
{
missile.Explode();
}
}
}
/// <summary>
/// 无制导阶段策略
/// </summary>
public class UnguidedStageStrategy : IMissileStageStrategy
{
private readonly MissileBase missile;
public UnguidedStageStrategy(MissileBase missile)
{
this.missile = missile;
}
public void Update(double deltaTime)
{
// 检查是否重新获得引导
if (missile.HasGuidance)
{
Console.WriteLine($"导弹 {missile.Id} 重新获得引导,退出无制导阶段");
if (missile.DistanceToTarget <= missile.DistanceParams.AttackDistance)
{
missile.ChangeStage(FlightStage.Attack);
}
else if (missile.DistanceToTarget <= missile.DistanceParams.TerminalGuidanceDistance)
{
missile.ChangeStage(FlightStage.TerminalGuidance);
}
else
{
missile.ChangeStage(FlightStage.Cruise);
}
}
}
}
}