Ввод: действия на физические клавиши (работает в любой раскладке)

W/A/S/D и стрелки, Пробел, Shift, C, Q — действия InputMap (move_*, jump, sprint,
crouch, dash). Игрок использует их вместо is_key_pressed(KEY_*): на русской раскладке
символ на клавише другой, а физическая клавиша та же. Сенсорные кнопки смогут
нажимать те же действия.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-27 17:39:05 +05:00
co-authored by Claude Sonnet 5.5
parent ed4ee86c8e
commit 307c62b62e
2 changed files with 48 additions and 22 deletions
+13 -22
View File
@@ -242,11 +242,10 @@ func _unhandled_input(event: InputEvent) -> void:
head.rotate_x(-event.relative.y * MOUSE_SENSITIVITY * zoom_factor) head.rotate_x(-event.relative.y * MOUSE_SENSITIVITY * zoom_factor)
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-80), deg_to_rad(80)) head.rotation.x = clamp(head.rotation.x, deg_to_rad(-80), deg_to_rad(80))
if event is InputEventKey and event.pressed and not event.echo: if event.is_action_pressed("crouch"):
if event.keycode == KEY_C: _try_start_slide() # Подкат: бег (sprint) + crouch
_try_start_slide() # Подкат: бег (Shift) + C elif event.is_action_pressed("dash"):
elif event.keycode == KEY_Q: _try_dash()
_try_dash() # Рывок
# Битовые флаги состояния для сетевой синхронизации (см. Net.FLAG_*) # Битовые флаги состояния для сетевой синхронизации (см. Net.FLAG_*)
func get_net_flags() -> int: func get_net_flags() -> int:
@@ -258,16 +257,8 @@ func get_net_flags() -> int:
return flags return flags
func _get_input_dir() -> Vector2: func _get_input_dir() -> Vector2:
var input_dir := Vector2.ZERO # Действия привязаны к физическим клавишам (работает в любой раскладке); у них же — сенсорные кнопки
if Input.is_key_pressed(KEY_D): return Input.get_vector("move_left", "move_right", "move_forward", "move_back")
input_dir.x += 1
if Input.is_key_pressed(KEY_A):
input_dir.x -= 1
if Input.is_key_pressed(KEY_S):
input_dir.y += 1
if Input.is_key_pressed(KEY_W):
input_dir.y -= 1
return input_dir.normalized()
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
if is_dead: if is_dead:
@@ -278,7 +269,7 @@ func _physics_process(delta: float) -> void:
dash_cooldown_timer = maxf(dash_cooldown_timer - delta, 0.0) dash_cooldown_timer = maxf(dash_cooldown_timer - delta, 0.0)
wallrun_cooldown_timer = maxf(wallrun_cooldown_timer - delta, 0.0) wallrun_cooldown_timer = maxf(wallrun_cooldown_timer - delta, 0.0)
var space_down := Input.is_key_pressed(KEY_SPACE) var space_down := Input.is_action_pressed("jump")
_update_crouch() _update_crouch()
@@ -369,12 +360,12 @@ func _physics_process(delta: float) -> void:
var current_speed := WALK_SPEED var current_speed := WALK_SPEED
if is_crouching: if is_crouching:
current_speed = CROUCH_WALK_SPEED current_speed = CROUCH_WALK_SPEED
elif Input.is_key_pressed(KEY_SHIFT): elif Input.is_action_pressed("sprint"):
current_speed = SPRINT_SPEED current_speed = SPRINT_SPEED
# 4. Бег по стене # 4. Бег по стене
if not is_wallrunning and not is_on_floor() and not is_sliding \ if not is_wallrunning and not is_on_floor() and not is_sliding \
and wallrun_cooldown_timer <= 0.0 and Input.is_key_pressed(KEY_W): and wallrun_cooldown_timer <= 0.0 and Input.is_action_pressed("move_forward"):
_try_start_wallrun() _try_start_wallrun()
if is_wallrunning: if is_wallrunning:
_process_wallrun(delta) _process_wallrun(delta)
@@ -565,7 +556,7 @@ func _process_wallrun(delta: float) -> void:
var horiz := Vector3(velocity.x, 0, velocity.z) var horiz := Vector3(velocity.x, 0, velocity.z)
if hit.is_empty() or wallrun_timer <= 0.0 or is_on_floor() \ if hit.is_empty() or wallrun_timer <= 0.0 or is_on_floor() \
or not Input.is_key_pressed(KEY_W) \ or not Input.is_action_pressed("move_forward") \
or horiz.length() < WALLRUN_MIN_SPEED * 0.6: or horiz.length() < WALLRUN_MIN_SPEED * 0.6:
_end_wallrun() _end_wallrun()
return return
@@ -716,7 +707,7 @@ func _try_start_slide() -> void:
return return
if not is_on_floor(): if not is_on_floor():
return return
if not Input.is_key_pressed(KEY_SHIFT): if not Input.is_action_pressed("sprint"):
return return
var horizontal := Vector3(velocity.x, 0, velocity.z) var horizontal := Vector3(velocity.x, 0, velocity.z)
@@ -760,10 +751,10 @@ func _process_slide(delta: float, direction: Vector3, horizontal: Vector3) -> Ve
func _update_crouch() -> void: func _update_crouch() -> void:
var busy := is_sliding or is_dashing or is_wallrunning or is_mantling or not is_on_floor() var busy := is_sliding or is_dashing or is_wallrunning or is_mantling or not is_on_floor()
if not is_crouching: if not is_crouching:
if Input.is_key_pressed(KEY_C) and not busy: if Input.is_action_pressed("crouch") and not busy:
is_crouching = true is_crouching = true
_set_collider_crouched(true) _set_collider_crouched(true)
elif (busy or not Input.is_key_pressed(KEY_C)) and (is_sliding or _can_stand()): elif (busy or not Input.is_action_pressed("crouch")) and (is_sliding or _can_stand()):
_end_crouch() _end_crouch()
func _end_crouch() -> void: func _end_crouch() -> void:
+35
View File
@@ -25,6 +25,41 @@ MapLoader="*res://World/map_loader.gd"
window/stretch/mode="canvas_items" window/stretch/mode="canvas_items"
window/stretch/aspect="expand" window/stretch/aspect="expand"
[input]
move_forward={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null), Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
move_back={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null), Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
move_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null), Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
move_right={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null), Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
jump={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
sprint={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
crouch={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
dash={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)]
}
[physics] [physics]
3d/physics_engine="Jolt Physics" 3d/physics_engine="Jolt Physics"