ClearCode

main.py (final)

Mar 22nd, 2022
3,847
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.19 KB | None | 0 0
  1. import pygame,sys,time
  2. from settings import *
  3. from sprites import Player, Ball, Block, Upgrade, Projectile
  4. from surfacemaker import SurfaceMaker
  5. from random import choice, randint
  6.  
  7. class Game:
  8.     def __init__(self):
  9.        
  10.         # general setup
  11.         pygame.init()
  12.         self.display_surface = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))
  13.         pygame.display.set_caption('Breakout')
  14.  
  15.         # background
  16.         self.bg = self.create_bg()
  17.  
  18.         # sprite group setup
  19.         self.all_sprites = pygame.sprite.Group()
  20.         self.block_sprites = pygame.sprite.Group()
  21.         self.upgrade_sprites = pygame.sprite.Group()
  22.         self.projectile_sprites = pygame.sprite.Group()
  23.  
  24.         # setup
  25.         self.surfacemaker = SurfaceMaker()
  26.         self.player = Player(self.all_sprites,self.surfacemaker)
  27.         self.stage_setup()
  28.         self.ball = Ball(self.all_sprites,self.player,self.block_sprites)
  29.  
  30.         # hearts
  31.         self.heart_surf = pygame.image.load('../graphics/other/heart.png').convert_alpha()
  32.  
  33.         # projectile
  34.         self.projectile_surf = pygame.image.load('../graphics/other/projectile.png').convert_alpha()
  35.         self.can_shoot = True
  36.         self.shoot_time = 0
  37.  
  38.         # crt
  39.         self.crt = CRT()
  40.  
  41.         self.laser_sound = pygame.mixer.Sound('../sounds/laser.wav')
  42.         self.laser_sound.set_volume(0.1)
  43.  
  44.         self.powerup_sound = pygame.mixer.Sound('../sounds/powerup.wav')
  45.         self.powerup_sound.set_volume(0.1)
  46.  
  47.         self.laserhit_sound = pygame.mixer.Sound('../sounds/laser_hit.wav')
  48.         self.laserhit_sound.set_volume(0.02)
  49.  
  50.         self.music = pygame.mixer.Sound('../sounds/music.wav')
  51.         self.music.set_volume(0.1)
  52.         self.music.play(loops = -1)
  53.  
  54.     def create_upgrade(self,pos):
  55.         upgrade_type = choice(UPGRADES)
  56.         Upgrade(pos,upgrade_type,[self.all_sprites,self.upgrade_sprites])
  57.  
  58.     def create_bg(self):
  59.         bg_original = pygame.image.load('../graphics/other/bg.png').convert()
  60.         scale_factor = WINDOW_HEIGHT / bg_original.get_height()
  61.         scaled_width = bg_original.get_width() * scale_factor
  62.         scaled_height = bg_original.get_height() * scale_factor
  63.         scaled_bg = pygame.transform.scale(bg_original,(scaled_width,scaled_height))
  64.         return scaled_bg
  65.  
  66.     def stage_setup(self):
  67.         # cycle through all rows and columns of BLOCK MAP
  68.         for row_index, row in enumerate(BLOCK_MAP):
  69.             for col_index, col in enumerate(row):
  70.                 if col != ' ':
  71.                     # find the x and y position for each individual block
  72.                     x = col_index * (BLOCK_WIDTH + GAP_SIZE) + GAP_SIZE // 2
  73.                     y = TOP_OFFSET + row_index * (BLOCK_HEIGHT + GAP_SIZE) + GAP_SIZE // 2
  74.                     Block(col,(x,y),[self.all_sprites,self.block_sprites],self.surfacemaker,self.create_upgrade)
  75.  
  76.     def display_hearts(self):
  77.         for i in range(self.player.hearts):
  78.             x = 2 + i * (self.heart_surf.get_width() + 2)
  79.             self.display_surface.blit(self.heart_surf,(x,4))
  80.  
  81.     def upgrade_collision(self):
  82.         overlap_sprites = pygame.sprite.spritecollide(self.player,self.upgrade_sprites,True)
  83.         for sprite in overlap_sprites:
  84.             self.player.upgrade(sprite.upgrade_type)
  85.             self.powerup_sound.play()
  86.  
  87.     def create_projectile(self):
  88.         self.laser_sound.play()
  89.         for projectile in self.player.laser_rects:
  90.             Projectile(
  91.                 projectile.midtop - pygame.math.Vector2(0,30),
  92.                 self.projectile_surf,
  93.                 [self.all_sprites, self.projectile_sprites])
  94.  
  95.     def laser_timer(self):
  96.         if pygame.time.get_ticks() - self.shoot_time >= 500:
  97.             self.can_shoot = True
  98.  
  99.     def projectile_block_collision(self):
  100.         for projectile in self.projectile_sprites:
  101.             overlap_sprites  = pygame.sprite.spritecollide(projectile,self.block_sprites,False)
  102.             if overlap_sprites:
  103.                 for sprite in overlap_sprites:
  104.                     sprite.get_damage(1)
  105.                 projectile.kill()
  106.                 self.laserhit_sound.play()
  107.  
  108.     def run(self):
  109.         last_time = time.time()
  110.         while True:
  111.            
  112.             # delta time
  113.             dt = time.time() - last_time
  114.             last_time = time.time()
  115.  
  116.             # event loop
  117.             for event in pygame.event.get():
  118.                 if event.type == pygame.QUIT or self.player.hearts <= 0:
  119.                     pygame.quit()
  120.                     sys.exit()
  121.                 if event.type == pygame.KEYDOWN:
  122.                     if event.key == pygame.K_SPACE:
  123.                         self.ball.active = True
  124.                         if self.can_shoot:
  125.                             self.create_projectile()
  126.                             self.can_shoot = False
  127.                             self.shoot_time = pygame.time.get_ticks()
  128.  
  129.             # draw bg
  130.             self.display_surface.blit(self.bg,(0,0))
  131.            
  132.             # update the game
  133.             self.all_sprites.update(dt)
  134.             self.upgrade_collision()
  135.             self.laser_timer()
  136.             self.projectile_block_collision()
  137.  
  138.             # draw the frame
  139.             self.all_sprites.draw(self.display_surface)
  140.             self.display_hearts()
  141.  
  142.             # crt styling
  143.             self.crt.draw()
  144.  
  145.             # update window
  146.             pygame.display.update()
  147.  
  148. class CRT:
  149.     def __init__(self):
  150.         vignette = pygame.image.load('../graphics/other/tv.png').convert_alpha()
  151.         self.scaled_vignette = pygame.transform.scale(vignette,(WINDOW_WIDTH,WINDOW_HEIGHT))
  152.         self.display_surface = pygame.display.get_surface()
  153.         self.create_crt_lines()
  154.  
  155.     def create_crt_lines(self):
  156.         line_height = 4
  157.         line_amount = WINDOW_HEIGHT // line_height
  158.         for line in range(line_amount):
  159.             y = line * line_height
  160.             pygame.draw.line(self.scaled_vignette, (20,20,20), (0,y), (WINDOW_WIDTH,y),1)
  161.  
  162.     def draw(self):
  163.         self.scaled_vignette.set_alpha(randint(60,75))
  164.         self.display_surface.blit(self.scaled_vignette,(0,0))
  165.  
  166. if __name__ == '__main__':
  167.     game = Game()
  168.     game.run()
  169.  
Advertisement
Add Comment
Please, Sign In to add comment