Advertisement
Windspar

Quick Example Pygame Move Screen Not Player

Jun 7th, 2019
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.33 KB | None | 0 0
  1. import os
  2. import pygame
  3. from pygame.sprite import Sprite, Group, spritecollide
  4.  
  5. class MapSprite(Sprite):
  6.     position = pygame.Vector2(0, 0)
  7.  
  8.     def __init__(self, image, position):
  9.         Sprite.__init__(self)
  10.         self.image = image
  11.         self.image_rect = image.get_rect()
  12.         self.image_rect.topleft = position
  13.  
  14.     @property
  15.     def rect(self):
  16.         rect = self.image_rect.copy()
  17.         rect.topleft += MapSprite.position
  18.         return rect
  19.  
  20. class Player(Sprite):
  21.     def __init__(self, image):
  22.         Sprite.__init__(self)
  23.         self.image = image
  24.         self.rect = image.get_rect()
  25.         self.rect.center = Game.rect.center
  26.         self.speed = 2.4 / Game.fps
  27.  
  28.     def update(self, walls):
  29.         keys = pygame.key.get_pressed()
  30.         movement = pygame.Vector2(0, 0)
  31.         if keys[pygame.K_UP]:
  32.             movement.y += self.speed * Game.delta
  33.  
  34.         if keys[pygame.K_DOWN]:
  35.             movement.y -= self.speed * Game.delta
  36.  
  37.         if keys[pygame.K_LEFT]:
  38.             movement.x += self.speed * Game.delta
  39.  
  40.         if keys[pygame.K_RIGHT]:
  41.             movement.x -= self.speed * Game.delta
  42.  
  43.         if movement.x != 0 or movement.y != 0:
  44.             old = pygame.Vector2(MapSprite.position)
  45.             MapSprite.position += movement
  46.             wall_list = spritecollide(self, walls, False)
  47.             if len(wall_list) > 0:
  48.                 MapSprite.position = old
  49.  
  50. class Scene:
  51.     def __init__(self):
  52.         self.sprites = Group()
  53.         self.walls = Group()
  54.         self.create_images()
  55.         self.create_scene()
  56.  
  57.     def create_images(self):
  58.         self.images = {}
  59.  
  60.         size = 16, 16
  61.         surface = pygame.Surface(size)
  62.         surface.fill(pygame.Color('dodgerblue'))
  63.         self.images['player'] = surface
  64.  
  65.         size = 20, 20
  66.         surface = pygame.Surface(size)
  67.         surface.fill(pygame.Color('firebrick'))
  68.         rect = surface.get_rect().inflate(-8, -8)
  69.         pygame.draw.rect(surface, pygame.Color('indianred'), rect)
  70.         self.images['wall red'] = surface
  71.  
  72.     def create_scene(self):
  73.         self.background = Sprite()
  74.         self.background.image = pygame.Surface(Game.rect.size)
  75.         self.background.image.fill(pygame.Color('black'))
  76.         self.background.rect = Game.rect
  77.  
  78.         self.player = Player(self.images['player'])
  79.         self.player.add(self.sprites)
  80.  
  81.         map = [
  82.             "          ",
  83.             " xxx  xxx ",
  84.             " x      x ",
  85.             " x xxxx x ",
  86.             " x      x ",
  87.             " x        ",
  88.             " x xxxx x ",
  89.             " x      x ",
  90.             " xxx  xxx ",
  91.             "          ",
  92.         ]
  93.  
  94.         for enum_y, row in enumerate(map):
  95.             for enum_x, col in enumerate(row):
  96.                 if col == 'x':
  97.                     self.add_wall((enum_x * 20, enum_y * 20))
  98.  
  99.     def add_wall(self, position):
  100.         wall = MapSprite(self.images['wall red'], position)
  101.         wall.add(self.sprites, self.walls)
  102.  
  103.     def draw(self, surface):
  104.         surface.blit(self.background.image, self.background.rect)
  105.         visible_sprites = Group(spritecollide(self.background, self.sprites, False))
  106.         visible_sprites.draw(surface)
  107.         self.player.update(self.walls)
  108.  
  109. # Namespace for pygame game loop
  110. class Game:
  111.     @classmethod
  112.     def setup(cls, title, width, height):
  113.         # Basic pygame setup
  114.         pygame.display.set_caption(title)
  115.         cls.surface = pygame.display.set_mode((width, height))
  116.         cls.rect = cls.surface.get_rect()
  117.         cls.clock = pygame.time.Clock()
  118.         cls.delta = 0
  119.         cls.fps = 30
  120.  
  121.         cls.scene = Scene()
  122.  
  123.     @classmethod
  124.     def mainloop(cls):
  125.         cls.running = True
  126.         while cls.running:
  127.             for event in pygame.event.get():
  128.                 if event.type == pygame.QUIT:
  129.                     cls.running = False
  130.                 elif event.type == pygame.KEYDOWN:
  131.                     if event.key == pygame.K_ESCAPE:
  132.                         cls.running = False
  133.  
  134.             cls.scene.draw(cls.surface)
  135.             pygame.display.flip()
  136.             cls.delta = cls.clock.tick(cls.fps)
  137.  
  138. if __name__ == '__main__':
  139.     pygame.init()
  140.     os.environ['SDL_VIDEO_CENTERED'] = '1'
  141.     Game.setup('Example Move Screen', 200, 200)
  142.     Game.mainloop()
  143.     pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement