mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-24 20:34:29 +08:00
fix(input): 修正输入系统事件处理逻辑
- 移除了输入处理中的提前返回语句,确保所有翻译器都能被遍历 - 修正了Godot输入桥接节点名称的格式字符串拼接错误 - 为输入上下文堆栈增加了带参数的Pop方法,支持安全弹出指定上下文 - 新增Peek方法用于获取堆栈顶部的输入上下文而不移除它 - 更新了输入处理方法的注释说明,明确处理流程是从堆栈顶部开始遍历 - 调整了堆栈遍历顺序,确保按照后进先出的原则处理输入事件
This commit is contained in:
parent
f8a6155921
commit
e39f32d9a8
@ -14,20 +14,41 @@ public class InputContextStack
|
|||||||
public void Push(IInputContext context) => _stack.Push(context);
|
public void Push(IInputContext context) => _stack.Push(context);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 弹出堆栈顶部的输入上下文
|
/// 弹出堆栈顶部的元素
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Pop() => _stack.Pop();
|
public void Pop() => _stack.Pop();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理游戏输入事件,遍历堆栈中的所有上下文直到找到能够处理该事件的上下文
|
/// 弹出堆栈顶部的输入上下文
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ctx">要弹出的输入上下文对象</param>
|
||||||
|
/// <returns>如果成功弹出返回true,否则返回false</returns>
|
||||||
|
public bool Pop(IInputContext ctx)
|
||||||
|
{
|
||||||
|
// 检查堆栈顶部元素是否与指定上下文匹配,如果不匹配则返回false
|
||||||
|
if (!_stack.TryPeek(out var top) || top != ctx) return false;
|
||||||
|
_stack.Pop();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取堆栈顶部的输入上下文但不移除它
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>堆栈顶部的输入上下文</returns>
|
||||||
|
public IInputContext Peek() => _stack.Peek();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理游戏输入事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input">要处理的游戏输入事件</param>
|
/// <param name="input">要处理的游戏输入事件</param>
|
||||||
/// <returns>如果堆栈中任意一个上下文成功处理了输入事件则返回true,否则返回false</returns>
|
/// <returns>如果任何一个输入上下文成功处理了输入事件则返回true,否则返回false</returns>
|
||||||
public bool Handle(IGameInputEvent input)
|
public bool Handle(IGameInputEvent input)
|
||||||
{
|
{
|
||||||
// 遍历堆栈中的所有上下文,调用其Handle方法处理输入事件
|
// 从堆栈顶部开始遍历输入上下文,尝试处理输入事件
|
||||||
// Any方法会在第一个返回true的上下文处停止遍历
|
|
||||||
return _stack.Any(ctx => ctx.Handle(input));
|
return _stack.Any(ctx => ctx.Handle(input));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -80,7 +80,6 @@ public class InputSystem : AbstractSystem
|
|||||||
{
|
{
|
||||||
if (!t.TryTranslate(rawInput, out var gameEvent)) continue;
|
if (!t.TryTranslate(rawInput, out var gameEvent)) continue;
|
||||||
Handle(gameEvent);
|
Handle(gameEvent);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ public abstract class AbstractGodotInputModule<T> : AbstractGodotModule<T>
|
|||||||
/// 架构锚点节点的唯一标识名称
|
/// 架构锚点节点的唯一标识名称
|
||||||
/// 用于在Godot场景树中创建和查找架构锚点节点
|
/// 用于在Godot场景树中创建和查找架构锚点节点
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const string GodotInputBridgeName = $"__${GFrameworkConstants.FrameworkName}__GodotInputBridge__";
|
private const string GodotInputBridgeName = $"__{GFrameworkConstants.FrameworkName}__GodotInputBridge__";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取模块对应的节点对象
|
/// 获取模块对应的节点对象
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user