I did some experimenting with a Particles2D node, and it seems that only changing amount
resets the particle system. I was able to change the lifetime
, color
, scale
, and texture
during run time without any resets or special code needed, all I did was change the property.
Here is the code I used:
extends Control
export (NodePath) var path_to_particles;
var particle_system;
var IMG_ONE = preload("res://spark_particle2.png");
var IMG_TWO = preload("res://fire_particle.png");
var current_image = "two";
func _ready():
particle_system = get_node(path_to_particles);
get_node("HSlider_Vel").value = particle_system.process_material.initial_velocity;
get_node("HSlider_Scale").value = particle_system.process_material.scale;
get_node("HSlider_Amount").value = particle_system.amount;
get_node("HSlider_Lifetime").value = particle_system.lifetime;
get_node("Button_IMG").connect("pressed", self, "change_texture");
get_node("HSlider_Vel").connect("value_changed", self, "change_value", ["particle_velocity"]);
get_node("HSlider_Scale").connect("value_changed", self, "change_value", ["particle_scale"]);
get_node("HSlider_Amount").connect("value_changed", self, "change_value", ["particle_amount"]);
get_node("HSlider_Lifetime").connect("value_changed", self, "change_value", ["particle_lifetime"]);
func _physics_process(delta):
particle_system.process_material.color.h += 0.03 * delta;
func change_texture():
if (current_image == "two"):
particle_system.texture = IMG_ONE;
current_image = "one";
elif (current_image == "one"):
particle_system.texture = IMG_TWO;
current_image = "two";
func change_value(new_value, value_type):
if (value_type == "particle_velocity"):
particle_system.process_material.initial_velocity = new_value;
elif (value_type == "particle_scale"):
particle_system.process_material.scale = new_value;
elif (value_type == "particle_amount"):
particle_system.amount = new_value;
elif (value_type == "particle_lifetime"):
particle_system.lifetime = new_value;