11// ADVANCED PARTICLE SYSTEM by Limekys
2- // VERSION: 2022.07.26
2+ // VERSION: 2022.07.28
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
@@ -259,9 +259,9 @@ function advanced_part_system() constructor {
259259 if additiveblend gpu_set_blendmode (bm_add); // TEMPORARY
260260
261261 if (x_size == 1 && y_size == 1 && angle == 0 && color == c_white && alpha == 1 ) {
262- draw_sprite (sprite, subimg, x-part_width_half , y-part_height_half );
262+ draw_sprite (sprite, subimg, x, y);
263263 } else {
264- draw_sprite_ext (sprite, subimg, x-part_width_half , y-part_height_half , x_size, y_size, angle, color, alpha);
264+ draw_sprite_ext (sprite, subimg, x, y, x_size, y_size, angle, color, alpha);
265265 }
266266
267267 if additiveblend gpu_set_blendmode (bm_normal); // TEMPORARY
@@ -292,89 +292,7 @@ function advanced_part_system() constructor {
292292 }
293293}
294294
295- // Basic particle
296- function particle (part_type) constructor {
297- self.emitter = undefined;
298- self.part_type = part_type;
299-
300- self.sprite = part_type.part_sprite ;
301- self.subimg = part_type.part_subimg ; if (part_type.part_subimg_random ) subimg = irandom (sprite_get_number (sprite) - 1 );
302- self.life = random_range (part_type.part_time_min ,part_type.part_time_max );
303- self.life_max = life;
304-
305- self.x = 0 ;
306- self.y = 0 ;
307- self.direction = random_range (part_type.part_direction_min ,part_type.part_direction_max );
308- self.direction_increase = part_type.part_direction_increase ;
309- self.direction_wiggle = part_type.part_direction_wiggle ;
310- self.speed = max (0 , random_range (part_type.part_speed_min ,part_type.part_speed_max ));
311- self.speed_increase = part_type.part_speed_increase ;
312- self.speed_wiggle = part_type.part_speed_wiggle ;
313- self.gravity = 0 ;
314- self.gravity_direction = part_type.part_gravity_direction ;
315- self.gravity_speed = part_type.part_gravity_speed ;
316- self.point_gravity = 0 ;
317- self.point_gravity_x = part_type.part_point_gravity_x ;
318- self.point_gravity_y = part_type.part_point_gravity_y ;
319- self.point_gravity_speed = part_type.part_point_gravity_speed ;
320-
321- self.x_size = random_range (part_type.part_size_min ,part_type.part_size_max );
322- self.y_size = x_size;
323- self.size_increase = part_type.part_size_increase ;
324- self.size_wiggle = part_type.part_size_wiggle ;
325- self.x_size *= part_type.part_xscale ;
326- self.y_size *= part_type.part_yscale ;
327- self.part_width = part_type.part_sprite_width * x_size;
328- self.part_height = part_type.part_sprite_height * y_size;
329- self.part_width_half = part_width / 2 ;
330- self.part_height_half = part_height / 2 ;
331-
332- self.angle = random_range (part_type.part_angle_min ,part_type.part_angle_max );
333- self.angle_increase = part_type.part_angle_increase ;
334- self.angle_wiggle = part_type.part_angle_wiggle ;
335- self.angle_relative = part_type.part_angle_relative ;
336-
337- self.color = part_type.part_color ;
338- self.alpha = 1 ;
339-
340- self.colors_enabled = part_type.colors_enabled ;
341- if colors_enabled {
342- self.color1 = part_type.part_color_1 ;
343- self.color2 = part_type.part_color_2 ;
344- self.color3 = part_type.part_color_3 ;
345- color = color1;
346- }
347-
348- self.alpha_blend_enabled = part_type.alpha_blend_enabled ;
349- if self.alpha_blend_enabled {
350- self.alpha1 = part_type.part_alpha_1 ;
351- self.alpha2 = part_type.part_alpha_2 ;
352- self.alpha3 = part_type.part_alpha_3 ;
353- self.alpha = alpha1;
354- }
355-
356- self.additiveblend = part_type.part_additiveblend ;
357-
358- self.death_part = part_type.part_death_type ;
359- self.death_number = part_type.part_death_number ;
360-
361- self.step_function = is_method (part_type.part_step_func ) ? method (self, part_type.part_step_func ) : undefined;
362- }
363-
364- function advanced_part_emitter (ps, xmin, xmax, ymin, ymax, shape, distribution) constructor {
365- self.part_sys = ps;
366-
367- self.x_left = xmin;
368- self.x_right = xmax;
369- self.y_top = ymin;
370- self.y_down = ymax;
371-
372- self.emitter_shape = shape;
373- self.emitter_distr = distribution;
374-
375- array_push (ps.emitters_array , self);
376- }
377-
295+ // Particle type
378296function advanced_part_type () constructor {
379297 self.part_sprite = undefined;
380298 self.part_subimg = 0 ;
@@ -411,9 +329,6 @@ function advanced_part_type() constructor {
411329 self.part_angle_wiggle = 0 ;
412330 self.part_angle_relative = false ;
413331
414- self.part_sprite_width = 0 ;
415- self.part_sprite_height = 0 ;
416-
417332 self.part_speed_min = 0 ;
418333 self.part_speed_max = 0 ;
419334 self.part_speed_increase = 0 ;
@@ -444,8 +359,6 @@ function advanced_part_type() constructor {
444359 // /@func part_image(sprite, subimg, color, animate, stretch, is_random)
445360 static part_image = function (sprite, subimg, color, animate, stretch, is_random) {
446361 self.part_sprite = sprite;
447- self.part_sprite_width = sprite_get_width (self.part_sprite );
448- self.part_sprite_height = sprite_get_height (self.part_sprite );
449362 self.part_subimg = subimg;
450363 self.part_color = color;
451364 self.part_animate = animate;
@@ -565,6 +478,94 @@ function advanced_part_type() constructor {
565478 }
566479}
567480
481+ // Particle
482+ function particle (part_type) constructor {
483+ self.emitter = undefined;
484+ self.part_type = part_type;
485+
486+ self.sprite = part_type.part_sprite ;
487+ self.subimg = part_type.part_subimg ; if (part_type.part_subimg_random ) subimg = irandom (sprite_get_number (sprite) - 1 );
488+ self.life = random_range (part_type.part_time_min ,part_type.part_time_max );
489+ self.life_max = life;
490+
491+ self.x = 0 ;
492+ self.y = 0 ;
493+ self.direction = random_range (part_type.part_direction_min ,part_type.part_direction_max );
494+ self.direction_increase = part_type.part_direction_increase ;
495+ self.direction_wiggle = part_type.part_direction_wiggle ;
496+ self.speed = max (0 , random_range (part_type.part_speed_min ,part_type.part_speed_max ));
497+ self.speed_increase = part_type.part_speed_increase ;
498+ self.speed_wiggle = part_type.part_speed_wiggle ;
499+ self.gravity = 0 ;
500+ self.gravity_direction = part_type.part_gravity_direction ;
501+ self.gravity_speed = part_type.part_gravity_speed ;
502+ self.point_gravity = 0 ;
503+ self.point_gravity_x = part_type.part_point_gravity_x ;
504+ self.point_gravity_y = part_type.part_point_gravity_y ;
505+ self.point_gravity_speed = part_type.part_point_gravity_speed ;
506+
507+ self.x_size = random_range (part_type.part_size_min ,part_type.part_size_max );
508+ self.y_size = x_size;
509+ self.size_increase = part_type.part_size_increase ;
510+ self.size_wiggle = part_type.part_size_wiggle ;
511+ self.x_size *= part_type.part_xscale ;
512+ self.y_size *= part_type.part_yscale ;
513+
514+ self.angle = random_range (part_type.part_angle_min ,part_type.part_angle_max );
515+ self.angle_increase = part_type.part_angle_increase ;
516+ self.angle_wiggle = part_type.part_angle_wiggle ;
517+ self.angle_relative = part_type.part_angle_relative ;
518+
519+ self.color = part_type.part_color ;
520+ self.alpha = 1 ;
521+
522+ self.colors_enabled = part_type.colors_enabled ;
523+ if colors_enabled {
524+ self.color1 = part_type.part_color_1 ;
525+ self.color2 = part_type.part_color_2 ;
526+ self.color3 = part_type.part_color_3 ;
527+ color = color1;
528+ }
529+
530+ self.alpha_blend_enabled = part_type.alpha_blend_enabled ;
531+ if self.alpha_blend_enabled {
532+ self.alpha1 = part_type.part_alpha_1 ;
533+ self.alpha2 = part_type.part_alpha_2 ;
534+ self.alpha3 = part_type.part_alpha_3 ;
535+ self.alpha = alpha1;
536+ }
537+
538+ self.additiveblend = part_type.part_additiveblend ;
539+
540+ self.death_part = part_type.part_death_type ;
541+ self.death_number = part_type.part_death_number ;
542+
543+ self.step_function = is_method (part_type.part_step_func ) ? method (self, part_type.part_step_func ) : undefined;
544+ }
545+
546+ // Emitters
547+ function advanced_part_emitter (ps, xmin, xmax, ymin, ymax, shape, distribution) constructor {
548+ self.part_sys = ps;
549+ self.x_left = xmin;
550+ self.x_right = xmax;
551+ self.y_top = ymin;
552+ self.y_down = ymax;
553+ self.emitter_shape = shape;
554+ self.emitter_distr = distribution;
555+ array_push (ps.emitters_array , self);
556+ }
557+
558+ function advanced_part_emitter_region (part_emit, xmin, xmax, ymin, ymax, shape, distribution) {
559+ with (part_emit) {
560+ self.x_left = xmin;
561+ self.y_top = ymin;
562+ self.x_right = xmax;
563+ self.y_down = ymax;
564+ self.emitter_shape = shape;
565+ self.emitter_distr = distribution;
566+ }
567+ }
568+
568569function advanced_part_emitter_burst (ps, part_emit, part_type, number) {
569570 // WITH DELTATIME // Burst particles with deltatime (create numbers of particles within a second)
570571 // WITHOUT DELTATIME // And burst particles without deltatime (create numbers of particles each step)
@@ -605,6 +606,7 @@ function advanced_part_emitter_burst(ps, part_emit, part_type, number) {
605606 part_type.spawn_timer = part_type.spawn_timer mod spawn_interval;
606607}
607608
609+ // Simple particle creating
608610function advanced_part_particles_create (ps, x, y, part_type, number) {
609611 repeat (number) {
610612 var part = new particle (part_type);
@@ -615,15 +617,3 @@ function advanced_part_particles_create(ps, x, y, part_type, number) {
615617 array_push (ps.particle_array , part);
616618 }
617619}
618-
619- function advanced_part_emitter_region (part_emit, xmin, xmax, ymin, ymax, shape, distribution) {
620- with (part_emit) {
621- x_left = xmin;
622- y_top = ymin;
623- x_right = xmax;
624- y_down = ymax;
625-
626- emitter_shape = shape;
627- emitter_distr = distribution;
628- }
629- }
0 commit comments