broken_seals_roguelike/game/tools/free_look_cam/FreeLookCamera.gd

99 lines
2.4 KiB
GDScript3
Raw Normal View History

2020-07-11 23:36:22 +02:00
extends Camera
const SPEED = 10
const TURN_SENSITIVITY = 0.15
var x_rot : float = 0.0
var y_rot : float = 0.0
var mouse_right_down : bool = false
var input_dir : Vector2 = Vector2()
var key_left : bool = false
var key_right : bool = false
var key_up : bool = false
var key_down : bool = false
var cursor_grabbed : bool = false
var last_cursor_pos : Vector2 = Vector2()
func _physics_process(delta):
process_input(delta)
process_movement(delta)
func process_input(delta: float) -> void:
var key_dir = Vector2()
if key_up:
key_dir.y -= 1
if key_down:
key_dir.y += 1
if key_left:
key_dir.x -= 1
if key_right:
key_dir.x += 1
input_dir = key_dir
if input_dir.length_squared() > 0.1:
input_dir = input_dir.normalized()
func _unhandled_input(event : InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == BUTTON_RIGHT and event.device != -1:
mouse_right_down = event.pressed
if event is InputEventKey:
if event.scancode == KEY_W:
key_up = event.pressed
if event.scancode == KEY_S:
key_down = event.pressed
if event.scancode == KEY_A:
key_left = event.pressed
if event.scancode == KEY_D:
key_right = event.pressed
if event is InputEventMouseMotion and mouse_right_down and event.device != -1:
rotate_delta(-event.relative.x, -event.relative.y)
update_cursor_mode()
func process_movement(delta):
if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1:
var forward = transform.basis.xform(Vector3(0, 0, 1))
var right = forward.cross(Vector3(0, 1, 0)) * -input_dir.x
forward *= input_dir.y #only potentially make it zero after getting the right vector
var dir : Vector3 = forward
dir += right
if dir.length_squared() > 0.1:
dir = dir.normalized()
translation += dir * delta * SPEED
func update_cursor_mode():
if mouse_right_down:
if not cursor_grabbed:
cursor_grabbed = true
last_cursor_pos = get_viewport().get_mouse_position()
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
else:
if cursor_grabbed:
cursor_grabbed = false
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
get_viewport().warp_mouse(last_cursor_pos)
func rotate_delta(x_delta : float, y_delta : float) -> void:
x_rot += y_delta * TURN_SENSITIVITY
y_rot += x_delta * TURN_SENSITIVITY
x_rot = clamp(x_rot, -90, 90)
if y_rot >= 360:
y_rot = 0
if y_rot < 0:
y_rot = 360
rotation_degrees = Vector3(x_rot, y_rot, 0.0)