【Godot】关于游戏手柄输入

(原文写于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枚举或的常量名如下:
Godot中类Xbox手柄键位与轴名称示意图
也是就下表

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

其他的使用方式,你可以自行探索一下,这篇只作为是抛转引玉。

猜你喜欢

转载自blog.csdn.net/graypigen1990/article/details/127992560