Yannik Brändle - WS25/26
TH Bingen
Tween ist ein Weg eine Animation via code zu
machen
tween_propertytween_callbacktween_methodtween_intervaltween_property
Interpoliert eine property von einem
inital_value zu einem final_value in
duration Sekunden.
tween_callbackRuft eine Methode auf.
(nützlich um an Punkten im tween eine Methode zu triggern)
tween_method
Mischung aus den ersten beiden (from to in
duration), ruft dafür aber eine Methode auf und ändert
nicht direkt eine property.
tween_interval
Wartet duration Sekunden. (einfach ein delay im tween)
In gdscript:
const DURATION:float = 2
const TARGETS: Array[Vector2] = [Vector2(0,0), Vector2(100,100), Vector2(-150, 230)]
var target_counter = 1
var speed: float = 0
func _ready():
# calculate initial speed
speed = global_position.distance_to(TARGETS[target_counter]) / DURATION
func _physics_process(delta):
# move towards target
global_position = global_position.move_toward(TARGETS[target_counter], speed * delta)
# check if at target
if global_position.is_equal_approx(TARGETS[target_counter]):
# increment and loop counter
target_counter = (target_counter + 1) % TARGETS.size()
# calculate speed needed to finish path in exactly DURATION seconds
speed = global_position.distance_to(TARGETS[target_counter]) / DURATION
Das gleiche geht mit einem simplen tween!
func _ready():
var duration: float = 2
var tween = create_tween()
tween.tween_property(self, "global_position", Vector2(100, 100), duration)
tween.tween_property(self, "global_position", Vector2(-150, 230), duration)
tween.tween_property(self, "global_position", Vector2.ZERO, duration)
tween.set_loops()
Erweitertes Beispiel
Beliebig viele tweens pro Node!
func _ready():
var duration: float = 2
var tween = create_tween()
tween.tween_property(self, "global_position", Vector2(100, 100), duration)
tween.tween_property(self, "global_position", Vector2(-150, 230), duration)
tween.parallel()
tween.tween_property(self,"rotation_degrees", 180, duration)
tween.tween_property(self, "global_position", Vector2.ZERO, duration)
tween.parallel()
tween.tween_property(self,"rotation_degrees", 0, duration)
tween.set_loops()
var other_tween = create_tween()
other_tween.set_trans(Tween.TRANS_ELASTIC)
other_tween.set_ease(Tween.EASE_OUT)
other_tween.tween_property(self, "scale", Vector2(1.7,0.7), 1.5)
other_tween.tween_property(self, "scale", Vector2(0.8,1.8), 1.5)
other_tween.tween_property(self, "scale", Vector2(1,1), 0.7)
other_tween.tween_interval(1)
other_tween.set_loops(3)
Ease sind vier Variationen der Transition
Verlinkt auf der Tween doc seite von Godot: https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.webp
Demo von QUART Transition mit den 4 Ease Typen
Demo von BOUNCE Transition mit den 4 Ease Typen
Code um die vier Sprites zu tweenen
@export var chars: Array[Sprite2D]
func _ready():
make_tween(chars[0], Tween.TRANS_BOUNCE, Tween.EASE_IN)
make_tween(chars[1], Tween.TRANS_BOUNCE, Tween.EASE_OUT)
make_tween(chars[2], Tween.TRANS_BOUNCE, Tween.EASE_IN_OUT)
make_tween(chars[3], Tween.TRANS_BOUNCE, Tween.EASE_OUT_IN)
func make_tween(node: Node2D, transition_type: Tween.TransitionType, ease_type: Tween.EaseType):
var tween = node.create_tween()
tween.set_trans(transition_type)
tween.set_ease(ease_type)
tween.tween_property(node, "global_position", Vector2.DOWN * 300, 2).as_relative()
tween.tween_interval(1)
tween.tween_property(node, "global_position", Vector2.UP * 300, 2).as_relative()
tween.tween_interval(1)
tween.set_loops()
Demo von LINEAR Transition mit den 4 Ease Typen
Cooler Interaktiver Tween guide (WIP)
https://qaqelol.itch.io/tweens
Video source: https://www.reddit.com/r/godot/comments/1p1lbyw/i_made_an_interactive_tween_guide/
Node2D von CanvasItem
Control node Beziehung
CanvasLayer rendert alle Control und
Node2D children unabhängig von dem Rest der Szene
Node2D und Control node verhalten sich ohne Hilfe gleich
Mit Canvaslayer über Control node
Demo von Anchoring
Typische Positionierungscontainer sind auch vorhanden
Beispiel eines "fertigen" Themes mit Containern
Kann frei unter jedes Canvasitem gehangen werden
class_name BounceInAnim
extends Node
var tween: Tween
@onready var parent: CanvasItem = get_parent()
@export_range(0.1, 3) var duration: float = 0.5
func _ready():
parent.visibility_changed.connect(_on_visibility_changed)
func _on_visibility_changed():
if tween:
tween.kill()
if parent.visible:
var start_scale = parent.scale
parent.scale = Vector2.ONE * 0.001
tween = create_tween()
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_ELASTIC)
tween.tween_property(parent, "scale", start_scale, duration)