Advertisement
Guest User

Untitled

a guest
Dec 1st, 2022
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.34 KB | Source Code | 0 0
  1. import pygame, sys
  2.  
  3.  
  4. class Player(pygame.sprite.Sprite):
  5.     def __init__(self, pos, groups, obstacle_sprites):
  6.         super().__init__(groups)
  7.         self.image = pygame.Surface((48, 48 * 2), pygame.SRCALPHA)
  8.  
  9.         self.player_sprite_top = Tile('player.png', (0, 0), 16, 16, 16, 16, 3).image
  10.         self.player_sprite_bottom = Tile('player.png', (0, 0), 16, 16, 16, 32, 3).image
  11.         self.image.blit(self.player_sprite_top, (0, 0))
  12.         self.image.blit(self.player_sprite_bottom, (0, 48))
  13.  
  14.         # Mask
  15.         self.mask = pygame.mask.from_surface(self.image)
  16.  
  17.         # Normal Rect
  18.         # self.rect = self.image.get_rect()
  19.  
  20.         # Bounding Rect
  21.         self.rect = self.image.get_bounding_rect()
  22.         self.image = self.image.subsurface(self.rect)
  23.  
  24.         self.rect.topleft = pos
  25.  
  26.         self.mask = pygame.mask.from_surface(self.image)
  27.         self.direction = pygame.math.Vector2()
  28.         self.speed = 5
  29.  
  30.         self.status = 'right'  # left or right
  31.         self.obstacle_sprites = obstacle_sprites
  32.  
  33.     def input(self):
  34.         keys = pygame.key.get_pressed()
  35.  
  36.         if keys[pygame.K_UP]:
  37.             self.direction.y = -1
  38.         elif keys[pygame.K_DOWN]:
  39.             self.direction.y = 1
  40.         else:
  41.             self.direction.y = 0
  42.  
  43.         if keys[pygame.K_RIGHT]:
  44.             if self.status != 'right':
  45.                 self.image = pygame.transform.flip(self.image, True, False)
  46.                 self.status = 'right'
  47.  
  48.             self.direction.x = 1
  49.         elif keys[pygame.K_LEFT]:
  50.             if self.status != 'left':
  51.                 self.image = pygame.transform.flip(self.image, True, False)
  52.                 self.status = 'left'
  53.  
  54.             self.direction.x = -1
  55.         else:
  56.             self.direction.x = 0
  57.  
  58.     def move(self, speed):
  59.         if self.direction.magnitude() != 0:
  60.             self.direction = self.direction.normalize()
  61.  
  62.         og_rect_x = self.rect.x
  63.         og_rect_y = self.rect.y
  64.  
  65.         # Mask Collision
  66.         # self.rect.x += self.direction.x * speed
  67.         # self.rect.y += self.direction.y * speed
  68.         # if self.mask_collision():
  69.         #     self.rect.x = og_rect_x
  70.         #     self.rect.y = og_rect_y
  71.  
  72.         # Rect Collision
  73.         self.rect.x += self.direction.x * speed
  74.         self.rect_collision('horizontal')
  75.         self.rect.y += self.direction.y * speed
  76.         self.rect_collision('vertical')
  77.  
  78.         self.rect.center = self.rect.center
  79.  
  80.     def mask_collision(self):
  81.         for sprite in self.obstacle_sprites:
  82.             if pygame.sprite.collide_mask(self, sprite):
  83.                 return True
  84.  
  85.     def rect_collision(self, direction):
  86.         if direction == 'horizontal':
  87.             for sprite in self.obstacle_sprites:
  88.                 if sprite.rect.colliderect(self.rect):
  89.                     if self.direction.x > 0:
  90.                         self.rect.right = sprite.rect.left
  91.                     if self.direction.x < 0:
  92.                         self.rect.left = sprite.rect.right
  93.  
  94.         if direction == 'vertical':
  95.             for sprite in self.obstacle_sprites:
  96.                 if sprite.rect.colliderect(self.rect):
  97.                     if self.direction.y > 0:
  98.                         self.rect.bottom = sprite.rect.top
  99.                     if self.direction.y < 0:
  100.                         self.rect.top = sprite.rect.bottom
  101.  
  102.     def update(self):
  103.         self.input()
  104.         self.mask = pygame.mask.from_surface(self.image)
  105.         self.move(self.speed)
  106.  
  107.  
  108. class Tile(pygame.sprite.Sprite):
  109.     def __init__(self, sprite_sheet, pos, width, height, x_start, y_start, scale):
  110.         super(Tile, self).__init__()
  111.         self.sprite_sheet = pygame.image.load(sprite_sheet).convert_alpha()
  112.         self.image = self.get_sprite(width, height, x_start, y_start, scale)
  113.  
  114.         # Normal Rect
  115.         # self.rect = self.image.get_rect()
  116.  
  117.         # Bounding Rect
  118.         self.rect = self.image.get_bounding_rect()
  119.         # self.image = self.image.subsurface(self.rect)  # Causes Weird Glitch
  120.  
  121.         self.rect.topleft = pos
  122.         self.mask = pygame.mask.from_surface(self.image)
  123.  
  124.     def get_sprite(self, width, height, x_start, y_start, scale):
  125.         image = pygame.Surface((width, height), pygame.SRCALPHA)
  126.         image.blit(self.sprite_sheet, (0, 0), (x_start, y_start, width, height))
  127.         image = pygame.transform.scale(image, (width * scale, height * scale))
  128.  
  129.         return image
  130.  
  131.  
  132. pygame.init()
  133. display = pygame.display.set_mode((1280, 720))
  134. clock = pygame.time.Clock()
  135.  
  136. visible_sprites = pygame.sprite.Group()
  137. obstacle_sprites = pygame.sprite.Group()
  138.  
  139.  
  140. player = Player((0, 0), [visible_sprites], obstacle_sprites)
  141.  
  142. fence = Tile('fences.png', (48, 48), 16, 16, 16, 48, 3)
  143. obstacle_sprites.add(fence)
  144. visible_sprites.add(fence)
  145.  
  146. fence_2 = Tile('fences.png', (48 * 2, 48), 16, 16, 32, 48, 3)
  147. obstacle_sprites.add(fence_2)
  148. visible_sprites.add(fence_2)
  149.  
  150.  
  151. while True:
  152.     for event in pygame.event.get():
  153.         if event.type == pygame.QUIT:
  154.             pygame.quit()
  155.             sys.exit()
  156.         if event.type == pygame.KEYDOWN:
  157.             if event.key == pygame.K_ESCAPE:
  158.                 pygame.quit()
  159.                 sys.exit()
  160.  
  161.     visible_sprites.update()
  162.  
  163.     display.fill('#555358')
  164.     visible_sprites.draw(display)
  165.  
  166.     pygame.display.update()
  167.     clock.tick(60)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement