ActiveProtect/SimulationEnvironment/SimulationElement.cs

103 lines
3.1 KiB
C#

using System;
using ActiveProtect.Models;
namespace ActiveProtect.SimulationEnvironment
{
/// <summary>
/// 仿真元素的抽象基类,所有仿真中的实体都继承自此类
/// </summary>
public abstract class SimulationElement
{
/// <summary>
/// 仿真元素的唯一标识符
/// </summary>
public virtual string Id { get; set; }
/// <summary>
/// 仿真元素的当前位置
/// </summary>
public virtual Vector3D Position { get; set; }
/// <summary>
/// 仿真元素的当前速度
/// </summary>
public virtual Vector3D Velocity { get; set; }
/// <summary>
/// 仿真元素的当前朝向
/// </summary>
public virtual Orientation Orientation { get; set; }
/// <summary>
/// 仿真元素是否处于活动状态
/// </summary>
public virtual bool IsActive { get; protected set; }
/// <summary>
/// 仿真管理器的引用
/// </summary>
protected ISimulationManager SimulationManager { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="id">仿真元素的唯一标识符</param>
/// <param name="position">初始位置</param>
/// <param name="orientation">初始朝向</param>
/// <param name="simulationManager">仿真管理器</param>
protected SimulationElement(string id, Vector3D position, Orientation orientation, double speed, ISimulationManager simulationManager)
{
Id = id;
Position = position;
Orientation = orientation;
Velocity = orientation.ToVector() * speed;
this.SimulationManager = simulationManager;
IsActive = false;
}
/// <summary>
/// 更新仿真元素的状态
/// </summary>
/// <param name="deltaTime">时间步长</param>
public abstract void Update(double deltaTime);
/// <summary>
/// 获取仿真元素的状态信息
/// </summary>
/// <returns>状态信息字符串</returns>
public virtual string GetStatus()
{
return $"{GetType().Name} {Id} at {Position}, Orientation: {Orientation}, Active: {IsActive}";
}
/// <summary>
/// 发布仿真事件
/// </summary>
/// <param name="evt">要发布的事件</param>
protected void PublishEvent(SimulationEvent evt)
{
evt.SenderId = Id;
evt.Timestamp = SimulationManager.CurrentTime;
SimulationManager.PublishEvent(evt);
}
/// <summary>
/// 激活仿真元素
/// </summary>
public virtual void Activate()
{
IsActive = true;
PublishEvent(new EntityActivatedEvent { ActivatedEntityId = Id });
}
/// <summary>
/// 停用仿真元素
/// </summary>
public virtual void Deactivate()
{
IsActive = false;
PublishEvent(new EntityDeactivatedEvent { DeactivatedEntityId = Id });
}
}
}