Godot Version
4.6.stable
Question
im trying to make my falling platform ( LowerLiftComponet.gd ) shake only visually before falling. before i had it shake physically, causing the play to have unpredictable velocity applied when jumping off of the platform in it’s shaking state
i switched over to visual, but now the platform doesnt do anything in falling platform mode, as it works as a lowering platform otherwise
can someone help me figure this out ?
TrackLift.gd
@icon("res://Gfx/Images/Editor/UI/icon_lift.svg")
@tool
extends PathFollow2D
class_name Lift
# ONREADY
@onready var rect = $Platform/CollisionShape2D
@onready var area_rect = $Platform/Area2D/CollisionShape2D
@onready var visible_rect = $Platform/VisibleOnScreenNotifier2D
@onready var interaction = $Platform/Area2D
@onready var sprite_rect = $Platform/NinePatchRect
@onready var platform = $Platform
@onready var origin = global_position
# EXPORTS
@export var enabled = true
@export var persistent = false
@export_range(0.5, 10) var duration = 3.0
@export var reverse = true
@export var size = Vector2(4,2)
@export var preview = false
@export var texture: Texture2D
@export var track: Track2D
@export var varient = false
var toRatio = 1
var on_screen = false
func _ready() -> void:
rect.shape = RectangleShape2D.new()
area_rect.shape = RectangleShape2D.new()
func _physics_process(delta: float) -> void:
visible_rect.global_position = origin
if texture:
sprite_rect.texture = texture
if not rect.shape:
return
var tile_size = size * 8
rect.shape.size = (tile_size)-Vector2(2,0)
area_rect.shape.size = tile_size
sprite_rect.size = tile_size
sprite_rect.position = -tile_size/2
visible_rect.rect.size = tile_size + Vector2(16,16)
visible_rect.rect.position = -tile_size/2 - Vector2(8,8)
on_screen = visible_rect.is_on_screen()
if not get_parent() is Path2D or not enabled:
return
sprite_rect.position = Vector2(
-sprite_rect.size.x/2, -sprite_rect.size.y/2
)
if not Engine.is_editor_hint() or preview:
var seconds = duration*60
progress_ratio = move_toward(progress_ratio, toRatio, 1.0/(seconds))
if progress_ratio == toRatio:
if reverse:
if toRatio == 1:
toRatio = 0
else:
toRatio = 1
else:
progress_ratio = 0
global_position = round(global_position)
else:
progress_ratio = 0
LowerLiftComponet (Works only as a child of a Lift node)
extends Node
@onready var parent: Lift = get_parent()
@onready var platform: CharacterBody2D = parent.find_child("Platform")
@onready var interaction: Area2D = platform.find_child("Area2D")
@onready var origin = platform.global_position
@onready var sprite_rect :NinePatchRect= parent.sprite_rect
@export var fall_speed = 18.7
@export var gravity = 467.4
var check_rule = 0
var fell = false
var player_touched = false
func _ready() -> void:
_secondary_behavior()
func _secondary_behavior():
while parent.varient:
while not player_touched and not fell:
await get_tree().create_timer(0).timeout
var i = 12
var spr_origin = sprite_rect.global_position
while i > 0:
i -= 1
sprite_rect.global_position = spr_origin + shake(Vector2.ZERO)
await get_tree().create_timer(0).timeout
await get_tree().create_timer(0).timeout
sprite_rect.global_position = spr_origin
fell = true
while fell:
await get_tree().create_timer(0).timeout
func _physics_process(delta: float) -> void:
if not parent.on_screen:
if parent.persistent:
return
platform.global_position = origin
platform.velocity = Vector2.ZERO
fell = false
player_touched = false
return
var touched = false
var player: PlayerController = get_overlapping_player_from_feet()
if player and not fell:
if parent.varient:
player_touched = true
else:
touched = true
if parent.varient:
if fell:
platform.velocity.y += gravity * delta
platform.move_and_slide()
return
if touched:
var force = 3.2
if player.y_grounded < 3:
force = 7.5
platform.velocity.y += force
if platform.velocity.y > fall_speed:
platform.velocity.y = fall_speed
check_rule = 24
else:
if check_rule > 0:
check_rule -= 1
else:
platform.velocity.y -= 3.2
if platform.velocity.y < -fall_speed:
platform.velocity.y = -fall_speed
platform.move_and_slide()
if platform.global_position.y < origin.y:
platform.global_position.y = origin.y
platform.velocity.y = 0
platform.global_position.x = origin.x
platform.position.x = round(platform.position.x)
func get_overlapping_player_from_feet() -> PlayerController:
var o = interaction.get_overlapping_areas()
for i in o:
if i.is_in_group("PlayerFeet"):
return i.get_parent()
return
func shake(value: Variant, magnitude = 1):
if value is Vector2:
var v = Vector2.ZERO
v.x = randi_range(-magnitude, magnitude)
v.y = randi_range(-magnitude, magnitude)
return value+v