# {py:mod}`simvx.core.physics.nodes2d` ```{py:module} simvx.core.physics.nodes2d ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d :allowtitles: ``` ## Module Contents ### Classes ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`Contact2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D :summary: ``` * - {py:obj}`CollisionShape2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.CollisionShape2D :summary: ``` * - {py:obj}`PhysicsBody2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D :summary: ``` * - {py:obj}`CharacterBody2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D :summary: ``` * - {py:obj}`Area2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D :summary: ``` * - {py:obj}`GravityArea2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D :summary: ``` * - {py:obj}`Joint2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.Joint2D :summary: ``` * - {py:obj}`FixedJoint2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.FixedJoint2D :summary: ``` * - {py:obj}`PinJoint2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.PinJoint2D :summary: ``` * - {py:obj}`HingeJoint2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.HingeJoint2D :summary: ``` * - {py:obj}`SpringJoint2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.SpringJoint2D :summary: ``` * - {py:obj}`GrooveJoint2D ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.GrooveJoint2D :summary: ``` ```` ### Data ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`log ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.log :summary: ``` * - {py:obj}`__all__ ` - ```{autodoc2-docstring} simvx.core.physics.nodes2d.__all__ :summary: ``` ```` ### API ````{py:data} log :canonical: simvx.core.physics.nodes2d.log :value: > 'getLogger(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.log ``` ```` ````{py:data} __all__ :canonical: simvx.core.physics.nodes2d.__all__ :value: > ['BodyMode', 'Contact2D', 'CollisionShape2D', 'PhysicsBody2D', 'CharacterBody2D', 'Area2D', 'Gravity... ```{autodoc2-docstring} simvx.core.physics.nodes2d.__all__ ``` ```` `````{py:class} Contact2D :canonical: simvx.core.physics.nodes2d.Contact2D ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D ``` ````{py:attribute} other :canonical: simvx.core.physics.nodes2d.Contact2D.other :type: PhysicsBody2D :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D.other ``` ```` ````{py:attribute} point :canonical: simvx.core.physics.nodes2d.Contact2D.point :type: simvx.core.math.Vec2 :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D.point ``` ```` ````{py:attribute} normal :canonical: simvx.core.physics.nodes2d.Contact2D.normal :type: simvx.core.math.Vec2 :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D.normal ``` ```` ````{py:attribute} impulse :canonical: simvx.core.physics.nodes2d.Contact2D.impulse :type: float :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D.impulse ``` ```` ````{py:attribute} velocity :canonical: simvx.core.physics.nodes2d.Contact2D.velocity :type: simvx.core.math.Vec2 :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Contact2D.velocity ``` ```` ````` `````{py:class} CollisionShape2D(**kwargs) :canonical: simvx.core.physics.nodes2d.CollisionShape2D Bases: {py:obj}`simvx.core.nodes_2d.node2d.Node2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.CollisionShape2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.CollisionShape2D.__init__ ``` ````{py:attribute} shape :canonical: simvx.core.physics.nodes2d.CollisionShape2D.shape :type: simvx.core.physics.shapes2d.Shape2D :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CollisionShape2D.shape ``` ```` ````{py:method} build_shape(world: simvx.core.physics.world2d.Physics2DWorld) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.nodes2d.CollisionShape2D.build_shape ```{autodoc2-docstring} simvx.core.physics.nodes2d.CollisionShape2D.build_shape ``` ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.CollisionShape2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.CollisionShape2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.CollisionShape2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.CollisionShape2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.CollisionShape2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.CollisionShape2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.CollisionShape2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.CollisionShape2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.CollisionShape2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.CollisionShape2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.CollisionShape2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.CollisionShape2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.CollisionShape2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.CollisionShape2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.CollisionShape2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.CollisionShape2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.CollisionShape2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.CollisionShape2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.CollisionShape2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.CollisionShape2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.CollisionShape2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.CollisionShape2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.CollisionShape2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.CollisionShape2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.CollisionShape2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.CollisionShape2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.CollisionShape2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.CollisionShape2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.CollisionShape2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_ready ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_exit_tree ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.CollisionShape2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.CollisionShape2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.CollisionShape2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.CollisionShape2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.CollisionShape2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.CollisionShape2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.CollisionShape2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.CollisionShape2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.CollisionShape2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.CollisionShape2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.CollisionShape2D.__repr__ ```` ````` `````{py:class} PhysicsBody2D(**kwargs: object) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D Bases: {py:obj}`simvx.core.nodes_2d.node2d.Node2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.__init__ ``` ````{py:attribute} mode :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.mode :type: simvx.core.physics.world2d.BodyMode :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.mode ``` ```` ````{py:attribute} mass :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.mass :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.mass ``` ```` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.collision_layer :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.collision_layer ``` ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.collision_mask :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.collision_mask ``` ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.shape :type: simvx.core.physics.shapes2d.Shape2D | None :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.shape ``` ```` ````{py:attribute} material :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.material :type: simvx.core.physics.material.PhysicsMaterial :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.material ``` ```` ````{py:attribute} continuous :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.continuous :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.continuous ``` ```` ````{py:attribute} one_way :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.one_way :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.one_way ``` ```` ````{py:attribute} one_way_normal :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.one_way_normal :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.one_way_normal ``` ```` ````{py:attribute} collided :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.collided :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.collided ``` ```` ````{py:attribute} separated :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.separated :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.separated ``` ```` ````{py:property} handle :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.handle :type: simvx.core.physics.world2d.BodyHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.handle ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.world ``` ```` ````{py:property} is_sleeping :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.is_sleeping :type: bool ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.is_sleeping ``` ```` ````{py:property} velocity :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.velocity :type: simvx.core.math.Vec2 ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.velocity ``` ```` ````{py:property} spin :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.spin :type: float ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.spin ``` ```` ````{py:method} push(impulse: simvx.core.math.Vec2 | collections.abc.Sequence[float], *, at: simvx.core.math.Vec2 | collections.abc.Sequence[float] | None = None) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.push ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.push ``` ```` ````{py:method} spin_up(angular_impulse: float) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.spin_up ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.spin_up ``` ```` ````{py:method} add_force(force: simvx.core.math.Vec2 | collections.abc.Sequence[float], *, at: simvx.core.math.Vec2 | collections.abc.Sequence[float] | None = None) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.add_force ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.add_force ``` ```` ````{py:method} add_torque(torque: float) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.add_torque ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.add_torque ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_enter_tree ```` ````{py:method} move_and_collide(velocity: simvx.core.math.Vec2 | collections.abc.Sequence[float], dt: float = 1.0) -> simvx.core.physics.nodes2d.Contact2D | None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.move_and_collide ```{autodoc2-docstring} simvx.core.physics.nodes2d.PhysicsBody2D.move_and_collide ``` ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.PhysicsBody2D.__repr__ ```` ````` `````{py:class} CharacterBody2D(**kwargs: object) :canonical: simvx.core.physics.nodes2d.CharacterBody2D Bases: {py:obj}`simvx.core.nodes_2d.node2d.Node2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.__init__ ``` ````{py:attribute} slope_limit :canonical: simvx.core.physics.nodes2d.CharacterBody2D.slope_limit :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.slope_limit ``` ```` ````{py:attribute} step_height :canonical: simvx.core.physics.nodes2d.CharacterBody2D.step_height :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.step_height ``` ```` ````{py:attribute} max_slides :canonical: simvx.core.physics.nodes2d.CharacterBody2D.max_slides :type: int :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.max_slides ``` ```` ````{py:attribute} skin_width :canonical: simvx.core.physics.nodes2d.CharacterBody2D.skin_width :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.skin_width ``` ```` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes2d.CharacterBody2D.collision_layer :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.collision_layer ``` ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes2d.CharacterBody2D.collision_mask :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.collision_mask ``` ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes2d.CharacterBody2D.shape :type: simvx.core.physics.shapes2d.Shape2D | None :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.shape ``` ```` ````{py:property} character :canonical: simvx.core.physics.nodes2d.CharacterBody2D.character :type: simvx.core.physics.world2d.CharacterHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.character ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.CharacterBody2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.world ``` ```` ````{py:method} is_on_floor() -> bool :canonical: simvx.core.physics.nodes2d.CharacterBody2D.is_on_floor ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.is_on_floor ``` ```` ````{py:method} is_on_wall() -> bool :canonical: simvx.core.physics.nodes2d.CharacterBody2D.is_on_wall ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.is_on_wall ``` ```` ````{py:method} is_on_ceiling() -> bool :canonical: simvx.core.physics.nodes2d.CharacterBody2D.is_on_ceiling ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.is_on_ceiling ``` ```` ````{py:method} move_and_slide(dt: float) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.move_and_slide ```{autodoc2-docstring} simvx.core.physics.nodes2d.CharacterBody2D.move_and_slide ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.CharacterBody2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.CharacterBody2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.CharacterBody2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.CharacterBody2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.CharacterBody2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.CharacterBody2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.CharacterBody2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.CharacterBody2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.CharacterBody2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.CharacterBody2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.CharacterBody2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.CharacterBody2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.CharacterBody2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.CharacterBody2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.CharacterBody2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.CharacterBody2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.CharacterBody2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.CharacterBody2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.CharacterBody2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.CharacterBody2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.CharacterBody2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.CharacterBody2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.CharacterBody2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.CharacterBody2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.CharacterBody2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.CharacterBody2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.CharacterBody2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.CharacterBody2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.CharacterBody2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.CharacterBody2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.CharacterBody2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.CharacterBody2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.CharacterBody2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.CharacterBody2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.CharacterBody2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.CharacterBody2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.CharacterBody2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.CharacterBody2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.CharacterBody2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.CharacterBody2D.__repr__ ```` ````` `````{py:class} Area2D(**kwargs: object) :canonical: simvx.core.physics.nodes2d.Area2D Bases: {py:obj}`simvx.core.nodes_2d.node2d.Node2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.__init__ ``` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes2d.Area2D.collision_layer :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.collision_layer ``` ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes2d.Area2D.collision_mask :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.collision_mask ``` ```` ````{py:attribute} monitoring :canonical: simvx.core.physics.nodes2d.Area2D.monitoring :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.monitoring ``` ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes2d.Area2D.shape :type: simvx.core.physics.shapes2d.Shape2D | None :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.shape ``` ```` ````{py:attribute} body_entered :canonical: simvx.core.physics.nodes2d.Area2D.body_entered :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.body_entered ``` ```` ````{py:attribute} body_exited :canonical: simvx.core.physics.nodes2d.Area2D.body_exited :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.body_exited ``` ```` ````{py:attribute} area_entered :canonical: simvx.core.physics.nodes2d.Area2D.area_entered :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.area_entered ``` ```` ````{py:attribute} area_exited :canonical: simvx.core.physics.nodes2d.Area2D.area_exited :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.area_exited ``` ```` ````{py:property} handle :canonical: simvx.core.physics.nodes2d.Area2D.handle :type: simvx.core.physics.world2d.BodyHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.handle ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.Area2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.world ``` ```` ````{py:method} get_overlapping_bodies(*, group: str | None = None, type: simvx.core.physics.nodes2d.Area2D.get_overlapping_bodies.type[simvx.core.physics.nodes2d.PhysicsBody2D] | None = None) -> list[simvx.core.physics.nodes2d.PhysicsBody2D] :canonical: simvx.core.physics.nodes2d.Area2D.get_overlapping_bodies ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.get_overlapping_bodies ``` ```` ````{py:method} get_overlapping_areas() -> list[simvx.core.physics.nodes2d.Area2D] :canonical: simvx.core.physics.nodes2d.Area2D.get_overlapping_areas ```{autodoc2-docstring} simvx.core.physics.nodes2d.Area2D.get_overlapping_areas ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.Area2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.Area2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.Area2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.Area2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.Area2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.Area2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.Area2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.Area2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.Area2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.Area2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.Area2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.Area2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.Area2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.Area2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.Area2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.Area2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.Area2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.Area2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.Area2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.Area2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.Area2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.Area2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.Area2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.Area2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.Area2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.Area2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.Area2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.Area2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.Area2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.Area2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.Area2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.Area2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.Area2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.Area2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.Area2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.Area2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.Area2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.Area2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.Area2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.Area2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.Area2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.Area2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.Area2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.Area2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.Area2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.Area2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.Area2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.Area2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.Area2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.Area2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.Area2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.Area2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.Area2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.Area2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.Area2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.Area2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.Area2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.Area2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.Area2D.__repr__ ```` ````` `````{py:class} GravityArea2D(**kwargs: object) :canonical: simvx.core.physics.nodes2d.GravityArea2D Bases: {py:obj}`simvx.core.physics.nodes2d.Area2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D.__init__ ``` ````{py:attribute} gravity :canonical: simvx.core.physics.nodes2d.GravityArea2D.gravity :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D.gravity ``` ```` ````{py:attribute} point_gravity :canonical: simvx.core.physics.nodes2d.GravityArea2D.point_gravity :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D.point_gravity ``` ```` ````{py:attribute} point_strength :canonical: simvx.core.physics.nodes2d.GravityArea2D.point_strength :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D.point_strength ``` ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_fixed_update ```{autodoc2-docstring} simvx.core.physics.nodes2d.GravityArea2D.on_fixed_update ``` ```` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes2d.GravityArea2D.collision_layer :type: int :value: > 'Bitmask(...)' ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes2d.GravityArea2D.collision_mask :type: int :value: > 'Bitmask(...)' ```` ````{py:attribute} monitoring :canonical: simvx.core.physics.nodes2d.GravityArea2D.monitoring :type: bool :value: > 'Property(...)' ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes2d.GravityArea2D.shape :type: simvx.core.physics.shapes2d.Shape2D | None :value: > 'Property(...)' ```` ````{py:attribute} body_entered :canonical: simvx.core.physics.nodes2d.GravityArea2D.body_entered :value: > 'Signal(...)' ```` ````{py:attribute} body_exited :canonical: simvx.core.physics.nodes2d.GravityArea2D.body_exited :value: > 'Signal(...)' ```` ````{py:attribute} area_entered :canonical: simvx.core.physics.nodes2d.GravityArea2D.area_entered :value: > 'Signal(...)' ```` ````{py:attribute} area_exited :canonical: simvx.core.physics.nodes2d.GravityArea2D.area_exited :value: > 'Signal(...)' ```` ````{py:property} handle :canonical: simvx.core.physics.nodes2d.GravityArea2D.handle :type: simvx.core.physics.world2d.BodyHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.GravityArea2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```` ````{py:method} get_overlapping_bodies(*, group: str | None = None, type: simvx.core.physics.nodes2d.Area2D.get_overlapping_bodies.type[simvx.core.physics.nodes2d.PhysicsBody2D] | None = None) -> list[simvx.core.physics.nodes2d.PhysicsBody2D] :canonical: simvx.core.physics.nodes2d.GravityArea2D.get_overlapping_bodies ```` ````{py:method} get_overlapping_areas() -> list[simvx.core.physics.nodes2d.Area2D] :canonical: simvx.core.physics.nodes2d.GravityArea2D.get_overlapping_areas ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.GravityArea2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.GravityArea2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.GravityArea2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.GravityArea2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.GravityArea2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.GravityArea2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.GravityArea2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.GravityArea2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.GravityArea2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.GravityArea2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.GravityArea2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.GravityArea2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.GravityArea2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.GravityArea2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.GravityArea2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.GravityArea2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.GravityArea2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.GravityArea2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.GravityArea2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.GravityArea2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.GravityArea2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.GravityArea2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.GravityArea2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.GravityArea2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.GravityArea2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.GravityArea2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.GravityArea2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.GravityArea2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.GravityArea2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.GravityArea2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.GravityArea2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.GravityArea2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.GravityArea2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.GravityArea2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.GravityArea2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.GravityArea2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.GravityArea2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.GravityArea2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.GravityArea2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.GravityArea2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.GravityArea2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.GravityArea2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.GravityArea2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.GravityArea2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.GravityArea2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.GravityArea2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.GravityArea2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.GravityArea2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.GravityArea2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.GravityArea2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.GravityArea2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.GravityArea2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.GravityArea2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.GravityArea2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.GravityArea2D.__repr__ ```` ````` `````{py:class} Joint2D(*, body_a: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, body_b: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes2d.Joint2D Bases: {py:obj}`simvx.core.nodes_2d.node2d.Node2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.Joint2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.Joint2D.__init__ ``` ````{py:property} joint :canonical: simvx.core.physics.nodes2d.Joint2D.joint :type: simvx.core.physics.world2d.JointHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Joint2D.joint ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.Joint2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes2d.Joint2D.world ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.Joint2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.Joint2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.Joint2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.Joint2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.Joint2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.Joint2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.Joint2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.Joint2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.Joint2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.Joint2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.Joint2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.Joint2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.Joint2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.Joint2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.Joint2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.Joint2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.Joint2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.Joint2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.Joint2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.Joint2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.Joint2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.Joint2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.Joint2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.Joint2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.Joint2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.Joint2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.Joint2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.Joint2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.Joint2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.Joint2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.Joint2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.Joint2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.Joint2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.Joint2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.Joint2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.Joint2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.Joint2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.Joint2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.Joint2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.Joint2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.Joint2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.Joint2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.Joint2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.Joint2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.Joint2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.Joint2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.Joint2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.Joint2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.Joint2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.Joint2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.Joint2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.Joint2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.Joint2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.Joint2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.Joint2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.Joint2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.Joint2D.__repr__ ```` ````` `````{py:class} FixedJoint2D(*, body_a: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, body_b: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes2d.FixedJoint2D Bases: {py:obj}`simvx.core.physics.nodes2d.Joint2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.FixedJoint2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.FixedJoint2D.__init__ ``` ````{py:property} joint :canonical: simvx.core.physics.nodes2d.FixedJoint2D.joint :type: simvx.core.physics.world2d.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.FixedJoint2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.FixedJoint2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.FixedJoint2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.FixedJoint2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.FixedJoint2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.FixedJoint2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.FixedJoint2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.FixedJoint2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.FixedJoint2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.FixedJoint2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.FixedJoint2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.FixedJoint2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.FixedJoint2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.FixedJoint2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.FixedJoint2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.FixedJoint2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.FixedJoint2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.FixedJoint2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.FixedJoint2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.FixedJoint2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.FixedJoint2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.FixedJoint2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.FixedJoint2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.FixedJoint2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.FixedJoint2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.FixedJoint2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.FixedJoint2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.FixedJoint2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.FixedJoint2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.FixedJoint2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.FixedJoint2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.FixedJoint2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.FixedJoint2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.FixedJoint2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.FixedJoint2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.FixedJoint2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.FixedJoint2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.FixedJoint2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.FixedJoint2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.FixedJoint2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.FixedJoint2D.__repr__ ```` ````` `````{py:class} PinJoint2D(*, body_a: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, body_b: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes2d.PinJoint2D Bases: {py:obj}`simvx.core.physics.nodes2d.Joint2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.PinJoint2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.PinJoint2D.__init__ ``` ````{py:attribute} anchor :canonical: simvx.core.physics.nodes2d.PinJoint2D.anchor :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.PinJoint2D.anchor ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes2d.PinJoint2D.joint :type: simvx.core.physics.world2d.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.PinJoint2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.PinJoint2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.PinJoint2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.PinJoint2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.PinJoint2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.PinJoint2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.PinJoint2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.PinJoint2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.PinJoint2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.PinJoint2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.PinJoint2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.PinJoint2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.PinJoint2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.PinJoint2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.PinJoint2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.PinJoint2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.PinJoint2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.PinJoint2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.PinJoint2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.PinJoint2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.PinJoint2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.PinJoint2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.PinJoint2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.PinJoint2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.PinJoint2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.PinJoint2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.PinJoint2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.PinJoint2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.PinJoint2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.PinJoint2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.PinJoint2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.PinJoint2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.PinJoint2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.PinJoint2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.PinJoint2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.PinJoint2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.PinJoint2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.PinJoint2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.PinJoint2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.PinJoint2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.PinJoint2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.PinJoint2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.PinJoint2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.PinJoint2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.PinJoint2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.PinJoint2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.PinJoint2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.PinJoint2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.PinJoint2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.PinJoint2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.PinJoint2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.PinJoint2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.PinJoint2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.PinJoint2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.PinJoint2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.PinJoint2D.__repr__ ```` ````` `````{py:class} HingeJoint2D(*, body_a: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, body_b: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes2d.HingeJoint2D Bases: {py:obj}`simvx.core.physics.nodes2d.Joint2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.HingeJoint2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.HingeJoint2D.__init__ ``` ````{py:attribute} anchor :canonical: simvx.core.physics.nodes2d.HingeJoint2D.anchor :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.HingeJoint2D.anchor ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes2d.HingeJoint2D.joint :type: simvx.core.physics.world2d.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.HingeJoint2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.HingeJoint2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.HingeJoint2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.HingeJoint2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.HingeJoint2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.HingeJoint2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.HingeJoint2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.HingeJoint2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.HingeJoint2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.HingeJoint2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.HingeJoint2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.HingeJoint2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.HingeJoint2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.HingeJoint2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.HingeJoint2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.HingeJoint2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.HingeJoint2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.HingeJoint2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.HingeJoint2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.HingeJoint2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.HingeJoint2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.HingeJoint2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.HingeJoint2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.HingeJoint2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.HingeJoint2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.HingeJoint2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.HingeJoint2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.HingeJoint2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.HingeJoint2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.HingeJoint2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.HingeJoint2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.HingeJoint2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.HingeJoint2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.HingeJoint2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.HingeJoint2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.HingeJoint2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.HingeJoint2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.HingeJoint2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.HingeJoint2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.HingeJoint2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.HingeJoint2D.__repr__ ```` ````` `````{py:class} SpringJoint2D(*, body_a: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, body_b: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes2d.SpringJoint2D Bases: {py:obj}`simvx.core.physics.nodes2d.Joint2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.SpringJoint2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.SpringJoint2D.__init__ ``` ````{py:attribute} rest_length :canonical: simvx.core.physics.nodes2d.SpringJoint2D.rest_length :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.SpringJoint2D.rest_length ``` ```` ````{py:attribute} stiffness :canonical: simvx.core.physics.nodes2d.SpringJoint2D.stiffness :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.SpringJoint2D.stiffness ``` ```` ````{py:attribute} damping :canonical: simvx.core.physics.nodes2d.SpringJoint2D.damping :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.SpringJoint2D.damping ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes2d.SpringJoint2D.joint :type: simvx.core.physics.world2d.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.SpringJoint2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.SpringJoint2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.SpringJoint2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.SpringJoint2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.SpringJoint2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.SpringJoint2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.SpringJoint2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.SpringJoint2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.SpringJoint2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.SpringJoint2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.SpringJoint2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.SpringJoint2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.SpringJoint2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.SpringJoint2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.SpringJoint2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.SpringJoint2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.SpringJoint2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.SpringJoint2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.SpringJoint2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.SpringJoint2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.SpringJoint2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.SpringJoint2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.SpringJoint2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.SpringJoint2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.SpringJoint2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.SpringJoint2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.SpringJoint2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.SpringJoint2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.SpringJoint2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.SpringJoint2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.SpringJoint2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.SpringJoint2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.SpringJoint2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.SpringJoint2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.SpringJoint2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.SpringJoint2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.SpringJoint2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.SpringJoint2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.SpringJoint2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.SpringJoint2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.SpringJoint2D.__repr__ ```` ````` `````{py:class} GrooveJoint2D(*, body_a: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, body_b: simvx.core.physics.nodes2d.PhysicsBody2D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D Bases: {py:obj}`simvx.core.physics.nodes2d.Joint2D` ```{autodoc2-docstring} simvx.core.physics.nodes2d.GrooveJoint2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes2d.GrooveJoint2D.__init__ ``` ````{py:attribute} groove_a :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.groove_a :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.GrooveJoint2D.groove_a ``` ```` ````{py:attribute} groove_b :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.groove_b :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.GrooveJoint2D.groove_b ``` ```` ````{py:attribute} anchor_b :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.anchor_b :type: simvx.core.math.Vec2 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes2d.GrooveJoint2D.anchor_b ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.joint :type: simvx.core.physics.world2d.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.world :type: simvx.core.physics.world2d.Physics2DWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} z_index :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.z_index :value: > 'Property(...)' ```` ````{py:attribute} z_as_relative :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.z_as_relative :value: > 'Property(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.render_layer :value: > 'Property(...)' ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.is_on_render_layer ```` ````{py:property} absolute_z_index :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.absolute_z_index :type: int ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.rotation_degrees :type: float ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.world_position :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.world_rotation :type: float ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.world_scale :type: simvx.core.math.types.Vec2 ```` ````{py:property} world_transform :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.world_transform :type: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float] ```` ````{py:property} forward :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.forward :type: simvx.core.math.types.Vec2 ```` ````{py:property} right :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.right :type: simvx.core.math.types.Vec2 ```` ````{py:method} translate(offset: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.translate ```` ````{py:method} rotate(radians: float) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.rotate ```` ````{py:method} rotate_deg(degrees: float) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.rotate_deg ```` ````{py:method} look_at(target: tuple[float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.look_at ```` ````{py:method} transform_points(points: list[simvx.core.math.types.Vec2]) -> list[simvx.core.math.types.Vec2] :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.transform_points ```` ````{py:method} draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.draw_polygon ```` ````{py:method} wrap_screen(margin: float = 20) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.wrap_screen ```` ````{py:attribute} hdr :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.hdr :value: > 'Property(...)' ```` ````{py:method} queue_redraw() -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.queue_redraw ```` ````{py:property} render_dirty :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.render_dirty :type: bool ```` ````{py:property} transform_render_dirty :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.transform_render_dirty :type: bool ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes2d.GrooveJoint2D.__repr__ ```` `````