【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_00游戏手柄左摇杆水平轴
JOY_AXIS_11游戏手柄左摇杆垂直轴
JOY_AXIS_22游戏手柄右摇杆水平轴
JOY_AXIS_33游戏手柄右摇杆垂直轴
JOY_DPAD_UP12游戏手柄上方向键
JOY_DPAD_DOWN13游戏手柄下方向键
JOY_DPAD_LEFT14游戏手柄左方向键
JOY_DPAD_RIGHT15游戏手柄右方向键
JOY_XBOX_A0Xbox 游戏手柄A
JOY_XBOX_B1Xbox 游戏手柄B
JOY_XBOX_X2Xbox 游戏手柄X
JOY_XBOX_Y3Xbox 游戏手柄Y
JOY_L4游戏手柄左肩键
JOY_L26游戏手柄左扳机键
JOY_R5游戏手柄右肩键
JOY_R27游戏手柄的右扳机键

键位的意义

以上面的类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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巽星石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值