ClearCode

sprites.py

Mar 22nd, 2022
2,609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.42 KB | None | 0 0
  1. import pygame
  2. from settings import *
  3. from random import choice, randint
  4.  
  5. class Upgrade(pygame.sprite.Sprite):
  6.     def __init__(self,pos,upgrade_type,groups):
  7.         super().__init__(groups)
  8.         self.upgrade_type = upgrade_type
  9.         self.image = pygame.image.load(f'../graphics/upgrades/{upgrade_type}.png').convert_alpha()
  10.         self.rect = self.image.get_rect(midtop = pos)
  11.  
  12.         self.pos = pygame.math.Vector2(self.rect.topleft)
  13.         self.speed = 300
  14.  
  15.     def update(self,dt):
  16.         self.pos.y += self.speed * dt
  17.         self.rect.y = round(self.pos.y)
  18.  
  19.         if self.rect.top > WINDOW_HEIGHT + 100:
  20.             self.kill()
  21.  
  22. class Projectile(pygame.sprite.Sprite):
  23.     def __init__(self,pos,surface,groups):
  24.         super().__init__(groups)
  25.         self.image = surface
  26.         self.rect = self.image.get_rect(midbottom = pos)
  27.  
  28.         self.pos = pygame.math.Vector2(self.rect.topleft)
  29.         self.speed = 300
  30.  
  31.     def update(self,dt):
  32.         self.pos.y -= self.speed * dt
  33.         self.rect.y = round(self.pos.y)
  34.  
  35.         if self.rect.bottom <= -100:
  36.             self.kill()
  37.  
  38. class Player(pygame.sprite.Sprite):
  39.     def __init__(self,groups,surfacemaker):
  40.         super().__init__(groups)
  41.  
  42.         # setup
  43.         self.display_surface = pygame.display.get_surface()
  44.         self.surfacemaker = surfacemaker
  45.         self.image = surfacemaker.get_surf('player',(WINDOW_WIDTH // 10,WINDOW_HEIGHT // 20))
  46.  
  47.         # position
  48.         self.rect = self.image.get_rect(midbottom = (WINDOW_WIDTH // 2,WINDOW_HEIGHT - 20))
  49.         self.old_rect = self.rect.copy()
  50.         self.direction = pygame.math.Vector2()
  51.         self.pos = pygame.math.Vector2(self.rect.topleft)
  52.         self.speed = 300
  53.  
  54.         self.hearts = 3
  55.  
  56.         # laser
  57.         self.laser_amount = 2
  58.         self.laser_surf = pygame.image.load('../graphics/other/laser.png').convert_alpha()
  59.         self.laser_rects = []
  60.  
  61.     def input(self):
  62.         keys = pygame.key.get_pressed()
  63.         if keys[pygame.K_RIGHT]:
  64.             self.direction.x = 1
  65.         elif keys[pygame.K_LEFT]:
  66.             self.direction.x = -1
  67.         else:
  68.             self.direction.x = 0
  69.  
  70.     def screen_constraint(self):
  71.         if self.rect.right > WINDOW_WIDTH:
  72.             self.rect.right = WINDOW_WIDTH
  73.             self.pos.x = self.rect.x
  74.         if self.rect.left < 0:
  75.             self.rect.left = 0
  76.             self.pos.x = self.rect.x
  77.  
  78.     def upgrade(self,upgrade_type):
  79.         if upgrade_type == 'speed':
  80.             self.speed += 50
  81.         if upgrade_type == 'heart':
  82.             self.hearts += 1
  83.  
  84.         if upgrade_type == 'size':
  85.             new_width = self.rect.width * 1.1
  86.             self.image = self.surfacemaker.get_surf('player',(new_width,self.rect.height))
  87.             self.rect = self.image.get_rect(center = self.rect.center)
  88.             self.pos.x = self.rect.x
  89.  
  90.         if upgrade_type == 'laser':
  91.             self.laser_amount += 1
  92.  
  93.     def display_lasers(self):
  94.         self.laser_rects = []
  95.         if self.laser_amount > 0:
  96.             divider_length = self.rect.width / (self.laser_amount + 1)
  97.             for i in range(self.laser_amount):
  98.                 x = self.rect.left + divider_length * (i + 1)
  99.                 laser_rect = self.laser_surf.get_rect(midbottom = (x,self.rect.top))
  100.                 self.laser_rects.append(laser_rect)
  101.  
  102.             for laser_rect in self.laser_rects:
  103.                 self.display_surface.blit(self.laser_surf,laser_rect)
  104.  
  105.     def update(self,dt):
  106.         self.old_rect = self.rect.copy()
  107.         self.input()
  108.         self.pos.x += self.direction.x * self.speed * dt
  109.         self.rect.x = round(self.pos.x)
  110.         self.screen_constraint()
  111.         self.display_lasers()
  112.  
  113. class Ball(pygame.sprite.Sprite):
  114.     def __init__(self,groups,player,blocks):
  115.         super().__init__(groups)
  116.  
  117.         # collision objects
  118.         self.player = player
  119.         self.blocks = blocks
  120.  
  121.         # graphics setup
  122.         self.image = pygame.image.load('../graphics/other/ball.png').convert_alpha()
  123.  
  124.         # position setup
  125.         self.rect = self.image.get_rect(midbottom = player.rect.midtop)
  126.         self.old_rect = self.rect.copy()
  127.         self.pos = pygame.math.Vector2(self.rect.topleft)
  128.         self.direction = pygame.math.Vector2((choice((1,-1)),-1))
  129.         self.speed = 400
  130.  
  131.         # active
  132.         self.active = False
  133.  
  134.         # sounds
  135.  
  136.         self.impact_sound = pygame.mixer.Sound('../sounds/impact.wav')
  137.         self.impact_sound.set_volume(0.1)
  138.  
  139.         self.fail_sound = pygame.mixer.Sound('../sounds/fail.wav')
  140.         self.fail_sound.set_volume(0.1)
  141.  
  142.     def window_collision(self,direction):
  143.         if direction == 'horizontal':
  144.             if self.rect.left < 0:
  145.                 self.rect.left = 0
  146.                 self.pos.x = self.rect.x
  147.                 self.direction.x *= -1
  148.  
  149.             if self.rect.right > WINDOW_WIDTH:
  150.                 self.rect.right = WINDOW_WIDTH
  151.                 self.pos.x = self.rect.x
  152.                 self.direction.x *= -1
  153.  
  154.         if direction == 'vertical':
  155.             if self.rect.top < 0:
  156.                 self.rect.top = 0
  157.                 self.pos.y = self.rect.y
  158.                 self.direction.y *= -1
  159.  
  160.             if self.rect.bottom > WINDOW_HEIGHT:
  161.                 self.active = False
  162.                 self.direction.y = -1
  163.                 self.player.hearts -= 1
  164.                 self.fail_sound.play()
  165.                
  166.     def collision(self,direction):
  167.         # find overlapping objects
  168.         overlap_sprites = pygame.sprite.spritecollide(self,self.blocks,False)
  169.         if self.rect.colliderect(self.player.rect):
  170.             overlap_sprites.append(self.player)
  171.  
  172.         if overlap_sprites:
  173.             if direction == 'horizontal':
  174.                 for sprite in overlap_sprites:
  175.                     if self.rect.right >= sprite.rect.left and self.old_rect.right <= sprite.old_rect.left:
  176.                         self.rect.right = sprite.rect.left - 1
  177.                         self.pos.x = self.rect.x
  178.                         self.direction.x *= -1
  179.                         self.impact_sound.play()
  180.  
  181.                     if self.rect.left <= sprite.rect.right and self.old_rect.left >= sprite.old_rect.right:
  182.                         self.rect.left = sprite.rect.right + 1
  183.                         self.pos.x = self.rect.x
  184.                         self.direction.x *= -1
  185.                         self.impact_sound.play()
  186.  
  187.                     if getattr(sprite,'health',None):
  188.                         sprite.get_damage(1)
  189.  
  190.  
  191.             if direction == 'vertical':
  192.                 for sprite in overlap_sprites:
  193.                     if self.rect.bottom >= sprite.rect.top and self.old_rect.bottom <= sprite.old_rect.top:
  194.                         self.rect.bottom = sprite.rect.top - 1
  195.                         self.pos.y = self.rect.y
  196.                         self.direction.y *= -1
  197.                         self.impact_sound.play()
  198.  
  199.                     if self.rect.top <= sprite.rect.bottom and self.old_rect.top >= sprite.old_rect.bottom:
  200.                         self.rect.top = sprite.rect.bottom + 1
  201.                         self.pos.y = self.rect.y
  202.                         self.direction.y *= -1
  203.                         self.impact_sound.play()
  204.  
  205.                     if getattr(sprite,'health',None):
  206.                         sprite.get_damage(1)
  207.  
  208.     def update(self,dt):
  209.         if self.active:
  210.  
  211.             if self.direction.magnitude() != 0:
  212.                 self.direction = self.direction.normalize()
  213.  
  214.             # create old rect
  215.             self.old_rect = self.rect.copy()
  216.  
  217.             # horizontal movement + collision
  218.             self.pos.x += self.direction.x * self.speed * dt
  219.             self.rect.x = round(self.pos.x)
  220.             self.collision('horizontal')
  221.             self.window_collision('horizontal')
  222.  
  223.             # vertical movement + collision
  224.             self.pos.y += self.direction.y * self.speed * dt
  225.             self.rect.y= round(self.pos.y)
  226.             self.collision('vertical')
  227.             self.window_collision('vertical')
  228.         else:
  229.             self.rect.midbottom = self.player.rect.midtop
  230.             self.pos = pygame.math.Vector2(self.rect.topleft)
  231.  
  232. class Block(pygame.sprite.Sprite):
  233.     def __init__(self,block_type,pos,groups,surfacemaker,create_upgrade):
  234.         super().__init__(groups)
  235.         self.surfacemaker = surfacemaker
  236.         self.image = self.surfacemaker.get_surf(COLOR_LEGEND[block_type],(BLOCK_WIDTH, BLOCK_HEIGHT))
  237.         self.rect = self.image.get_rect(topleft = pos)
  238.         self.old_rect = self.rect.copy()
  239.  
  240.         # damage information
  241.         self.health = int(block_type)
  242.  
  243.         # upgrade
  244.         self.create_upgrade = create_upgrade
  245.  
  246.     def get_damage(self,amount):
  247.         self.health -= amount
  248.  
  249.         if self.health > 0:
  250.             self.image = self.surfacemaker.get_surf(COLOR_LEGEND[str(self.health)],(BLOCK_WIDTH, BLOCK_HEIGHT))
  251.         else:
  252.             if randint(0,10) < 9:
  253.                 self.create_upgrade(self.rect.center)
  254.             self.kill()
Advertisement
Add Comment
Please, Sign In to add comment