Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- from pygame.sprite import Sprite, Group
- from types import SimpleNamespace
- color = SimpleNamespace(**pygame.color.THECOLORS)
- class Scene:
- def __init__(self, manager):
- self.manager = manager
- def on_draw(self, surface): pass
- def on_event(self, event): pass
- def on_update(self, delta): pass
- class Manager:
- def __init__(self, caption, width, height, flags=0):
- # Basic pygame setup
- pygame.display.set_caption(caption)
- self.surface = pygame.display.set_mode((width, height), flags)
- self.rect = self.surface.get_rect()
- self.clock = pygame.time.Clock()
- self.running = False
- self.delta = 0
- self.fps = 60
- self.scene = Scene(self)
- def mainloop(self):
- self.running = True
- while self.running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- self.running = False
- else:
- self.scene.on_event(event)
- self.scene.on_update(self.delta)
- self.scene.on_draw(self.surface)
- pygame.display.flip()
- self.delta = self.clock.tick(self.fps)
- class Bullet(Sprite):
- def __init__(self, image, position, direction, speed, distance):
- Sprite.__init__(self)
- self.image = image
- self.speed = speed * 0.001
- self.distance = distance
- self.direction = direction
- self.rect = image.get_rect(topleft=position)
- self.position = pygame.Vector2(self.rect.topleft)
- self.start_position = pygame.Vector2(self.rect.topleft)
- def update(self, delta):
- self.position += self.direction * self.speed * delta
- self.rect.topleft = self.position
- if self.position.distance_to(self.start_position) > self.distance:
- self.kill()
- class MySprite(Sprite):
- def __init__(self, image, position, anchor="topleft"):
- Sprite.__init__(self)
- self.image = image
- self.rect = image.get_rect(**{anchor: position})
- def draw(self, surface):
- surface.blit(self.image, self.rect)
- class Movement:
- def __init__(self, sprite, speed,
- up = (pygame.K_UP, pygame.K_w),
- down = (pygame.K_DOWN, pygame.K_s),
- left = (pygame.K_LEFT, pygame.K_a),
- right = (pygame.K_RIGHT, pygame.K_d)):
- self.sprite = sprite
- self.speed = speed * 0.001
- self.position = pygame.Vector2(sprite.rect.center)
- self.up = up
- self.down = down
- self.left = left
- self.right = right
- def move(self, delta, keys):
- direction = pygame.Vector2(0, 0)
- if any([keys[k] for k in self.up]):
- direction.y = -1
- elif any([keys[k] for k in self.down]):
- direction.y = 1
- if any([keys[k] for k in self.left]):
- direction.x = -1
- elif any([keys[k] for k in self.right]):
- direction.x = 1
- if direction != pygame.Vector2(0, 0):
- direction.normalize_ip()
- self.position += direction * self.speed * delta
- self.sprite.rect.center = self.position
- class Player:
- def __init__(self, position, anchor="topleft"):
- image = pygame.Surface((20, 20))
- image.fill(color.firebrick)
- self.bullet_image = pygame.Surface((2, 2))
- self.bullet_image.fill(color.gray30)
- self.sprite = MySprite(image, position, anchor)
- self.movement = Movement(self.sprite, 50)
- self.bullets = Group()
- def draw(self, surface):
- self.sprite.draw(surface)
- self.bullets.draw(surface)
- def shoot_bullet(self, event):
- direction = (pygame.Vector2(event.pos) - self.movement.position).normalize()
- self.bullets.add(Bullet(self.bullet_image, self.movement.position, direction, 200, 300))
- def update(self, delta, keys):
- self.bullets.update(delta)
- self.movement.move(delta, keys)
- class GameScene(Scene):
- def __init__(self, manager):
- Scene.__init__(self, manager)
- self.player = Player(manager.rect.center, "center")
- def on_draw(self, surface):
- surface.fill(color.black)
- self.player.draw(surface)
- def on_event(self, event):
- if event.type == pygame.MOUSEBUTTONDOWN:
- if event.button == 1:
- self.player.shoot_bullet(event)
- def on_update(self, delta):
- keys = pygame.key.get_pressed()
- self.player.update(delta, keys)
- if __name__ == "__main__":
- pygame.init()
- manager = Manager("Bullet Shooting Example", 800, 600)
- manager.scene = GameScene(manager)
- manager.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement