namespace GFramework.Godot.system;
///
/// 抽象输入系统基类,实现了IInputSystem接口的基本功能
///
public abstract class AbstractInputSystem : AbstractAssetCatalogSystem, IInputSystem
{
// 存储动作名称与按键绑定的映射关系
private readonly Dictionary _actionBindings = new();
// 存储动作名称与当前状态的映射关系
private readonly Dictionary _actionStates = new();
// 存储动作名称与上一帧状态的映射关系
private readonly Dictionary _previousActionStates = new();
///
public virtual void SetBinding(string actionName, string keyCode)
{
_actionBindings[actionName] = keyCode;
}
///
public virtual string GetBinding(string actionName)
{
return _actionBindings.TryGetValue(actionName, out var binding) ? binding : string.Empty;
}
///
public virtual bool IsActionPressed(string actionName)
{
return _actionStates.TryGetValue(actionName, out var state) && state;
}
///
public virtual bool IsActionJustPressed(string actionName)
{
var current = _actionStates.TryGetValue(actionName, out var currentState) && currentState;
var previous = _previousActionStates.TryGetValue(actionName, out var previousState) && previousState;
return current && !previous;
}
///
public virtual bool IsActionJustReleased(string actionName)
{
var current = _actionStates.TryGetValue(actionName, out var currentState) && currentState;
var previous = _previousActionStates.TryGetValue(actionName, out var previousState) && previousState;
return !current && previous;
}
///
public virtual void AddAction(string actionName, string defaultKeyCode)
{
if (!_actionBindings.ContainsKey(actionName))
{
_actionBindings[actionName] = defaultKeyCode;
_actionStates[actionName] = false;
_previousActionStates[actionName] = false;
}
}
///
public virtual void RemoveAction(string actionName)
{
_actionBindings.Remove(actionName);
_actionStates.Remove(actionName);
_previousActionStates.Remove(actionName);
}
///
public abstract void SaveConfiguration();
///
public abstract void LoadConfiguration();
///
public abstract void Update(double delta);
///
/// 更新输入状态,在每一帧调用
///
protected virtual void UpdateInputStates()
{
// 保存当前状态作为下一帧的前一状态
foreach (var kvp in _actionStates)
{
_previousActionStates[kvp.Key] = kvp.Value;
}
// 更新当前状态
foreach (var kvp in _actionBindings)
{
var actionName = kvp.Key;
var keyCode = kvp.Value;
// 这里需要根据具体平台和引擎实现具体的按键检测逻辑
// 当前只是一个占位实现
_actionStates[actionName] = CheckKeyPressed(keyCode);
}
}
///
/// 检查特定按键是否被按下
///
/// 按键码
/// 按键是否被按下
protected virtual bool CheckKeyPressed(string keyCode)
{
// 这里需要根据Godot引擎的具体实现来检查按键状态
// 目前只是示例实现
return false;
}
}