Advertisement
erebys-2

particle2

Mar 13th, 2025
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.34 KB | None | 0 0
  1. import pygame
  2. import os
  3. import random
  4.  
  5. #My goofy ahh particle handler
  6. #context: in my game directory I have a folder called particle, and in it contain subfolders with particle names
  7. #ex: sprites/particle/my_particle1/(png files)
  8. #I do not use a sprite sheet bc my art process prefers making individual frames :P
  9.  
  10. class particle_2(pygame.sprite.Sprite):#initiated at start of game
  11.     def __init__(self, particle_img_dict):
  12.         #load every frame for every particle into lists of a dict
  13.         pygame.sprite.Sprite.__init__(self)
  14.         self.Active = True
  15.  
  16.         if particle_img_dict == None:
  17.             particle_path = 'sprites/particle'
  18.             self.particle_img_dict = {}
  19.             for subdir in os.listdir(particle_path):
  20.                 temp_list = []
  21.                 for i in range(len(os.listdir(f'{particle_path}/{subdir}'))):
  22.                     loaded_img = pygame.image.load(f'{particle_path}/{subdir}/{i}.png').convert_alpha()
  23.                     temp_list.append(loaded_img)
  24.                 self.particle_img_dict[subdir] = temp_list
  25.         else:
  26.             self.particle_img_dict = particle_img_dict
  27.            
  28.         self.particle_list = []
  29.        
  30.         self.framerates = {
  31.             'player_crit': 80,
  32.             'player_down_strike': 80,
  33.             'player_up_strike': 80,
  34.             'player_bullet_explosion': 60,
  35.             'enemy_bullet_explosion': 60,
  36.             'shooter_death': 80,
  37.             'player_mvmt': 75,
  38.             'player_impact': 60,
  39.             'sparks': 40,
  40.             'grass_cut': 90,
  41.             'player_atk1_trail':150
  42.         }    
  43.            
  44.         #print(self.particle_img_dict)
  45.  
  46.     #this is essentially my constructor for each particle
  47.     #it appends a list of attributes to the main particle list
  48.     def add_particle(self, name, x, y, direction, scale, frame_sync, frame):
  49.        
  50.         base_name = name
  51.         if scale != 1:
  52.             #modify name if scale != 1
  53.             name = name + str(scale)
  54.            
  55.             #add new resized frames if not already in particle_img_dict
  56.             if name not in self.particle_img_dict:
  57.                 temp_list = []
  58.                 for img in self.particle_img_dict[base_name]:
  59.                     temp_list.append(pygame.transform.scale(img, (int(img.get_width() * scale), int(img.get_height() * scale))))
  60.                 self.particle_img_dict[name] = temp_list
  61.                
  62.        
  63.         #shift x,y if centered
  64.         if base_name in ('player_bullet_explosion', 'enemy_bullet_explosion', 'player_impact', 'player_mvmt', 'player_crit', 'bloom',
  65.                     'player_atk1_trail', 'sparkle_white'
  66.                     ):#centered particles
  67.             x -= (self.particle_img_dict[base_name][0].get_width()//2)*scale
  68.             y -= (self.particle_img_dict[base_name][0].get_height()//2)*scale
  69.            
  70.         #set update_time
  71.         update_time = pygame.time.get_ticks()
  72.        
  73.         #set frame_update
  74.         if name in self.framerates:
  75.             frame_update = self.framerates[name]
  76.         else:
  77.             frame_update = 100
  78.            
  79.         #set flip
  80.         if direction < 0:
  81.             flip = True
  82.         else:
  83.             flip = False
  84.            
  85.         #set img
  86.         frame_img = self.particle_img_dict[name][frame]
  87.        
  88.         self.particle_list.append([name,        #0
  89.                                    x,           #1
  90.                                    y,           #2
  91.                                    direction,   #3
  92.                                    flip,        #4
  93.                                    scale,       #5
  94.                                    frame_sync,  #6
  95.                                    frame,       #7
  96.                                    frame_img,   #8
  97.                                    update_time, #9
  98.                                    frame_update,#10
  99.                                    base_name    #11
  100.                                    ])
  101.     def empty_list(self):
  102.         for particle0 in self.particle_list:
  103.             particle0 *= 0
  104.        
  105.         self.particle_list *= 0
  106.        
  107.     def move(self, scrollx):#this is my update function for each particle
  108.         for particle0 in self.particle_list:
  109.             # if self.rect.x > 896 or self.rect.x < -96 or self.rect.y > 480 or self.rect.y < -32:
  110.             #     self.Active = False
  111.             #     self.kill()
  112.                
  113.             if particle0[11] == 'shooter_death':
  114.                 particle0[2] -= 0.75*(1/(particle0[6]+1))
  115.                
  116.             if particle0[11] in ('dog_death', 'fly_death', 'walker_death'):
  117.                 particle0[2] -= (1/(particle0[6]+1))
  118.                
  119.             elif particle0[11] == 'player_down_strike':
  120.                 particle0[1] += -particle0[3] * 1
  121.                
  122.             elif particle0[11] == 'rain':
  123.                 particle0[2] += 4
  124.            
  125.             elif particle0[11] == 'dust0':# or self.particle_type == 'player_atk1_trail':
  126.                 particle0[2] -= 1
  127.                 particle0[1] += random.randint(-1, 1)/2
  128.  
  129.             particle0[1] -= scrollx
  130.            
  131.     def force_ini_position(self, scrollx):
  132.         for particle0 in self.particle_list:
  133.             particle0[1] -= scrollx
  134.            
  135.     #I kill my particles at the end of their animation by popping them out of the main list
  136.     def animate(self):
  137.      #still frame particles, IMPORTANT: given frame index cannot exceed the particle frame count
  138.         for particle0 in self.particle_list:
  139.             if particle0[6]: #frame_synch enable
  140.                 if pygame.time.get_ticks() - particle0[9] > particle0[10]:
  141.                     particle0[9] = pygame.time.get_ticks()
  142.                     self.particle_list.pop(self.particle_list.index(particle0))
  143.                    
  144.             #animated particles
  145.             else:
  146.                 #setting the image
  147.                 particle0[8] = self.particle_img_dict[particle0[0]][particle0[7]]
  148.  
  149.                 if pygame.time.get_ticks() - particle0[9] > particle0[10]:
  150.                     particle0[9] = pygame.time.get_ticks()
  151.                     particle0[7] += 1
  152.  
  153.                 #END OF ANIMATION FRAMES    
  154.                 if particle0[7] >= len(self.particle_img_dict[particle0[0]]):
  155.                     self.particle_list.pop(self.particle_list.index(particle0))
  156.    
  157.     #draws each particle in the main list
  158.     def draw(self, screen):
  159.         for particle0 in self.particle_list:
  160.             rect = pygame.rect.Rect(particle0[1], particle0[2], 1, 1)
  161.             screen.blit(pygame.transform.flip(particle0[8], particle0[4], False), rect)
  162.        
  163. #used for ambiance particles
  164. class group_particle2():
  165.     def __init__(self):
  166.         pass
  167.    
  168.     def create_particles(self, loc, area, direction, data_): #data_ = scale, p_type, frame, density, sprite_group
  169.  
  170.         if data_[3] > 0:
  171.             for i in range(data_[3]):
  172.                 data_[4].sprite.add_particle(data_[1], random.randrange(loc[0], area[0]), random.randrange(loc[1], area[1]), direction, data_[0], False, data_[2])
  173.                    
  174.         elif data_[3] < 0:
  175.             if pygame.time.get_ticks()%(-data_[3]) == 0:
  176.                 data_[4].sprite.add_particle(data_[1], random.randrange(loc[0], area[0]), random.randrange(loc[1], area[1]), direction, data_[0], False, data_[2])
  177.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement