64 lines
1.7 KiB
GDScript
64 lines
1.7 KiB
GDScript
extends Camera3D
|
|
|
|
|
|
const SCREEN_MARGIN : int = 15
|
|
const SCREEN_MOVEMENT_SPEED : float = .08
|
|
|
|
@export var curve : Curve
|
|
var shouldMove : bool = true
|
|
|
|
|
|
func _ready() -> void:
|
|
curve.bake()
|
|
rotation.x = deg_to_rad(curve.min_value)
|
|
position.y = curve.max_domain
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
if not shouldMove:
|
|
return
|
|
|
|
var windowSize : Vector2i = get_window().size
|
|
var mousePosition : Vector2 = get_viewport().get_mouse_position()
|
|
|
|
if mousePosition.x < SCREEN_MARGIN:
|
|
position.x -= SCREEN_MOVEMENT_SPEED
|
|
elif mousePosition.x > windowSize.x - SCREEN_MARGIN:
|
|
position.x += SCREEN_MOVEMENT_SPEED
|
|
if mousePosition.y < SCREEN_MARGIN:
|
|
position.z -= SCREEN_MOVEMENT_SPEED
|
|
elif mousePosition.y > windowSize.y - SCREEN_MARGIN:
|
|
position.z += SCREEN_MOVEMENT_SPEED
|
|
|
|
|
|
func _notification(what: int) -> void:
|
|
match what:
|
|
NOTIFICATION_WM_MOUSE_ENTER: shouldMove = true
|
|
NOTIFICATION_WM_MOUSE_EXIT: shouldMove = false
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event is InputEventMouseButton:
|
|
onEventMouseButton(event)
|
|
elif event is InputEventKey:
|
|
onEventKey(event)
|
|
|
|
|
|
func onEventMouseButton(event: InputEventMouseButton) -> void:
|
|
var newPosition : float = position.y
|
|
match event.button_index:
|
|
MOUSE_BUTTON_WHEEL_UP: newPosition -= .2
|
|
MOUSE_BUTTON_WHEEL_DOWN: newPosition += .2
|
|
|
|
newPosition = clampf(newPosition, curve.min_domain, curve.max_domain)
|
|
|
|
rotation.x = deg_to_rad(curve.sample(newPosition))
|
|
position.y = newPosition
|
|
|
|
|
|
func onEventKey(event: InputEventKey) -> void:
|
|
match event.keycode:
|
|
KEY_LEFT: position.x -= SCREEN_MOVEMENT_SPEED * 4
|
|
KEY_RIGHT: position.x += SCREEN_MOVEMENT_SPEED * 4
|
|
KEY_UP: position.z -= SCREEN_MOVEMENT_SPEED * 4
|
|
KEY_DOWN: position.z += SCREEN_MOVEMENT_SPEED * 4
|