extends Node2D export(Array, Resource) var goo_particles = [] export(Vector2) var direction export(int) var spawn_radius = 32 export(int) var spawn_rate = 1 export(int) var despawn_radius = 250 export(float) var movement_speed = 10 var goo_shader = preload('res://images/goo/goo.shader') var delta_sum = 0 var time = 0 func _ready(): for particle in goo_particles: particle.load_textures() func emit(): var particle = goo_particles[rand_range(0, goo_particles.size())] as GooParticle var instance = Particle.new() instance.particle = particle instance.material = ShaderMaterial.new() instance.material.shader = goo_shader instance.material.set_shader_param('particles_anim_h_frames', particle.columns) instance.material.set_shader_param('particles_anim_v_frames', particle.rows) instance.material.set_shader_param('particles_anim_loop', true) instance.material.set_shader_param('frame', 0) instance.texture = particle.texture instance.normal_map = particle.normal_map instance.shader_frame = 0 instance.position = Vector2(rand_range(0, spawn_radius), rand_range(0, spawn_radius)) instance.initial_y = instance.position.y instance.initial_time = time add_child(instance) func _process(delta): delta_sum += delta time += delta for child in get_children(): child.delta_sum += delta while child.delta_sum >= 1.0 / child.particle.framerate: child.delta_sum -= 1.0 / child.particle.framerate child.shader_frame += 1 if child.shader_frame >= child.particle.frame_count: child.shader_frame = 0 child.material.set_shader_param('frame', child.shader_frame) child.position += direction * delta * movement_speed child.position.y = child.initial_y + sin(time - child.initial_time) * 3 while delta_sum >= spawn_rate: delta_sum -= spawn_rate emit() for child in get_children(): if child.position.length() > despawn_radius: child.queue_free() class Particle: extends Sprite var shader_frame = 0 var particle : GooParticle var delta_sum : float = 0 var initial_y : int var initial_time : float