11// Advanced particle system by Limekys (This script has MIT Licence)
2- #macro LIMEKYS_ADVANCED_PARTICLE_SYSTEM_VERSION " 2024.02.23 "
2+ #macro LIMEKYS_ADVANCED_PARTICLE_SYSTEM_VERSION " 2024.02.26 "
33
44#macro _APS_DT global.particle_system_deltatime // This is a delta time variable, you can replace it with your own if you use your delta time system in the game
55
@@ -25,7 +25,12 @@ function advanced_part_system() constructor {
2525 part_system_max_count = 1000 ;
2626 part_system_debug_mode = false ;
2727
28- // update_interval = aps_update_interval; //not completed
28+ // Update timer (a little bit more optimization stuff)
29+ // You can specify a target FPS for the particles
30+ // for example at a value of 30 the particles will update 30 times per second
31+ // when the rest of the game will update at your specified frame rate of 60, 120 ....
32+ part_system_update_timer = 0 ;
33+ part_system_update_fps = 60 ;
2934
3035 // DELTATIME SYSTEM INIT
3136 part_system_deltatime_is_enabled = false ;
@@ -63,6 +68,13 @@ function advanced_part_system() constructor {
6368 return self;
6469 }
6570
71+ // /@func set_update_fps(update_fps = 60)
72+ // /@desc Set target update fps for particle system
73+ static set_update_fps = function (update_fps = 60 ) {
74+ part_system_update_fps = update_fps;
75+ return self;
76+ }
77+
6678 // /@func clear()
6779 // /@desc Delete all exists particles
6880 static clear = function () {
@@ -116,148 +128,154 @@ function advanced_part_system() constructor {
116128 // Update all particles
117129 var _delta_time = part_system_deltatime_is_enabled ? _APS_DT : 1 ;
118130 var i = _length - 1 ;
119- repeat (_length) {
120- var _particle = particle_array[i];
121- if is_struct (_particle) {
122- // Update every particle
123- with (_particle) {
131+ var _multiplier = max (1 , fps / part_system_update_fps);
132+ _delta_time *= _multiplier;
133+ part_system_update_timer++;
134+ if part_system_update_timer >= _multiplier {
135+ part_system_update_timer -= _multiplier;
136+ repeat (_length) {
137+ var _particle = particle_array[i];
138+ if is_struct (_particle) {
139+ // Update every particle
140+ with (_particle) {
124141
125- // Moving
126- var _x_speed = dcos (direction) * speed * _delta_time;
127- var _y_speed = -dsin (direction) * speed * _delta_time;
142+ // Moving
143+ var _x_speed = dcos (direction) * speed * _delta_time;
144+ var _y_speed = -dsin (direction) * speed * _delta_time;
128145
129- if gravity_speed != 0 {
130- gravity += gravity_speed * _delta_time;
131- _x_speed += dcos (gravity_direction) * gravity * _delta_time;
132- _y_speed += -dsin (gravity_direction) * gravity * _delta_time;
133- }
134- if point_gravity_speed != 0 {
135- point_gravity += point_gravity_speed * _delta_time;
136- var point_gravity_dir = point_direction (x, y, point_gravity_x, point_gravity_y);
137- _x_speed += dcos (point_gravity_dir) * point_gravity * _delta_time;
138- _y_speed += -dsin (point_gravity_dir) * point_gravity * _delta_time;
139- }
146+ if gravity_speed != 0 {
147+ gravity += gravity_speed * _delta_time;
148+ _x_speed += dcos (gravity_direction) * gravity * _delta_time;
149+ _y_speed += -dsin (gravity_direction) * gravity * _delta_time;
150+ }
151+ if point_gravity_speed != 0 {
152+ point_gravity += point_gravity_speed * _delta_time;
153+ var point_gravity_dir = point_direction (x, y, point_gravity_x, point_gravity_y);
154+ _x_speed += dcos (point_gravity_dir) * point_gravity * _delta_time;
155+ _y_speed += -dsin (point_gravity_dir) * point_gravity * _delta_time;
156+ }
140157
141- x_previous = x;
142- y_previous = y;
158+ x_previous = x;
159+ y_previous = y;
143160
144- x += _x_speed;
145- y += _y_speed;
161+ x += _x_speed;
162+ y += _y_speed;
146163
147- life -= _delta_time;
164+ life -= _delta_time;
148165
149- // Custom step function
150- if is_method (step_function) {
151- step_function ();
152- }
166+ // Custom step function
167+ if is_method (step_function) {
168+ step_function ();
169+ }
153170
154- // Changing color
155- if colors_enabled {
156- var _percent = 1 - (life / life_max);
171+ // Changing color
172+ if colors_enabled {
173+ var _percent = 1 - (life / life_max);
157174
158- if _percent <= 0.5 {
159- color = merge_colour (color1, color2, _percent * 2 );
160- } else {
161- color = merge_colour (color2, color3, _percent * 2 - 1 );
175+ if _percent <= 0.5 {
176+ color = merge_colour (color1, color2, _percent * 2 );
177+ } else {
178+ color = merge_colour (color2, color3, _percent * 2 - 1 );
179+ }
162180 }
163- }
164181
165- // Changing alpha
166- if alpha_blend_enabled {
167- var _percent = 1 - (life / life_max);
182+ // Changing alpha
183+ if alpha_blend_enabled {
184+ var _percent = 1 - (life / life_max);
168185
169- if _percent <= 0.5 {
170- alpha = lerp (alpha1, alpha2, _percent * 2 );
171- } else {
172- alpha = lerp (alpha2, alpha3, _percent * 2 - 1 );
186+ if _percent <= 0.5 {
187+ alpha = lerp (alpha1, alpha2, _percent * 2 );
188+ } else {
189+ alpha = lerp (alpha2, alpha3, _percent * 2 - 1 );
190+ }
173191 }
174- }
175192
176- // Changing direction (direction_increase)
177- if direction_increase != 0 {
178- direction += direction_increase * _delta_time;
179- }
180- if direction_wiggle != 0 { // ???//
181- var _wiggle = direction_wiggle;
182- direction = direction + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
183- }
193+ // Changing direction (direction_increase)
194+ if direction_increase != 0 {
195+ direction += direction_increase * _delta_time;
196+ }
197+ if direction_wiggle != 0 { // ???//
198+ var _wiggle = direction_wiggle;
199+ direction = direction + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
200+ }
184201
185- // Changing speed (speed_increase)
186- if speed_increase != 0 && speed > 0 {
187- speed += speed_increase * _delta_time;
188- }
189- if speed_wiggle != 0 && speed > 0 { // ???//
190- var _wiggle = speed_wiggle;
191- speed = speed + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
192- }
202+ // Changing speed (speed_increase)
203+ if speed_increase != 0 && speed > 0 {
204+ speed += speed_increase * _delta_time;
205+ }
206+ if speed_wiggle != 0 && speed > 0 { // ???//
207+ var _wiggle = speed_wiggle;
208+ speed = speed + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
209+ }
193210
194- // Changing angle (angle_increase, angle_relative)
195- if angle_relative {
196- angle = direction;
197- } else if angle_increase != 0 {
198- angle += angle_increase * _delta_time;
199- }
200- if angle_wiggle != 0 { // ???//
201- var _wiggle = angle_wiggle;
202- angle = angle + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
203- }
211+ // Changing angle (angle_increase, angle_relative)
212+ if angle_relative {
213+ angle = direction;
214+ } else if angle_increase != 0 {
215+ angle += angle_increase * _delta_time;
216+ }
217+ if angle_wiggle != 0 { // ???//
218+ var _wiggle = angle_wiggle;
219+ angle = angle + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
220+ }
204221
205- // Changing size (size_increase)
206- if size_increase != 0 {
207- x_size += size_increase * _delta_time;
208- y_size += size_increase * _delta_time;
209- }
210- if size_wiggle != 0 { // ???//
211- var _wiggle = size_wiggle;
212- x_size = x_size + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
213- y_size = y_size + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
214- }
222+ // Changing size (size_increase)
223+ if size_increase != 0 {
224+ x_size += size_increase * _delta_time;
225+ y_size += size_increase * _delta_time;
226+ }
227+ if size_wiggle != 0 { // ???//
228+ var _wiggle = size_wiggle;
229+ x_size = x_size + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
230+ y_size = y_size + wiggle (-_wiggle, _wiggle, 0.2 * _delta_time, life);
231+ }
215232
216- // Step particles // NOT COMPLETED! //
217- if part_type.part_step_number != 0 {
218- // Burst particles with deltatime (create numbers of particles within a second) if ps.part_system_deltatime_is_enabled == true
219- // And burst particles without deltatime (create numbers of particles each step) if ps.part_system_deltatime_is_enabled == false
220- var _spawn_interval = 1 / part_type.part_step_number ;
221- if (other.part_system_deltatime_is_enabled == true ) part_type.spawn_timer += _APS_DT;
222- var _count = other.part_system_deltatime_is_enabled ? floor (part_type.spawn_timer / _spawn_interval) : part_type.part_step_number ;
233+ // Step particles // NOT COMPLETED! //
234+ if part_type.part_step_number != 0 {
235+ // Burst particles with deltatime (create numbers of particles within a second) if ps.part_system_deltatime_is_enabled == true
236+ // And burst particles without deltatime (create numbers of particles each step) if ps.part_system_deltatime_is_enabled == false
237+ var _spawn_interval = 1 / part_type.part_step_number ;
238+ if (other.part_system_deltatime_is_enabled == true ) part_type.spawn_timer += _APS_DT;
239+ var _count = other.part_system_deltatime_is_enabled ? floor (part_type.spawn_timer / _spawn_interval) : part_type.part_step_number ;
223240
224- repeat (_count) {
225- var _step_particle = new particle (part_type.part_step_type );
226- with (_step_particle) {
227- x = other.x ;
228- y = other.y ;
241+ repeat (_count) {
242+ var _step_particle = new particle (part_type.part_step_type );
243+ with (_step_particle) {
244+ x = other.x ;
245+ y = other.y ;
246+ }
247+ array_push (other.particle_array , _step_particle);
248+ part_type.spawn_timer = part_type.spawn_timer mod _spawn_interval;
229249 }
230- array_push (other.particle_array , _step_particle);
231- part_type.spawn_timer = part_type.spawn_timer mod _spawn_interval;
232250 }
233- }
234251
235- // Destroy particles
236- if life <= 0 {
237- if death_part != undefined {
238- var _death_particle = new particle (death_part);
239- with (_death_particle) {
240- emitter = other.emitter ;
241- x = other.x ;
242- y = other.y ;
243- }
244- other.particle_array [i] = _death_particle;
245- repeat (death_number - 1 ) {
246- _death_particle = new particle (death_part);
252+ // Destroy particles
253+ if life <= 0 {
254+ if death_part != undefined {
255+ var _death_particle = new particle (death_part);
247256 with (_death_particle) {
248257 emitter = other.emitter ;
249258 x = other.x ;
250259 y = other.y ;
251260 }
252- array_push (other.particle_array , _death_particle);
261+ other.particle_array [i] = _death_particle;
262+ repeat (death_number - 1 ) {
263+ _death_particle = new particle (death_part);
264+ with (_death_particle) {
265+ emitter = other.emitter ;
266+ x = other.x ;
267+ y = other.y ;
268+ }
269+ array_push (other.particle_array , _death_particle);
270+ }
271+ } else {
272+ array_delete (other.particle_array , i, 1 );
253273 }
254- } else {
255- array_delete (other.particle_array , i, 1 );
256274 }
257275 }
258276 }
277+ --i;
259278 }
260- --i;
261279 }
262280 }
263281 }
0 commit comments