TowerGameProto/examples_dd3d/demo_camera_movement.gd

61 lines
1.5 KiB
GDScript3
Raw Normal View History

2025-04-16 22:56:14 +01:00
extends Camera3D
@export var mouse_sensitivity := 0.25
@export var camera_speed := 10.0
@export var camera_speed_fast := 30.0
var btn_clicked := false
const hPI := PI/2
var rot_x := 0.0
var rot_y := 0.0
func _ready():
reset_input_rotation()
func _unhandled_input(event) -> void:
if event is InputEventMouseButton:
btn_clicked = event.pressed
func reset_input_rotation():
rot_x = rotation.y
rot_y = rotation.x
func _input(event) -> void:
if btn_clicked:
if event is InputEventMouseMotion:
if event.button_mask == MOUSE_BUTTON_LEFT:
rot_x += -deg_to_rad(event.relative.x * mouse_sensitivity)
rot_y += -deg_to_rad(event.relative.y * mouse_sensitivity)
rot_y = clamp(rot_y, -hPI, hPI)
transform.basis = Basis()
rotate_object_local(Vector3.UP, rot_x)
rotate_object_local(Vector3.RIGHT, rot_y)
func get_axis(neg : Array[Key], pos : Array[Key]) -> float:
var pressed = func (arr: Array[Key]):
var p: float = 0
for k in arr:
if Input.is_physical_key_pressed(k):
p = 1
break
return p
return pressed.call(pos) - pressed.call(neg)
func _process(delta) -> void:
var motion := Vector2(get_axis([KEY_S], [KEY_W]), get_axis([KEY_A], [KEY_D]))
var lift := get_axis([KEY_Q, KEY_CTRL], [KEY_E, KEY_SPACE])
var speed := camera_speed_fast if Input.is_physical_key_pressed(KEY_SHIFT) else camera_speed
motion = motion.limit_length()
var b := global_transform.basis
var v := (-b.z * motion.x) + (b.x * motion.y) + (b.y * lift)
global_position += v.limit_length() * speed * delta