Advertisement
Windspar

Pygame Shooting Bullets With Mouse

Jan 1st, 2020
645
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.73 KB | None | 0 0
  1. import pygame
  2. from pygame.sprite import Sprite, Group
  3. from types import SimpleNamespace
  4.  
  5. color = SimpleNamespace(**pygame.color.THECOLORS)
  6.  
  7. class Scene:
  8.     def __init__(self, manager):
  9.         self.manager = manager
  10.  
  11.     def on_draw(self, surface): pass
  12.     def on_event(self, event): pass
  13.     def on_update(self, delta): pass
  14.  
  15. class Manager:
  16.     def __init__(self, caption, width, height, flags=0):
  17.         # Basic pygame setup
  18.         pygame.display.set_caption(caption)
  19.         self.surface = pygame.display.set_mode((width, height), flags)
  20.         self.rect = self.surface.get_rect()
  21.         self.clock = pygame.time.Clock()
  22.         self.running = False
  23.         self.delta = 0
  24.         self.fps = 60
  25.  
  26.         self.scene = Scene(self)
  27.  
  28.     def mainloop(self):
  29.         self.running = True
  30.         while self.running:
  31.             for event in pygame.event.get():
  32.                 if event.type == pygame.QUIT:
  33.                     self.running = False
  34.                 else:
  35.                     self.scene.on_event(event)
  36.  
  37.             self.scene.on_update(self.delta)
  38.             self.scene.on_draw(self.surface)
  39.             pygame.display.flip()
  40.             self.delta = self.clock.tick(self.fps)
  41.  
  42. class Bullet(Sprite):
  43.     def __init__(self, image, position, direction, speed, distance):
  44.         Sprite.__init__(self)
  45.         self.image = image
  46.         self.speed = speed * 0.001
  47.         self.distance = distance
  48.         self.direction = direction
  49.         self.rect = image.get_rect(topleft=position)
  50.         self.position = pygame.Vector2(self.rect.topleft)
  51.         self.start_position = pygame.Vector2(self.rect.topleft)
  52.  
  53.     def update(self, delta):
  54.         self.position += self.direction * self.speed * delta
  55.         self.rect.topleft = self.position
  56.         if self.position.distance_to(self.start_position) > self.distance:
  57.             self.kill()
  58.  
  59. class MySprite(Sprite):
  60.     def __init__(self, image, position, anchor="topleft"):
  61.         Sprite.__init__(self)
  62.         self.image = image
  63.         self.rect = image.get_rect(**{anchor: position})
  64.  
  65.     def draw(self, surface):
  66.         surface.blit(self.image, self.rect)
  67.  
  68. class Movement:
  69.     def __init__(self, sprite, speed,
  70.                  up = (pygame.K_UP, pygame.K_w),
  71.                  down = (pygame.K_DOWN, pygame.K_s),
  72.                  left = (pygame.K_LEFT, pygame.K_a),
  73.                  right = (pygame.K_RIGHT, pygame.K_d)):
  74.  
  75.         self.sprite = sprite
  76.         self.speed = speed * 0.001
  77.         self.position = pygame.Vector2(sprite.rect.center)
  78.  
  79.         self.up = up
  80.         self.down = down
  81.         self.left = left
  82.         self.right = right
  83.  
  84.     def move(self, delta, keys):
  85.         direction = pygame.Vector2(0, 0)
  86.         if any([keys[k] for k in self.up]):
  87.             direction.y = -1
  88.         elif any([keys[k] for k in self.down]):
  89.             direction.y = 1
  90.  
  91.         if any([keys[k] for k in self.left]):
  92.             direction.x = -1
  93.         elif any([keys[k] for k in self.right]):
  94.             direction.x = 1
  95.  
  96.         if direction != pygame.Vector2(0, 0):
  97.             direction.normalize_ip()
  98.             self.position += direction * self.speed * delta
  99.             self.sprite.rect.center = self.position
  100.  
  101. class Player:
  102.     def __init__(self, position, anchor="topleft"):
  103.         image = pygame.Surface((20, 20))
  104.         image.fill(color.firebrick)
  105.  
  106.         self.bullet_image = pygame.Surface((2, 2))
  107.         self.bullet_image.fill(color.gray30)
  108.  
  109.         self.sprite = MySprite(image, position, anchor)
  110.         self.movement = Movement(self.sprite, 50)
  111.         self.bullets = Group()
  112.  
  113.     def draw(self, surface):
  114.         self.sprite.draw(surface)
  115.         self.bullets.draw(surface)
  116.  
  117.     def shoot_bullet(self, event):
  118.         direction = (pygame.Vector2(event.pos) - self.movement.position).normalize()
  119.         self.bullets.add(Bullet(self.bullet_image, self.movement.position, direction, 200, 300))
  120.  
  121.     def update(self, delta, keys):
  122.         self.bullets.update(delta)
  123.         self.movement.move(delta, keys)
  124.  
  125. class GameScene(Scene):
  126.     def __init__(self, manager):
  127.         Scene.__init__(self, manager)
  128.         self.player = Player(manager.rect.center, "center")
  129.  
  130.     def on_draw(self, surface):
  131.         surface.fill(color.black)
  132.         self.player.draw(surface)
  133.  
  134.     def on_event(self, event):
  135.         if event.type == pygame.MOUSEBUTTONDOWN:
  136.             if event.button == 1:
  137.                 self.player.shoot_bullet(event)
  138.  
  139.     def on_update(self, delta):
  140.         keys = pygame.key.get_pressed()
  141.         self.player.update(delta, keys)
  142.  
  143. if __name__ == "__main__":
  144.     pygame.init()
  145.     manager = Manager("Bullet Shooting Example", 800, 600)
  146.     manager.scene = GameScene(manager)
  147.     manager.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement