Here's a GDScript implementation for a magnet node in Godot, with a complexity level of 5:
extends Area2D
class_name MagnetNode
export var attraction_force: float = 500.0
export var attraction_radius: float = 200.0
export var attract_groups: Array = ["Attractable"]
var attracted_bodies: Array = []
func _ready():
collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = attraction_radius
collision_shape.shape = circle_shape
add_child(collision_shape)
connect("body_entered", self, "_on_body_entered")
connect("body_exited", self, "_on_body_exited")
func _physics_process(delta):
for body in attracted_bodies:
if is_instance_valid(body) and body is RigidBody2D:
var direction = global_position - body.global_position
var distance = direction.length()
var force = direction.normalized() * (attraction_force / (distance * distance))
body.apply_central_impulse(force * delta)
func _on_body_entered(body):
for group in attract_groups:
if body.is_in_group(group):
attracted_bodies.append(body)
break
func _on_body_exited(body):
attracted_bodies.erase(body)
func set_attraction_radius(new_radius: float):
attraction_radius = new_radius
if collision_shape and collision_shape.shape:
collision_shape.shape.radius = new_radius
func toggle_magnet(enabled: bool):
set_physics_process(enabled)
collision_shape.disabled = not enabled
This GDScript creates a MagnetNode class that extends Area2D. Here's a breakdown of its functionality:
To use this node in your Godot project: