(原文写于2021年国庆左右)
现在主流的游戏手柄分为任天堂、XBOX和SONY三种。三种游戏手柄键位名称和布局不一样,在Godot对应的常数名和值也不一样。
我一直以来都是PC玩家,成为Steam玩家也就两年左右,没有任何游戏主机和掌机。所以对游戏手柄也是个门外汉。2021年国庆左右购买了一款北通的宙斯手柄,这是一款与XBOX手柄键位一致的手柄。
买它的原因一个是拿来玩一些Steam上支持手柄的一些游戏,还有一个原因当然就是拿来研究Godot。
手柄是U口连接,有专用设置程序,这些都不讲了,简单讲一下在Godot中的一些测试和总结。
游戏手柄是否过时?
现在可能手机游戏的用户比较庞大,但是笔者偏偏是个不喜欢手游的人,并且坚信有些游戏就适合鼠标键盘玩,比如模拟经营类,而另一些非常适合游戏手柄玩,比如横版类和2D俯视角、2.5D动作类。
电脑+手柄其实是一个非常好的游戏娱乐组合,比键盘鼠标有趣,比触摸屏搓玻璃更优雅。
基础测试
因为Godot的官方文档没有涉及手柄的内容,API里面也是语焉不详,所以好的办法就是自己测试和总结。下面就是我当时首先写的测试代码,用于输出手柄按键对应的button_index
和两个摇杆所谓“轴”和“轴上的值”。
func _input(event):
# 输出手柄按键对应的常量值
if event is InputEventJoypadButton and event.is_pressed():
print(event.button_index)
# 输出按键的轴和压力值
if event is InputEventJoypadMotion:
print("轴:",event.axis,"压力",event.axis_value)
以上代码会在场景运行后,自动检测并输出手柄按键对应的button_index
值(枚举常量),以及两个摇杆的横向轴和纵向对应的button_index
值(枚举常量)以及两个轴向的按压值或叫偏移量。
其中:
InputEventJoypadButton
对应手柄上的非摇杆按键的按下与松开等事件;InputEventJoypadMotion
对应检测手柄上两个摇杆的按压与反馈。
经过上述检测以及对应查看JoystickList
枚举的值,总结XBOX类型手柄键位以及轴的对应的JoystickList
枚举或的常量名如下:
也是就下表
JoystickList枚举常量 | 对应数值 | 说明 |
---|---|---|
JOY_AXIS_0 | 0 | 游戏手柄左摇杆水平轴 |
JOY_AXIS_1 | 1 | 游戏手柄左摇杆垂直轴 |
JOY_AXIS_2 | 2 | 游戏手柄右摇杆水平轴 |
JOY_AXIS_3 | 3 | 游戏手柄右摇杆垂直轴 |
JOY_DPAD_UP | 12 | 游戏手柄上方向键 |
JOY_DPAD_DOWN | 13 | 游戏手柄下方向键 |
JOY_DPAD_LEFT | 14 | 游戏手柄左方向键 |
JOY_DPAD_RIGHT | 15 | 游戏手柄右方向键 |
JOY_XBOX_A | 0 | Xbox 游戏手柄A 键 |
JOY_XBOX_B | 1 | Xbox 游戏手柄B 键 |
JOY_XBOX_X | 2 | Xbox 游戏手柄X 键 |
JOY_XBOX_Y | 3 | Xbox 游戏手柄Y 键 |
JOY_L | 4 | 游戏手柄左肩键 |
JOY_L2 | 6 | 游戏手柄左扳机键 |
JOY_R | 5 | 游戏手柄右肩键 |
JOY_R2 | 7 | 游戏手柄的右扳机键 |
键位的意义
以上面的类XBOX手柄为例:
在很多游戏中对同一种手柄按键通常赋予不同的作用,但是又有一些约定俗成的类似设置。比如A键确认,B键返回,X键主技能,Y副技能。或者A是跳跃,B是冲刺等。
另外3D游戏中,左上角的摇杆控制移动,右下角摇杆控制视角等。
现在的游戏手柄还有左右共四个肩键,可以实现与更多键盘或鼠标按键功能的对应。
Godot中利用手柄摇杆和十字键分别进行简单的八向运动控制
extends Sprite
var dir = Vector2.ZERO # 方向向量
var dp = 5 # 单次移动距离
func _process(delta):
dir = Vector2.ZERO
# 手柄十字键控制上下左右移动
if Input.is_joy_button_pressed(0,JOY_DPAD_LEFT):
dir.x = -1
if Input.is_joy_button_pressed(0,JOY_DPAD_RIGHT):
dir.x = 1
if Input.is_joy_button_pressed(0,JOY_DPAD_UP):
dir.y = -1
if Input.is_joy_button_pressed(0,JOY_DPAD_DOWN):
dir.y = 1
position += dir * dp
# 手柄左上角摇杆控制移动
dir.x = Input.get_joy_axis(0,JOY_AXIS_0)
dir.y = Input.get_joy_axis(0,JOY_AXIS_1)
position += dir * dp
其他的使用方式,你可以自行探索一下,这篇只作为是抛转引玉。