Topic was automatically imported from the old Question2Answer platform.
Asked By
J-Camilleri
I need to position an area and check for any overlaps. Since it takes some time for the physics to update overlaps how can I know when the update is done and it is safe to call functions such as Area.get_overlapping_areas().
It’s a callback that is called before each physics step at a constant frame rate (60 times per second by default).
I already tried that, it seems to me as it takes more than one frame to update. My code was something like this:
func move_area:
area_to_check.transform = calc_transform()
set_physics_process(true)
func _physics_process(delta):
if area_to_check.get_overlapping_areas().size() > 0
# area overlaps
else
# no overlaps
set_physics_process(false)
With this code it does not work, collisions are not detected. if I remove the set physics process functions it will update but not on the first call, takes a couple of frames.
J-Camilleri | 2019-07-05 07:08
When I had problems scanning an area for viable attack targets (allies rescan area when an enemy dies) in the process or physics_process functions, I was able to overcome it by using timers, and rescan when the timer reaches timeout(), and resets the timer at the same time.
var s_timer = get_node("Scan_Timer")
func _on_Scan_Timer_timeout():
rescan_for_target()
s_timer.start()
func rescan_for_target():
var scan_area = $Detect_Area
var scan_bodies = scan_area.get_overlapping_bodies()
for scan_body in scan_bodies:
if scan_body == self:
continue
if scan_body.has_method("process_UI"): #_hit"):
print ("viable body")
calculate_path()
And then I adjusted the time value for the timer to about 0.03 (about 30 times a second).
func _process(delta):
if Input.is_action_just_pressed(“ui_E”):
if get_overlapping_areas():
if state == CLOSED:
state = OPEN
$AnimationPlayer.play(“Open_door”)
$Sound_door_open.play()
else:
state = CLOSED
$AnimationPlayer.play_backwards(“Open_door”)
$Sound_door_closed.play()
’