Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- import random
- from pygame.sprite import Group, Sprite, spritecollide, groupcollide
- # Replace images with zombie, bullet, and player image.
- # You have a start of a zombie madness game.
- class Entity(Sprite):
- def __init__(self, image, position, velocity, vector, anchor="topleft"):
- Sprite.__init__(self)
- self.image = image
- self.rect = image.get_rect(**{anchor: position})
- self.position = pygame.Vector2(self.rect.center)
- self.velocity = velocity
- self.vector = vector
- def update(self, delta):
- if self.vector != pygame.Vector2():
- self.position += self.vector * self.velocity * delta
- self.rect.center = self.position
- class Bullet(Entity):
- def __init__(self, image, position, velocity, vector, anchor="topleft"):
- Entity.__init__(self, image, position, velocity, vector, anchor)
- angle = vector.as_polar()[1]
- self.image = pygame.transform.rotate(self.image, -angle)
- def update(self, delta, bounds):
- Entity.update(self, delta)
- if not bounds.colliderect(self.rect):
- self.kill()
- class Enemy(Entity):
- def __init__(self, image, position, velocity, vector, anchor="topleft"):
- Entity.__init__(self, image, position, velocity, vector, anchor)
- def update(self, delta, player_position):
- vector = (player_position - self.position).normalize()
- self.position += delta * self.velocity * vector
- self.rect.center = self.position
- class Game:
- def __init__(self):
- # Basic Pygame Setup
- pygame.display.set_caption("Example")
- self.surface = pygame.display.set_mode((800, 600))
- self.rect = self.surface.get_rect()
- self.clock = pygame.time.Clock()
- self.running = True
- self.delta = 0
- self.fps = 60
- # Game Variables
- self.enemy_velocity = 50
- self.enemy_distance = 50
- self.player_velocity = 70
- self.bullet_velocity = 150
- self.images = {
- "player" : self.create_image(pygame.Color("dodgerblue"), (30, 30)),
- "enemy" : self.create_image(pygame.Color("firebrick"), (15, 15)),
- "bullet" : self.create_image(pygame.Color("lawngreen"), (6, 2))
- }
- self.player = Entity(self.images["player"], self.rect.center, self.player_velocity, pygame.Vector2(0,0))
- self.sprites = Group(self.player)
- self.bullets = Group()
- self.enemies = Group()
- def add_enemy(self):
- rnd = random.randint
- width = self.rect.width - self.images["enemy"].get_width()
- height = self.rect.height - self.images["enemy"].get_height()
- while True:
- position = rnd(0, width), rnd(0, height)
- if pygame.Vector2(position).distance_to(self.player.position) > self.enemy_distance:
- break
- vector = (pygame.Vector2(position) - self.player.position).normalize()
- enemy = Enemy(self.images["enemy"], position, self.enemy_velocity, vector)
- enemy.add(self.sprites, self.enemies)
- def add_bullet(self, mposition):
- vector = (mposition - self.player.position).normalize()
- width = self.rect.width - self.images["bullet"].get_width()
- height = self.rect.height - self.images["bullet"].get_height()
- position = self.player.position + vector * 12
- bullet = Bullet(self.images["bullet"], position, self.bullet_velocity, vector, "center")
- bullet.add(self.sprites, self.bullets)
- def create_image(self, color, size):
- surface = pygame.Surface(size, pygame.SRCALPHA)
- surface.fill(color)
- return surface
- def is_pressed(self, pressed, *keys):
- for key in keys:
- if pressed[key]:
- return True
- return False
- def load_image(self, filename, name, alpha=False):
- if alpha:
- self.images[name] = pygame.image.load(filename).convert_alpha()
- else:
- self.images[name] = pygame.image.load(filename).convert()
- def main_loop(self):
- while self.running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- self.running = False
- elif event.type == pygame.MOUSEBUTTONDOWN:
- if event.button == 1:
- self.add_bullet(event.pos)
- # Update
- direction = pygame.Vector2()
- pressed = pygame.key.get_pressed()
- if self.is_pressed(pressed, pygame.K_UP, pygame.K_w, pygame.K_z):
- direction.y -= 1
- if self.is_pressed(pressed, pygame.K_DOWN, pygame.K_s):
- direction.y += 1
- if self.is_pressed(pressed, pygame.K_LEFT, pygame.K_a):
- direction.x -= 1
- if self.is_pressed(pressed, pygame.K_RIGHT, pygame.K_d):
- direction.x += 1
- # Move in circle instead of
- if direction != pygame.Vector2():
- direction.normalize_ip()
- self.player.vector = direction
- self.player.update(self.delta)
- self.enemies.update(self.delta, self.player.position)
- self.bullets.update(self.delta, self.rect)
- if len(self.enemies) < 2:
- self.add_enemy()
- killed = groupcollide(self.bullets, self.enemies, True, True)
- # Draw
- self.surface.fill(pygame.Color("black"))
- self.sprites.draw(self.surface)
- # Render to screen
- pygame.display.flip()
- # Idle & Sleep
- self.delta = self.clock.tick(self.fps) * 0.001
- # Clean Exit
- pygame.quit()
- def main():
- pygame.init()
- game = Game()
- game.main_loop()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement