Compare commits

...

12 Commits

4 changed files with 77 additions and 28 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
# Godot 4+ specific ignores # Godot 4+ specific ignores
.godot/ .godot/
/android/ /android/
.vscode/

View File

@@ -1,2 +1,4 @@
# tween-scroll-test # tween-scroll-test
Simple test of how to create a scrollable/draggable menu similar to Arknights' IS map and many other draggable menus within the game (Operators, Moments, etc.)
Godot 4.5

View File

@@ -1,70 +1,116 @@
extends Control extends Control
# INFO name can be anything, doesn't need to be "SpaceNode"
class_name SpaceNode class_name SpaceNode
var initial_pos: Vector2 # adapted from pc_tile code (project-elysium-main)
var offset: Vector2
var draggable: bool = false var draggable: bool = false
var velocity: float = 0 var velocity: float = 0
# variables for velocity calculation
var mouse_first_location: Vector2 var mouse_first_location: Vector2
var mouse_last_location: Vector2
var mouse_release_location: Vector2 var mouse_release_location: Vector2
var mouse_n_minus_one_location: Vector2
var time_since_first_location: float = -1 var time_since_first_location: float = -1
@export var velocity_coeffecient: int = 500 # Export variables, for ease of setting without going into the code
@export var max_x: int = 1000 ## adjusts how much velocity you want to have on a slide, a higher number = less velocity
@export var velocity_coeffecient: int = 500
## the maximum displacement of the item, to the right
@export var max_x: int = 1000
## the minimum displacement, can be adjusted to accomodate margins
@export var min_x: int = 0 @export var min_x: int = 0
@export var ease_out_time: float = 0.5 ## ease out time for the velocity curve
@export var ease_out_time: float = 0.5
## whether you want the UI to bounce
@export var bounce: bool = false
func _ready() -> void: func _ready() -> void:
draggable = true draggable = true
return return
func _process(delta: float) -> void: func _process(delta: float) -> void:
# Every frame, update the position based upon the velocity
# setting
global_position.x += velocity global_position.x += velocity
# if the current item is being dragged
if draggable: if draggable:
# when the item is first clicked
if (Input.is_action_just_pressed("click")): if (Input.is_action_just_pressed("click")):
mouse_first_location = get_global_mouse_position() mouse_first_location = get_global_mouse_position()
time_since_first_location = 0
# basically a "while" the click is held
if Input.is_action_pressed("click"): if Input.is_action_pressed("click"):
time_since_first_location += delta # update the mouse location
mouse_first_location = get_global_mouse_position()
# then update global position, for mouse tracking
# this is based upon the last location the mouse was, subtracked by the current
# location
global_position.x += -(mouse_last_location.x - mouse_first_location.x)
# when the click is released
elif Input.is_action_just_released("click"): elif Input.is_action_just_released("click"):
time_since_first_location += delta # make note of where the mouse was released
# since we're using a sample of N, N-1 frames, rather than an
# average over N frames, we use the in-built
# `delta` parameter
mouse_release_location = get_global_mouse_position() mouse_release_location = get_global_mouse_position()
# simple if/else to compare which direction to go
if mouse_release_location.x < mouse_first_location.x: if mouse_release_location.x < mouse_first_location.x:
# displacement calc
var distance = mouse_release_location.x - mouse_first_location.x var distance = mouse_release_location.x - mouse_first_location.x
velocity = (distance / velocity = (distance /
(velocity_coeffecient * time_since_first_location)) # velocity coefficient to adjust sensitivity
(velocity_coeffecient * delta))
# update to not draggable, to let tween resolve
draggable = false draggable = false
# other side of the if/else
elif mouse_release_location.x > mouse_first_location.x: elif mouse_release_location.x > mouse_first_location.x:
var distance = abs(mouse_first_location.x var distance = abs(mouse_first_location.x
- mouse_release_location.x) - mouse_release_location.x)
velocity = (distance / velocity = (distance /
(velocity_coeffecient * time_since_first_location)) (velocity_coeffecient * delta))
draggable = false draggable = false
elif not draggable: # when the drag is complete, create a tween to ease out towards zero
var tween = get_tree().create_tween() var tween = get_tree().create_tween()
tween.tween_property(self, "velocity", 0, ease_out_time).set_ease(Tween.EASE_OUT)
mouse_first_location = Vector2(0,0) # ease out the velocity value to zero.
mouse_release_location = Vector2(0,0) tween.tween_property(self, "velocity",
draggable = true 0, ease_out_time).set_ease(Tween.EASE_OUT)
if global_position.x > max_x: # reset location values
push_warning("too far to the pos_x") mouse_first_location = Vector2(0,0)
velocity = 0 mouse_release_location = Vector2(0,0)
global_position.x = 999
# able to be dragged again
draggable = true
# if/else to handle reaching the "end" of the canvas
# as notated by max_x and min_x (see export vars)
if global_position.x >= max_x && velocity > 0:
if bounce:
# if bounce is enable, half the velocity and negate it
velocity = -(velocity)/2
print("velocity negated, bouncing")
# set the position to be within the right bounds
global_position.x = max_x - 1
time_since_first_location = -1 time_since_first_location = -1
# draggable again, possibly redundant
draggable = true draggable = true
return return
elif global_position.x < min_x: elif global_position.x < min_x && velocity < 0:
push_warning("too far to the neg_y") if bounce:
velocity = 0 velocity = -(velocity)/2
global_position.x = 1 print("velocity negated, bouncing")
global_position.x = min_x + 1
time_since_first_location = -1 time_since_first_location = -1
draggable = true draggable = true
return return
# finally, update the last known position of the mouse
mouse_last_location = get_global_mouse_position()

View File

@@ -23,4 +23,4 @@ offset_top = 299.0
offset_right = 455.0 offset_right = 455.0
offset_bottom = 299.0 offset_bottom = 299.0
script = ExtResource("2_mej84") script = ExtResource("2_mej84")
velocity_coeffecient = 735 velocity_coeffecient = 110