Untitled
unknown
plain_text
a year ago
3.4 kB
4
Indexable
extends Node2D @export var coin_scene: PackedScene @export var min_impulse: float = 100.0 # Minimum impulse strength @export var max_impulse: float = 180.0 # Maximum impulse strength @export var linear_damp: float = 1.0 # Damping for linear velocity @export var angular_damp: float = 1.0 # Damping for angular velocity @export var body: Node2D @export var bounciness: float = 0.6 # Bounciness for the coins @export var gravity_scale: float = 1 # Reduced gravity scale @export var stop_time: float = 0.25 # Time after which coins stop moving @onready var target_position: Vector2 var number_of_coins = 5 func _ready(): target_position = body.global_position await get_tree().create_timer(1).timeout body.queue_free() emit_coins() func emit_coins(): for i in range(number_of_coins): var coin = coin_scene.instantiate() as RigidBody2D coin.global_position = target_position add_child(coin) # Enable reduced gravity for the coin coin.gravity_scale = gravity_scale # Apply damping to prevent coins from flying away coin.linear_damp = linear_damp coin.angular_damp = angular_damp # Set bounciness for the coins var physics_material = PhysicsMaterial.new() physics_material.bounce = bounciness coin.physics_material_override = physics_material # Create a random direction vector with an upward component var angle = randf() * TAU # Random angle in radians var direction = Vector2(cos(angle), sin(angle)) + Vector2(0, -1) # Adding upward component direction = direction.normalized() # Normalize to maintain consistent impulse strength var impulse = direction * randf_range(min_impulse, max_impulse) # Apply impulse to scatter the coins coin.apply_central_impulse(impulse) # Add a timer to stop the coin's movement var timer = Timer.new() timer.wait_time = stop_time timer.one_shot = true timer.connect("timeout", Callable(self, "_stop_coin").bind(coin)) add_child(timer) timer.start() func _stop_coin(coin: RigidBody2D): coin.freeze = true _create_bounce_tween(coin) func _create_bounce_tween(coin: RigidBody2D): var initial_pos = coin.position var bounce_height = 7 # Adjust the height of the bounce as needed var bounce_duration = 0.3 # Adjust the duration of the bounce as needed var horizontal_offset = 2 # Small horizontal movement during the bounce # Stagger the start of the tween based on coin's position to create a more natural effect var stagger_delay = initial_pos.distance_to(target_position) * 0.002 # Adjust the factor as needed await get_tree().create_timer(stagger_delay).timeout var tween = get_tree().create_tween() # First bounce with horizontal movement tween.tween_property(coin, "position", initial_pos + Vector2(horizontal_offset, -bounce_height), bounce_duration / 2).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) tween.tween_property(coin, "position", initial_pos + Vector2(horizontal_offset, 0), bounce_duration / 2).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN) # Second smaller bounce with horizontal movement tween.tween_property(coin, "position", initial_pos + Vector2(horizontal_offset * 2, -bounce_height / 2), bounce_duration / 2).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) tween.tween_property(coin, "position", initial_pos + Vector2(horizontal_offset * 2, 0), bounce_duration / 2).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
Editor is loading...
Leave a Comment