Advertisement
Windspar

Pygame sprite and group shooting example

Aug 13th, 2021
1,692
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.87 KB | None | 0 0
  1. import pygame
  2. import random
  3.  
  4. # This will hold and manage images.
  5. # Because you want to create, load, and/or alter once.
  6. # Rotating can be exception.
  7. class Images:
  8.     def __init__(self):
  9.         self.create()
  10.  
  11.     def create(self):
  12.         self.player = pygame.Surface((20, 20), pygame.SRCALPHA)
  13.         self.player.fill((0, 0, 0, 0))
  14.         color = pygame.Color("dodgerblue")
  15.         pygame.draw.polygon(self.player, color, ((10, 0), (0, 19), (19, 19)), 1)
  16.  
  17.         # Bullet on x-axis. Works with vector angle
  18.         # If head is -x. Rotate +y to work with vector angle
  19.         self.bullet = pygame.Surface((6, 2), pygame.SRCALPHA)
  20.         self.bullet.fill(pygame.Color("lawngreen"))
  21.  
  22.         colors = "orange", "purple", "grey60"
  23.         self.enemies = []
  24.         for color in colors:
  25.             surface = pygame.Surface((10, 10), pygame.SRCALPHA)
  26.             surface.fill(pygame.Color(color))
  27.             self.enemies.append(surface)
  28.  
  29. class Entity(pygame.sprite.Sprite):
  30.     def __init__(self, image, position, anchor="topleft"):
  31.         # Initialize sprite
  32.         super().__init__()
  33.         # Set image reference
  34.         self.image = image
  35.         # Get rect. **{} just unpack a dict
  36.         self.rect = image.get_rect(**{anchor: position})
  37.         # Use vector2 to hold floats and for built in math
  38.         self.position = pygame.Vector2(self.rect.center)
  39.  
  40.     def bound_check(self, area):
  41.         pass
  42.  
  43.     def move(self, x, y):
  44.         self.position += (x, y)
  45.         self.rect.center = self.position
  46.  
  47.     def move_vector(self, v):
  48.         self.position += v
  49.         self.rect.center = self.position
  50.  
  51.     def update(self, delta):
  52.         pass
  53.  
  54. class Player(Entity):
  55.     def __init__(self, image, position, gun):
  56.         super().__init__(image, position, "bottomleft")
  57.         self.velocity = 80
  58.         self.gun = gun
  59.  
  60.     def bound_check(self, area):
  61.         clamp = self.rect.clamp(area)
  62.         if self.rect.x != clamp.x or self.rect.y != clamp.y:
  63.             self.rect = clamp
  64.             self.position = pygame.Vector2(self.rect.center)
  65.  
  66.     def update(self, delta):
  67.         self.gun.update(delta)
  68.         key_state = pygame.key.get_pressed()
  69.         mouse_state = pygame.mouse.get_pressed()
  70.         x = 0
  71.         if key_state[pygame.K_LEFT] or key_state[pygame.K_a]:
  72.             x = -1
  73.         elif key_state[pygame.K_RIGHT] or key_state[pygame.K_d]:
  74.             x = 1
  75.  
  76.         if key_state[pygame.K_SPACE] or mouse_state[0]:
  77.             self.gun.fire(self)
  78.  
  79.         if x != 0:
  80.             x *= self.velocity * delta
  81.             self.move(x, 0)
  82.  
  83. class Gun:
  84.     def __init__(self, image, groups, velocity, fire_rate):
  85.         self.ticks = 0
  86.         self.image = image
  87.         self.groups = groups
  88.         self.velocity = velocity
  89.         self.fire_rate = fire_rate
  90.  
  91.     def fire(self, entity):
  92.         if self.ticks == 0:
  93.             mpos = pygame.Vector2(pygame.mouse.get_pos())
  94.             vector = (mpos - entity.position).normalize()
  95.             position = entity.position + vector * entity.rect.width / 2
  96.             bullet = Bullet(self.image, 180, vector, position)
  97.             bullet.add(self.groups)
  98.             self.ticks = self.fire_rate
  99.  
  100.     def update(self, delta):
  101.         if self.ticks > 0:
  102.             self.ticks -= delta
  103.             if self.ticks < 0:
  104.                 self.ticks = 0
  105.  
  106. class Bullet(Entity):
  107.     def __init__(self, image, velocity, vector, position):
  108.         angle = vector.as_polar()[1]
  109.         image = pygame.transform.rotate(image, -angle)
  110.         super().__init__(image, position, "center")
  111.         self.velocity = velocity
  112.         self.vector = vector
  113.  
  114.     def bound_check(self, area):
  115.         if not self.rect.colliderect(area):
  116.             self.kill()
  117.  
  118.     def update(self, delta):
  119.         self.move_vector(self.vector * self.velocity * delta)
  120.  
  121. class Game:
  122.     def __init__(self, caption, width, height, flags=0):
  123.         pygame.display.set_caption(caption)
  124.         self.surface = pygame.display.set_mode((width, height), flags)
  125.         self.rect = self.surface.get_rect()
  126.         self.clock = pygame.time.Clock()
  127.         self.running = False
  128.         self.delta = 0
  129.         self.fps = 0
  130.  
  131.         self.images = Images()
  132.         self.background = pygame.Color("black")
  133.  
  134.         self.sprites = pygame.sprite.Group()
  135.         self.enemies = pygame.sprite.Group()
  136.         self.bullets = pygame.sprite.Group()
  137.         # Player
  138.         gun = Gun(self.images.bullet, (self.sprites, self.bullets), 180, .3)
  139.         position = self.rect.centerx, self.rect.bottom - 20
  140.         self.player = Player(self.images.player, position, gun)
  141.         self.sprites.add(self.player)
  142.         # Enemies
  143.         for x in range(50, self.rect.width, 50):
  144.             for y in range(40, self.rect.height - 100, 50):
  145.                 image = random.choice(self.images.enemies)
  146.                 enemy = Entity(image, (x, y), "center")
  147.                 enemy.add(self.sprites, self.enemies)
  148.  
  149.     def draw(self):
  150.         self.surface.fill(self.background)
  151.         self.sprites.draw(self.surface)
  152.  
  153.     def mainloop(self):
  154.         self.running = True
  155.         while self.running:
  156.             # Event loop
  157.             for event in pygame.event.get():
  158.                 if event.type == pygame.QUIT:
  159.                     self.running = False
  160.  
  161.             self.update()
  162.             self.draw()
  163.             pygame.display.flip()
  164.             # Delta time for smooth movement
  165.             self.delta = self.clock.tick(self.fps) * 0.001
  166.  
  167.     def update(self):
  168.         self.sprites.update(self.delta)
  169.         self.player.bound_check(self.rect)
  170.         for bullet in self.bullets:
  171.             bullet.bound_check(self.rect)
  172.  
  173.         collision = pygame.sprite.groupcollide(self.bullets, self.enemies, True, True)
  174.  
  175. if __name__ == "__main__":
  176.     pygame.init()
  177.     game = Game("Shoot Them", 800, 600)
  178.     game.mainloop()
  179.     pygame.quit()
  180.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement