现在主流的游戏手柄分为任天堂、XBOX和SONY三种。三种游戏手柄键位名称和布局不一样,在Godot对应的常数名和值也不一样。
笔者国庆左右购买了北通的宙斯手柄,这是一款与XBOX手柄键位一致的手柄。
image.png

Godot中对手柄按键和摇杆轴及压力进行测定

image.png
以上代码会在场景运行后,自动检测并输出手柄按键对应的button_index值(枚举常量),以及两个摇杆的横向轴和纵向对应的button_index值(枚举常量)以及两个轴向的按压值或叫偏移量。
经过上述检测以及对应查看JoystickList枚举的值,类XBOX手柄键位对应如右图:
image.png
InputEventJoypadButton对应手柄上的非摇杆按键的按下与松开等事件;
InputEventJoypadMotion对应检测手柄上两个摇杆的按压与反馈。

Godot中利用手柄摇杆和十字键分别进行简单的八向运动控制

十字键的移动实现类似用键盘上下左右键,使用Input的如下方法,判断按键是否按下,并生成方向向量和速度向量,再处理运动即可:
image.png
而摇杆则是通过下面的方法:获取摇杆水平X轴和Y轴的值,来组合成一个方向向量(没有归一化),再通过生成速度向量处理移动
image.pngimage.png
单个摇杆轴返回的值返回是-1.0-1.0之间,两个轴的值共同组合成为一个Vector2,就是摇杆所生成的速度向量
测定摇杆所获得的方向向量是否归一化,可以用下面的代码:
image.png

image.png

  1. extends Sprite
  2. var pos=Vector.2.ZER0#方向向量
  3. var dp=5#单次移动距离
  4. func _process(delta):
  5. pos Vector2.ZERO
  6. #手柄十字键控制上下左右移动
  7. if Input.is_joy_button_pressed(0,JOY_DPAD_LEFT):
  8. p0s.X=-1
  9. if Input.is_joy_button_pressed(0,JOY_DPAD_RIGHT):
  10. p05.X=1
  11. if Input.is_joy_button_pressed(0,JOY_DPAD_UP):
  12. p0s.y=-1
  13. if Input.is_joy_button_pressed(0,JOY_DPAD_DOWN):
  14. pos.y 1
  15. position +pos dp
  16. #手柄左上角摇杆控制移动
  17. pos.x Input.get_joy_axis(0,JOY_AXIS_0)
  18. pos.y Input.get_joy_axis(0,JOY_AXIS_1)
  19. position +pos dp

使用Godot内置键位映射处理游戏手柄输入

image.png
Godot键位映射列表中有几个默认内置的Action(动作),已经包含了我们常用的键盘按键和对应手柄按键的键位与动作含义的关联
在代码中我们可以直接使用Input.is_action_pressed()来判断和处理手柄输入
Action(动作):语义化的输入的优势也就体现出来——对应多种输入设备,保持输入的语义统一