using GFramework.Core.extensions;
using GFramework.Core.system;
namespace GFramework.Game.input;
///
/// 输入系统类,负责管理输入上下文堆栈并处理游戏输入事件
///
public class InputSystem : AbstractSystem
{
private readonly List _translators = [];
private readonly InputContextStack _contextStack = new();
///
/// 将输入上下文推入上下文堆栈
///
/// 要推入的输入上下文对象
public void PushContext(IInputContext ctx)
=> _contextStack.Push(ctx);
///
/// 从上下文堆栈中弹出顶层输入上下文
///
public void PopContext()
=> _contextStack.Pop();
///
/// 处理游戏输入事件,首先尝试通过上下文堆栈处理,如果未被处理则发送事件
///
/// 要处理的游戏输入事件
public void Handle(IGameInputEvent input)
{
// 尝试通过上下文堆栈处理输入事件
if (_contextStack.Handle(input))
return;
// 如果上下文堆栈未能处理,则发送该事件
this.SendEvent(input);
}
///
/// 系统初始化方法,在系统启动时调用
///
protected override void OnInit()
{
}
///
/// 注销输入转换器
///
/// 要注销的输入转换器接口实例
public void UnregisterTranslator(IInputTranslator translator)
=> _translators.Remove(translator);
///
/// 注册输入转换器
///
/// 输入转换器接口实例
/// 是否为高优先级,true时插入到转换器列表开头,false时添加到列表末尾
public void RegisterTranslator(IInputTranslator translator, bool highPriority = false)
{
if (_translators.Contains(translator))
return;
// 根据优先级设置决定插入位置
if (highPriority)
_translators.Insert(0, translator);
else
_translators.Add(translator);
}
///
/// 处理原始输入数据
///
/// 原始输入对象
public void HandleRaw(object rawInput)
{
// 遍历所有注册的转换器,尝试将原始输入转换为游戏事件
foreach (var t in _translators)
{
if (!t.TryTranslate(rawInput, out var gameEvent)) continue;
Handle(gameEvent);
}
}
}