168 lines
4.4 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |