Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame, random
- from os import path
- img_dir = path.join(path.dirname(__file__), 'img')
- Width = 480
- Height = 600
- FPS = 60
- Powerup_time = 5000
- White = (255, 255, 255)
- Black = (0, 0, 0)
- Red = (255, 0, 0)
- Green = (0, 255, 0)
- Blue = (0, 0, 255)
- Yellow = (255, 255, 0)
- pygame.init()
- pygame.mixer.init()
- screen = pygame.display.set_mode((Width, Height))
- pygame.display.set_caption("Defender")
- clock = pygame.time.Clock()
- font_name = pygame.font.match_font('arial')
- def draw_text(surf, text, size, x, y):
- font = pygame.font.Font(font_name, size)
- text_surface = font.render(text, True, White)
- text_rect = text_surface.get_rect()
- text_rect.midtop = (x, y)
- surf.blit(text_surface, text_rect)
- def newmob():
- m = Mob()
- all_sprites.add(m)
- mobs.add(m)
- def draw_shield_bar(surf, x, y, pct):
- if pct < 0:
- pct = 0
- Bar_Length = 100
- Bar_Height = 10
- fill = (pct / 100) * Bar_Length
- outline_rect = pygame.Rect(x, y, Bar_Length, Bar_Height)
- fill_rect = pygame.Rect(x, y, fill, Bar_Height)
- pygame.draw.rect(surf, Yellow, fill_rect, Bar_Height)
- pygame.draw.rect(surf, White, outline_rect, 2)
- def draw_lives(surf, x, y, lives, img):
- for i in range(lives):
- img_rect = img.get_rect()
- img_rect.x = x + 30 * i
- img_rect.y = y
- surf.blit(img, img_rect)
- def draw_roundtime(surf, x, y):
- Time_Length = 30
- Time_Height = 10
- pygame.draw.rect(surf, Time_Length, Time_Height)
- class Player(pygame.sprite.Sprite):
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.transform.scale(player_img, (60, 40))
- self.image.set_colorkey(White)
- self.rect = self.image.get_rect()
- self.radius = 14
- self.rect.centerx = Width / 2
- self.rect.bottom = Height - 10
- self.speedx = 0
- self.shield = 100
- self.shoot_delay = 250
- self.last_shot = pygame.time.get_ticks()
- self.lives = 3
- self.hidden = False
- self.hide_timer = pygame.time.get_ticks()
- self.power = 1
- self.power_time = pygame.time.get_ticks()
- def update(self):
- if self.power >= 2 and pygame.time.get_ticks() - self.power_time > Powerup_time:
- self.power -= 1
- self.power_time = pygame.time.get_ticks()
- if self.hidden and pygame.time.get_ticks() - self.hide_timer > 1000:
- self.hidden = False
- self.rect.centerx = (Width / 2)
- self.rect.bottom = Height - 10
- self.speedx = 0
- keystate = pygame.key.get_pressed()
- if keystate[pygame.K_a]:
- self.speedx = -5
- if keystate[pygame.K_d]:
- self.speedx = 5
- if keystate[pygame.K_SPACE]:
- self.shoot()
- self.rect.x += self.speedx
- if self.rect.right > Width:
- self.rect.right = Width
- if self.rect.left < 0:
- self.rect.left = 0
- def powerup(self):
- self.power += 1
- self.power_time = pygame.time.get_ticks()
- def shoot(self):
- now = pygame.time.get_ticks()
- if now - self.last_shot > self.shoot_delay:
- self.last_shot = now
- if self.power == 1:
- bullet = Bullet(self.rect.centerx, self.rect.top)
- all_sprites.add(bullet)
- bullets.add(bullet)
- if self.power >= 2:
- bullet1 = Bullet(self.rect.left, self.rect.centery)
- bullet2 = Bullet(self.rect.right, self.rect.centery)
- all_sprites.add(bullet1)
- all_sprites.add(bullet2)
- bullets.add(bullet1)
- bullets.add(bullet2)
- def hide(self):
- self.hidden = True
- self.hide_timer = pygame.time.get_ticks()
- self.rect.center = (Width / 2, Height + 200)
- class Mob(pygame.sprite.Sprite):
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.transform.scale(enemy_img, (40, 30))
- self.image.set_colorkey(Black)
- self.rect = self.image.get_rect()
- self.radius = 7
- self.rect.x = random.randrange(Width - self.rect.width)
- self.rect.y = random.randrange(-100, -40)
- self.speedy = random.randrange(1, 4)
- self.speedx = random.randrange(-3, 3)
- def update(self):
- self.rect.y += self.speedy
- if self.rect.top > Height + 10 or self.rect.left < -25 or self.rect.right < 25:
- self.rect.x = random.randrange(Width - self.rect.width)
- self.rect.y = random.randrange(-100, -40)
- self.speedy = random.randrange(1, 4)
- class Bullet(pygame.sprite.Sprite):
- def __init__(self, x, y):
- pygame.sprite.Sprite.__init__(self)
- self.image = bullet_img
- self.image.set_colorkey(Black)
- self.rect = self.image.get_rect()
- self.rect.bottom = y
- self.rect.centerx = x
- self.speedy = -10
- def update(self):
- self.rect.y += self.speedy
- if self.rect.bottom < 0:
- self.kill()
- class Pow(pygame.sprite.Sprite):
- def __init__(self, center):
- pygame.sprite.Sprite.__init__(self)
- self.type = random.choice(['shield', 'gun'])
- self.image = powerup_images[self.type]
- self.image.set_colorkey(Black)
- self.rect = self.image.get_rect()
- self.rect.center = center
- self.speedy = 2
- def update(self):
- self.rect.y += self.speedy
- if self.rect.top > Height:
- self.kill()
- class Boss(pygame.sprite.Sprite):
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.transform.scale(boss_img, (150, 200))
- self.image.set_colorkey(Black)
- self.rect = self.image.get_rect()
- self.rect.center = ((Width / 2, -70))
- self.speedy = 1
- self.shoot_delay = 250
- self.last_shot = pygame.time.get_ticks()
- self.hp = 150
- self.dead = False
- def update(self):
- if self.hp <= 25:
- self.speedy = 3
- def show_go_screen():
- screen.blit(background, background_rect)
- draw_text(screen, "Defender", 64, Width / 2, Height / 4)
- draw_text(screen, "A and D to move, Space to fire", 22, Width / 2, Height / 2)
- draw_text(screen, "Press any key to begin", 18, Width / 2, Height * 3 / 4)
- pygame.display.flip()
- waiting = True
- while waiting:
- clock.tick(FPS)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- if event.type == pygame.KEYUP:
- waiting = False
- background = pygame.image.load(path.join(img_dir, "grass00.png")).convert()
- background_rect = background.get_rect()
- player_img = pygame.image.load(path.join(img_dir, 'Hero.png')).convert()
- player_mini_img = pygame.transform.scale(player_img, (36, 28))
- player_mini_img.set_colorkey(White)
- enemy_img = pygame.image.load(path.join(img_dir, 'Zombie.png')).convert()
- boss_img = pygame.image.load(path.join(img_dir, 'Daddy Big Boi.png')).convert()
- bullet_img = pygame.image.load(path.join(img_dir, 'bullet.png')).convert()
- powerup_images = {}
- powerup_images['shield'] = pygame.image.load(path.join(img_dir, 'Shield.png')).convert()
- powerup_images['gun'] = pygame.image.load(path.join(img_dir, 'Gun.png')).convert()
- game_over = True
- running = True
- while running:
- if game_over:
- show_go_screen()
- game_over = False
- all_sprites = pygame.sprite.Group()
- mobs = pygame.sprite.Group()
- bullets = pygame.sprite.Group()
- powerups = pygame.sprite.Group()
- player = Player()
- all_sprites.add(player)
- for i in range(6):
- newmob()
- score = 0
- clock.tick(FPS)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- all_sprites.update()
- hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
- for hit in hits:
- score += 10
- if random.random() > 0.9:
- pow = Pow(hit.rect.center)
- all_sprites.add(pow)
- powerups.add(pow)
- newmob()
- hits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)
- for hit in hits:
- player.shield -= 20
- newmob()
- if player.shield <= 0:
- player.hide()
- player.lives -= 1
- player.shield = 100
- hits = pygame.sprite.spritecollide(player, powerups, True)
- for hit in hits:
- if hit.type == 'shield':
- player.shield += random.randrange(10, 30)
- if player.shield >= 100:
- player.shield = 100
- if hit.type == 'gun':
- player.powerup()
- hits = pygame.sprite.spritecollide(player, Boss, True)
- for hit in hits:
- player.lives = 0
- hits = pygame.sprite.spritecollide(Boss, bullets, True)
- for hit in hits:
- boss.hp -= 10
- if boss.hp == 0:
- game_over = True
- if player.lives == 0:
- game_over = True
- screen.fill(Black)
- screen.blit(background, background_rect)
- all_sprites.draw(screen)
- draw_text(screen, str(score), 18, Width / 2, 10)
- draw_lives(screen, Width - 100, 5, player.lives, player_mini_img)
- draw_shield_bar(screen, 5, 5, player.shield)
- pygame.display.flip()
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement