Advertisement
Windspar

Pygame Sprite & Group Shooting Example

Mar 18th, 2021
1,346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.82 KB | None | 0 0
  1. import pygame
  2. import random
  3. from pygame.sprite import Group, Sprite, spritecollide, groupcollide
  4.  
  5. # Replace images with zombie, bullet, and player image.
  6. # You have a start of a zombie madness game.
  7.  
  8.  
  9. class Entity(Sprite):
  10.     def __init__(self, image, position, velocity, vector, anchor="topleft"):
  11.         Sprite.__init__(self)
  12.         self.image = image
  13.         self.rect = image.get_rect(**{anchor: position})
  14.         self.position = pygame.Vector2(self.rect.center)
  15.         self.velocity = velocity
  16.         self.vector = vector
  17.  
  18.     def update(self, delta):
  19.         if self.vector != pygame.Vector2():
  20.             self.position += self.vector * self.velocity * delta
  21.             self.rect.center = self.position
  22.  
  23. class Bullet(Entity):
  24.     def __init__(self, image, position, velocity, vector, anchor="topleft"):
  25.         Entity.__init__(self, image, position, velocity, vector, anchor)
  26.         angle = vector.as_polar()[1]
  27.         self.image = pygame.transform.rotate(self.image, -angle)
  28.  
  29.     def update(self, delta, bounds):
  30.         Entity.update(self, delta)
  31.         if not bounds.colliderect(self.rect):
  32.             self.kill()
  33.  
  34. class Enemy(Entity):
  35.     def __init__(self, image, position, velocity, vector, anchor="topleft"):
  36.         Entity.__init__(self, image, position, velocity, vector, anchor)
  37.  
  38.     def update(self, delta, player_position):
  39.         vector = (player_position - self.position).normalize()
  40.         self.position += delta * self.velocity * vector
  41.         self.rect.center = self.position
  42.  
  43. class Game:
  44.     def __init__(self):
  45.         # Basic Pygame Setup
  46.         pygame.display.set_caption("Example")
  47.         self.surface = pygame.display.set_mode((800, 600))
  48.         self.rect = self.surface.get_rect()
  49.         self.clock = pygame.time.Clock()
  50.         self.running = True
  51.         self.delta = 0
  52.         self.fps = 60
  53.  
  54.         # Game Variables
  55.         self.enemy_velocity = 50
  56.         self.enemy_distance = 50
  57.         self.player_velocity = 70
  58.         self.bullet_velocity = 150
  59.         self.images = {
  60.             "player" : self.create_image(pygame.Color("dodgerblue"), (30, 30)),
  61.             "enemy" : self.create_image(pygame.Color("firebrick"), (15, 15)),
  62.             "bullet" : self.create_image(pygame.Color("lawngreen"), (6, 2))
  63.         }
  64.  
  65.         self.player = Entity(self.images["player"], self.rect.center, self.player_velocity, pygame.Vector2(0,0))
  66.         self.sprites = Group(self.player)
  67.         self.bullets = Group()
  68.         self.enemies = Group()
  69.  
  70.     def add_enemy(self):
  71.         rnd = random.randint
  72.         width = self.rect.width - self.images["enemy"].get_width()
  73.         height = self.rect.height - self.images["enemy"].get_height()
  74.         while True:
  75.             position = rnd(0, width), rnd(0, height)
  76.             if pygame.Vector2(position).distance_to(self.player.position) > self.enemy_distance:
  77.                 break
  78.  
  79.         vector = (pygame.Vector2(position) - self.player.position).normalize()
  80.         enemy = Enemy(self.images["enemy"], position, self.enemy_velocity, vector)
  81.         enemy.add(self.sprites, self.enemies)
  82.  
  83.     def add_bullet(self, mposition):
  84.         vector = (mposition - self.player.position).normalize()
  85.         width = self.rect.width - self.images["bullet"].get_width()
  86.         height = self.rect.height - self.images["bullet"].get_height()
  87.         position = self.player.position + vector * 12
  88.         bullet = Bullet(self.images["bullet"], position, self.bullet_velocity, vector, "center")
  89.         bullet.add(self.sprites, self.bullets)
  90.  
  91.     def create_image(self, color, size):
  92.         surface = pygame.Surface(size, pygame.SRCALPHA)
  93.         surface.fill(color)
  94.         return surface
  95.  
  96.     def is_pressed(self, pressed, *keys):
  97.         for key in keys:
  98.             if pressed[key]:
  99.                 return True
  100.  
  101.         return False
  102.  
  103.     def load_image(self, filename, name, alpha=False):
  104.         if alpha:
  105.             self.images[name] = pygame.image.load(filename).convert_alpha()
  106.         else:
  107.             self.images[name] = pygame.image.load(filename).convert()
  108.  
  109.     def main_loop(self):
  110.         while self.running:
  111.             for event in pygame.event.get():
  112.                 if event.type == pygame.QUIT:
  113.                     self.running = False
  114.                 elif event.type == pygame.MOUSEBUTTONDOWN:
  115.                     if event.button == 1:
  116.                         self.add_bullet(event.pos)
  117.  
  118.             # Update
  119.             direction = pygame.Vector2()
  120.             pressed = pygame.key.get_pressed()
  121.  
  122.             if self.is_pressed(pressed, pygame.K_UP, pygame.K_w, pygame.K_z):
  123.                 direction.y -= 1
  124.  
  125.             if self.is_pressed(pressed, pygame.K_DOWN, pygame.K_s):
  126.                 direction.y += 1
  127.  
  128.             if self.is_pressed(pressed, pygame.K_LEFT, pygame.K_a):
  129.                 direction.x -= 1
  130.  
  131.             if self.is_pressed(pressed, pygame.K_RIGHT, pygame.K_d):
  132.                 direction.x += 1
  133.  
  134.             # Move in circle instead of
  135.             if direction != pygame.Vector2():
  136.                 direction.normalize_ip()
  137.  
  138.             self.player.vector = direction
  139.             self.player.update(self.delta)
  140.             self.enemies.update(self.delta, self.player.position)
  141.             self.bullets.update(self.delta, self.rect)
  142.  
  143.             if len(self.enemies) < 2:
  144.                 self.add_enemy()
  145.  
  146.             killed = groupcollide(self.bullets, self.enemies, True, True)
  147.  
  148.             # Draw
  149.             self.surface.fill(pygame.Color("black"))
  150.             self.sprites.draw(self.surface)
  151.  
  152.             # Render to screen
  153.             pygame.display.flip()
  154.  
  155.             # Idle & Sleep
  156.             self.delta = self.clock.tick(self.fps) * 0.001
  157.  
  158.         # Clean Exit
  159.         pygame.quit()
  160.  
  161. def main():
  162.     pygame.init()
  163.     game = Game()
  164.     game.main_loop()
  165.  
  166. main()
  167.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement