Guest User

godot-3bp

a guest
Oct 16th, 2025
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
GDScript 5.55 KB | Source Code | 0 0
  1. extends Node2D
  2.  
  3. @export var simulation_speed: float = 1.0
  4. @export var orbit_scale: float = 150.0
  5. @export_enum("Figure-8", "Lagrange Triangle", "Butterfly") var orbit_pattern: int = 0
  6. @export var trail_length: int = 75
  7. @export var trail_width: float = 6.0
  8. @export var glow_intensity: float = 2.5
  9.  
  10. var bodies: Array = []
  11. var body_visuals: Array = []
  12. var time: float = 0.0
  13. var center: Vector2
  14.  
  15. class Body:
  16.     var angle: float
  17.     var orbit_radius: float
  18.     var orbit_speed: float
  19.     var phase: float
  20.     var color: Color
  21.     var trail_points: Array = []
  22.    
  23.     func _init(a: float, r: float, s: float, p: float, c: Color):
  24.         angle = a
  25.         orbit_radius = r
  26.         orbit_speed = s
  27.         phase = p
  28.         color = c
  29.  
  30. func _ready():
  31.     center = get_viewport_rect().size / 2.0
  32.     setup_orbital_system()
  33.     await get_tree().process_frame
  34.     create_visual_effects()
  35.  
  36. func setup_orbital_system():
  37.     bodies.clear()
  38.     match orbit_pattern:
  39.         0:  
  40.             bodies.append(Body.new(
  41.                 0.0, orbit_scale * 0.8, 1.2, 0.0,
  42.                 Color(1.0, 0.5, 0.2, 1.0)
  43.             ))
  44.             bodies.append(Body.new(
  45.                 TAU * 0.33, orbit_scale * 0.8, 1.2, TAU * 0.33,
  46.                 Color(0.2, 0.7, 1.0, 1.0)
  47.             ))
  48.             bodies.append(Body.new(
  49.                 TAU * 0.66, orbit_scale * 0.8, 1.2, TAU * 0.66,
  50.                 Color(1.0, 1.0, 0.3, 1.0)
  51.             ))
  52.         1:  
  53.             for i in range(3):
  54.                 var angle = (i * TAU / 3.0)
  55.                 bodies.append(Body.new(
  56.                     angle, orbit_scale, 1.0, 0.0,
  57.                     [Color(1.0, 0.3, 0.3), Color(0.3, 1.0, 0.5), Color(0.5, 0.5, 1.0)][i]
  58.                 ))
  59.         2:  
  60.             bodies.append(Body.new(
  61.                 0.0, orbit_scale * 0.6, 1.5, 0.0,
  62.                 Color(1.0, 0.2, 0.6, 1.0)
  63.             ))
  64.             bodies.append(Body.new(
  65.                 PI, orbit_scale * 0.6, 1.5, PI,
  66.                 Color(0.2, 1.0, 0.8, 1.0)
  67.             ))
  68.             bodies.append(Body.new(
  69.                 PI * 0.5, orbit_scale * 1.0, 0.8, 0.0,
  70.                 Color(0.8, 0.8, 1.0, 1.0)
  71.             ))
  72.  
  73. func create_visual_effects():
  74.     for i in range(bodies.size()):
  75.         var body = bodies[i]
  76.        
  77.         var container = Node2D.new()
  78.         container.name = "Body" + str(i)
  79.         add_child(container)
  80.        
  81.         var light = PointLight2D.new()
  82.         light.enabled = true
  83.         light.color = body.color
  84.         light.energy = glow_intensity
  85.         light.texture_scale = 1.0
  86.         light.blend_mode = Light2D.BLEND_MODE_ADD
  87.         container.add_child(light)
  88.        
  89.         var particles = CPUParticles2D.new()
  90.         particles.emitting = true
  91.         particles.amount = 100
  92.         particles.lifetime = 0.8
  93.         particles.local_coords = false
  94.         particles.emission_shape = CPUParticles2D.EMISSION_SHAPE_SPHERE
  95.         particles.emission_sphere_radius = 5.0
  96.        
  97.         particles.gravity = Vector2.ZERO
  98.         particles.initial_velocity_min = 3.0
  99.         particles.initial_velocity_max = 10.0
  100.         particles.linear_accel_min = -15.0
  101.         particles.linear_accel_max = -20.0
  102.         particles.damping_min = 10.0
  103.         particles.damping_max = 15.0
  104.        
  105.         particles.scale_amount_min = 2.0
  106.         particles.scale_amount_max = 4.0
  107.         particles.color = body.color
  108.        
  109.         container.add_child(particles)
  110.        
  111.         var trail_line = Line2D.new()
  112.         trail_line.width = trail_width
  113.         trail_line.default_color = body.color
  114.         trail_line.joint_mode = Line2D.LINE_JOINT_ROUND
  115.         trail_line.begin_cap_mode = Line2D.LINE_CAP_ROUND
  116.         trail_line.end_cap_mode = Line2D.LINE_CAP_ROUND
  117.         trail_line.antialiased = true
  118.        
  119.         add_child(trail_line)
  120.        
  121.         var glow_line = Line2D.new()
  122.         glow_line.width = trail_width * 2.5
  123.         var glow_color = body.color
  124.         glow_color.a = 0.3
  125.         glow_line.default_color = glow_color
  126.         glow_line.joint_mode = Line2D.LINE_JOINT_ROUND
  127.         glow_line.begin_cap_mode = Line2D.LINE_CAP_ROUND
  128.         glow_line.end_cap_mode = Line2D.LINE_CAP_ROUND
  129.         glow_line.antialiased = true
  130.        
  131.         add_child(glow_line)
  132.        
  133.         body_visuals.append({
  134.             "container": container,
  135.             "light": light,
  136.             "particles": particles,
  137.             "trail_line": trail_line,
  138.             "glow_line": glow_line
  139.         })
  140.  
  141. func _process(delta):
  142.     time += delta * simulation_speed
  143.     update_bodies()
  144.     update_visuals()
  145.  
  146. func update_bodies():
  147.     for i in range(bodies.size()):
  148.         var body = bodies[i]
  149.        
  150.         body.angle += body.orbit_speed * 0.02
  151.        
  152.         var x_offset = cos(body.angle + body.phase) * body.orbit_radius
  153.         var y_offset = sin(body.angle + body.phase) * body.orbit_radius * 0.85
  154.        
  155.         if orbit_pattern == 0:
  156.             var figure8_offset = sin(body.angle * 2.0) * orbit_scale * 0.3
  157.             x_offset += figure8_offset
  158.        
  159.         var position = center + Vector2(x_offset, y_offset)
  160.        
  161.         body.trail_points.push_front(position)
  162.         if body.trail_points.size() > trail_length:
  163.             body.trail_points.resize(trail_length)
  164.  
  165. func update_visuals():
  166.     for i in range(bodies.size()):
  167.         var body = bodies[i]
  168.         var visuals = body_visuals[i]
  169.        
  170.         if body.trail_points.is_empty():
  171.             continue
  172.        
  173.         var pos = body.trail_points[0]
  174.        
  175.         visuals["container"].global_position = pos
  176.        
  177.         var pulse = 1.0 + sin(time * 3.0 + i * TAU / 3.0) * 0.2
  178.         visuals["light"].energy = glow_intensity * pulse
  179.        
  180.         var trail_line = visuals["trail_line"]
  181.         trail_line.clear_points()
  182.        
  183.         var num_points = min(body.trail_points.size(), trail_length)
  184.         for j in range(num_points):
  185.             trail_line.add_point(body.trail_points[j])
  186.        
  187.         var glow_line = visuals["glow_line"]
  188.         glow_line.clear_points()
  189.         for j in range(0, num_points, 3):
  190.             glow_line.add_point(body.trail_points[j])
  191.  
  192. func reset_simulation():
  193.     for body in bodies:
  194.         body.trail_points.clear()
  195.         body.angle = randf() * TAU
  196.     time = 0.0
  197.  
  198. func change_pattern(pattern_index: int):
  199.     orbit_pattern = pattern_index
  200.    
  201.     for visual in body_visuals:
  202.         visual["container"].queue_free()
  203.         visual["trail_line"].queue_free()
  204.         visual["glow_line"].queue_free()
  205.    
  206.     body_visuals.clear()
  207.     bodies.clear()
  208.    
  209.     setup_orbital_system()
  210.     await get_tree().process_frame
  211.     create_visual_effects()
  212.  
Advertisement
Add Comment
Please, Sign In to add comment