46 lines
1.4 KiB
GDScript
46 lines
1.4 KiB
GDScript
extends CharacterBody2D
|
|
|
|
var friction = 8.0 # Lower values make the slowdown more gradual
|
|
var is_collected = false
|
|
var bounceTimer = 0.0
|
|
var timeBeforePickup = 0.8
|
|
|
|
# Z-axis variables
|
|
var positionZ = 4.0 # Start slightly in the air
|
|
var velocityZ = 10.0 # Initial upward velocity
|
|
var accelerationZ = -300.0 # Gravity
|
|
var bounceRestitution = 0.6 # How much bounce energy is retained (0-1)
|
|
var minBounceVelocity = 40.0 # Minimum velocity needed to bounce
|
|
var bloodTime = 2.0
|
|
func _process(delta: float) -> void:
|
|
# Update vertical movement
|
|
velocityZ += accelerationZ * delta
|
|
positionZ += velocityZ * delta
|
|
|
|
# Ground collision and bounce
|
|
if positionZ <= 0:
|
|
velocity = velocity.lerp(Vector2.ZERO, 1.0 - exp(-friction * delta)) # only slow down if on floor
|
|
positionZ = 0
|
|
velocityZ = 0
|
|
if bloodTime <= 0.0:
|
|
var fade_tween = create_tween()
|
|
fade_tween.set_trans(Tween.TRANS_CUBIC)
|
|
fade_tween.set_ease(Tween.EASE_OUT)
|
|
fade_tween.tween_property($Sprite2D, "modulate:a", 0.0, 0.5)
|
|
await fade_tween.finished
|
|
call_deferred("queue_free")
|
|
bloodTime -= delta
|
|
|
|
|
|
update_sprite_scale()
|
|
move_and_slide()
|
|
|
|
func update_sprite_scale() -> void:
|
|
# Calculate scale based on height
|
|
# Maximum height will have scale 1.3, ground will have scale 1.0
|
|
var height_factor = positionZ / 50.0 # Assuming 20 is max height
|
|
var posY = 0.0 + (2 * positionZ)
|
|
var sc = 1.0 + (0.8 * height_factor)
|
|
$Sprite2D.scale = Vector2(sc, sc)
|
|
$Sprite2D.position.y = -posY
|