instancing a ball in my pong game

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By JakeCarbine

Hello I am working on a pong game in godot. Everything is going well so far but I recieve this error in my debugger: E 0:01:55.112 body_set_shape_as_one_way_collision: Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead. <C++ Error> Condition "body->get_space() && flushing_queries" is true. <C++ Source> servers/physics_2d/physics_2d_server_sw.cpp:739 @ body_set_shape_as_one_way_collision() @ _on_Area2D_body_entered()

here is my code for instancing a duplicate ball:

extends Node2D

var collect = false
var ballscene = null

func _ready():

func _on_Area2D_body_entered(body):
        collect = true
        var ball =  load("res://Scenes/BallDuplicate.tscn")
        ballscene = ball.instance()

yes I instance the ball in the power up and not my spawn manager.

:bust_in_silhouette: Reply From: Inces

Thats just a thing with physics server, it is often busy with querries and will have troubles doing some operations at the moment of collisions. You should get used to calling deferred, just as this error suggests. So instead of add_child(ballscene) You will need to call_deferred(“add_child”,ballscene).

Thanks! This fixed the exact same problem I was having. Do you recommend to always add children in deferred mode? Seems like the sensible thing to do.

raadhuis | 2022-07-10 05:57

I suggest using deferred calls only when console error demands it :slight_smile:
If physicsserver has no problem, than it is better to resolve your actions in exact frames they were called, otherwise You may eventually encounter small bugs due to timing of code resolve. In short, non-deferred calls are more predictable, making debugging a bit easier.

Inces | 2022-07-10 06:18