S.C
1
各位好,想和大家一起讨论关于手柄摇杆映射的问题。毕竟是action game maker,制作动作游戏,大家肯定更希望用手柄游玩,好的手感会对游戏起到非常大的帮助。
之前有在邮箱和Mr.BAZ讨论过一下。
目前AGM里的输入映射 对应摇杆是按键映射,不是真实的摇杆,这导致在映射里设置死区值无论设置多少都是无效的。他不会给摇杆识别的操作带来微妙的变化。这非常不妙。
举例
我只需要轻微推动一点点摇杆就能直接识别到按键触发。无法设置推动多少范围才识别到的死区阔值。
另外一个最糟糕的地方是串键非常严重。只要在摇杆轻微倾斜一点点就会识别到按dwon。
这对动作游戏来讲简直是不可接受的。
我测试了非常多的横版动作游戏,大部分游戏斜下后这个程度才能串键按出dwon,这非常合理且很符合直观感受。
目前AGM的映射摇杆里无法简单实现这个基础功能。于是我想着单独使用GD脚本去完成真实的摇杆操作。
但在过程中遇到很多问题,通常godot里面gd脚本设置摇杆后需要绑定player的底层代码, 但我的player是完全基于vs脚本去制作的。还没找到方法去让角色捆板上摇杆的上下左右移动。这应该如何去执行呢?
自己无法解决,想来这里和大家讨论一下,
在AGM里有没可以让摇杆真实适配的方法。这对动作游戏来讲实在太重要了。
S.C
2
附上 gd设置的摇杆代码。 系统后台可以识别到摇杆的存在。但如何绑定在player的操作映射上又是另一回事了。而且不知道绑定后是否也会和AGM默认那样被当做按键处理··· 
extends Node
@export var dead_zone:float = 0.08
@export var diagonal_threshold:float = 0.5
var joy_id:int = -1
func _ready():
_scan_joypad()
func _scan_joypad():
var joy_list = Input.get_connected_joypads()
if not joy_list.is_empty():
joy_id = joy_list[0]
func _process(_delta):
if joy_id == -1:
_scan_joypad()
return
var raw_x = Input.get_joy_axis(joy_id, 0)
var raw_y = Input.get_joy_axis(joy_id, 1)
var stick_vec = Vector2(raw_x, raw_y)
# 每帧全部松开
Input.action_release("UP")
Input.action_release("DOWN")
Input.action_release("LEFT")
Input.action_release("RIGHT")
if stick_vec.length() < dead_zone:
return
var normal = stick_vec.normalized()
var strength = stick_vec.length()
if strength >= diagonal_threshold:
if abs(normal.y) > abs(normal.x):
if normal.y < 0:
Input.action_press("UP", true)
else:
Input.action_press("DOWN", true)
else:
if normal.x < 0:
Input.action_press("LEFT", true)
else:
Input.action_press("RIGHT", true)
func bind_joy_device(target_id:int):
joy_id = target_id