namespace GFramework.Game.input;
///
/// 输入上下文堆栈管理器,用于管理多个输入上下文的堆栈结构
///
public class InputContextStack
{
private readonly Stack _stack = new();
///
/// 将指定的输入上下文压入堆栈顶部
///
/// 要压入堆栈的输入上下文对象
public void Push(IInputContext context) => _stack.Push(context);
///
/// 弹出堆栈顶部的元素
///
public void Pop() => _stack.Pop();
///
/// 弹出堆栈顶部的输入上下文
///
/// 要弹出的输入上下文对象
/// 如果成功弹出返回true,否则返回false
public bool Pop(IInputContext ctx)
{
// 检查堆栈顶部元素是否与指定上下文匹配,如果不匹配则返回false
if (!_stack.TryPeek(out var top) || top != ctx) return false;
_stack.Pop();
return true;
}
///
/// 获取堆栈顶部的输入上下文但不移除它
///
/// 堆栈顶部的输入上下文
public IInputContext Peek() => _stack.Peek();
///
/// 处理游戏输入事件
///
/// 要处理的游戏输入事件
/// 如果任何一个输入上下文成功处理了输入事件则返回true,否则返回false
public bool Handle(IGameInputEvent input)
{
// 从堆栈顶部开始遍历输入上下文,尝试处理输入事件
return _stack.Any(ctx => ctx.Handle(input));
}
}