Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import pygame
- from pygame.sprite import Sprite, Group, spritecollide
- class MapSprite(Sprite):
- position = pygame.Vector2(0, 0)
- def __init__(self, image, position):
- Sprite.__init__(self)
- self.image = image
- self.image_rect = image.get_rect()
- self.image_rect.topleft = position
- @property
- def rect(self):
- rect = self.image_rect.copy()
- rect.topleft += MapSprite.position
- return rect
- class Player(Sprite):
- def __init__(self, image):
- Sprite.__init__(self)
- self.image = image
- self.rect = image.get_rect()
- self.rect.center = Game.rect.center
- self.speed = 2.4 / Game.fps
- def update(self, walls):
- keys = pygame.key.get_pressed()
- movement = pygame.Vector2(0, 0)
- if keys[pygame.K_UP]:
- movement.y += self.speed * Game.delta
- if keys[pygame.K_DOWN]:
- movement.y -= self.speed * Game.delta
- if keys[pygame.K_LEFT]:
- movement.x += self.speed * Game.delta
- if keys[pygame.K_RIGHT]:
- movement.x -= self.speed * Game.delta
- if movement.x != 0 or movement.y != 0:
- old = pygame.Vector2(MapSprite.position)
- MapSprite.position += movement
- wall_list = spritecollide(self, walls, False)
- if len(wall_list) > 0:
- MapSprite.position = old
- class Scene:
- def __init__(self):
- self.sprites = Group()
- self.walls = Group()
- self.create_images()
- self.create_scene()
- def create_images(self):
- self.images = {}
- size = 16, 16
- surface = pygame.Surface(size)
- surface.fill(pygame.Color('dodgerblue'))
- self.images['player'] = surface
- size = 20, 20
- surface = pygame.Surface(size)
- surface.fill(pygame.Color('firebrick'))
- rect = surface.get_rect().inflate(-8, -8)
- pygame.draw.rect(surface, pygame.Color('indianred'), rect)
- self.images['wall red'] = surface
- def create_scene(self):
- self.background = Sprite()
- self.background.image = pygame.Surface(Game.rect.size)
- self.background.image.fill(pygame.Color('black'))
- self.background.rect = Game.rect
- self.player = Player(self.images['player'])
- self.player.add(self.sprites)
- map = [
- " ",
- " xxx xxx ",
- " x x ",
- " x xxxx x ",
- " x x ",
- " x ",
- " x xxxx x ",
- " x x ",
- " xxx xxx ",
- " ",
- ]
- for enum_y, row in enumerate(map):
- for enum_x, col in enumerate(row):
- if col == 'x':
- self.add_wall((enum_x * 20, enum_y * 20))
- def add_wall(self, position):
- wall = MapSprite(self.images['wall red'], position)
- wall.add(self.sprites, self.walls)
- def draw(self, surface):
- surface.blit(self.background.image, self.background.rect)
- visible_sprites = Group(spritecollide(self.background, self.sprites, False))
- visible_sprites.draw(surface)
- self.player.update(self.walls)
- # Namespace for pygame game loop
- class Game:
- @classmethod
- def setup(cls, title, width, height):
- # Basic pygame setup
- pygame.display.set_caption(title)
- cls.surface = pygame.display.set_mode((width, height))
- cls.rect = cls.surface.get_rect()
- cls.clock = pygame.time.Clock()
- cls.delta = 0
- cls.fps = 30
- cls.scene = Scene()
- @classmethod
- def mainloop(cls):
- cls.running = True
- while cls.running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- cls.running = False
- elif event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE:
- cls.running = False
- cls.scene.draw(cls.surface)
- pygame.display.flip()
- cls.delta = cls.clock.tick(cls.fps)
- if __name__ == '__main__':
- pygame.init()
- os.environ['SDL_VIDEO_CENTERED'] = '1'
- Game.setup('Example Move Screen', 200, 200)
- Game.mainloop()
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement