Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import os
- import pygame
- pygame.init()
- FPS = 50
- WIDTH = 400
- HEIGHT = 300
- STEP = 10
- TILE_WIDTH = TILE_HEIGHT = 50
- screen = pygame.display.set_mode((WIDTH, HEIGHT))
- clock = pygame.time.Clock()
- all_sprites = pygame.sprite.Group()
- tiles_group = pygame.sprite.Group()
- player_group = pygame.sprite.Group()
- def load_image(name, colorkey=None):
- fullname = os.path.join('data', name)
- try:
- image = pygame.image.load(fullname)
- except pygame.error as message:
- print('Cannot load image: ', name)
- raise SystemExit(message)
- image = image.convert_alpha()
- if colorkey is not None:
- if colorkey is -1:
- colorkey = image.get_at((0, 0))
- image.set_colorkey(colorkey)
- return image
- def start_screen():
- intro_text = ["ЗАСТАВКА", "",
- "Правила игры",
- "Если в правилах несколько строк,",
- "приходится выводить их построчно"]
- fon = pygame.transform.scale(load_image('fon.jpg'), (WIDTH, HEIGHT))
- screen.blit(fon, (0, 0))
- font = pygame.font.Font(None, 30)
- text_coord = 50
- for line in intro_text:
- string_rendered = font.render(line, 1, pygame.Color('black'))
- intro_rect = string_rendered.get_rect()
- text_coord += 10
- intro_rect.top = text_coord
- intro_rect.x = 10
- text_coord += intro_rect.height
- screen.blit(string_rendered, intro_rect)
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- terminate()
- elif event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN:
- return # начинаем игру
- pygame.display.flip()
- clock.tick(FPS)
- def terminate():
- pygame.quit()
- sys.exit()
- def load_level(filename):
- filename = 'data/' + filename
- with open(filename, 'r') as map_file:
- level_map = [line.strip() for line in map_file]
- max_width = max(map(len, level_map))
- return list(map(lambda x: x.ljust(max_width, '.'), level_map))
- def generate_level(level):
- new_player, x, y = None, None, None
- for y in range(len(level)):
- for x in range(len(level[y])):
- if level[y][x] == '.':
- Tile('empty', x, y)
- elif level[y][x] == '#':
- Tile('wall', x, y)
- elif level[y][x] == '@':
- Tile('empty', x, y)
- new_player = Player(x, y)
- return new_player
- tile_images = {
- 'wall': load_image('box.png'),
- 'empty': load_image('grass.png'),
- 'player': load_image('mario.png')
- }
- class Tile(pygame.sprite.Sprite):
- def __init__(self, tile_type, pos_x, pos_y):
- super().__init__(tiles_group, all_sprites)
- self.image = tile_images[tile_type]
- self.rect = self.image.get_rect().move(TILE_WIDTH * pos_x,
- TILE_HEIGHT * pos_y)
- class Player(pygame.sprite.Sprite):
- def __init__(self, pos_x, pos_y):
- super().__init__(player_group, all_sprites)
- self.image = tile_images['player']
- self.rect = self.image.get_rect().move(TILE_WIDTH * pos_x + 15,
- TILE_HEIGHT * pos_y + 5)
- class Camera:
- def __init___(self):
- self.dx = 0
- self.dy = 0
- def apply(self, obj): # Фокусировка на объекте
- obj.rect.x += self.dx
- obj.rect.y += self.dy
- def update(self, target): # перемещение объектов
- self.dx = -(target.rect.x + target.rect.w // 2 - WIDTH // 2)
- self.dy = -(target.rect.y + target.rect.h // 2 - HEIGHT // 2)
- start_screen()
- level = load_level('levelex.txt')
- player = generate_level(level)
- camera = Camera()
- running = True
- while running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- elif event.type == pygame.KEYDOWN:
- if event.key == pygame.K_LEFT:
- player.rect.x -= STEP
- if event.key == pygame.K_RIGHT:
- player.rect.x += STEP
- if event.key == pygame.K_UP:
- player.rect.y -= STEP
- if event.key == pygame.K_DOWN:
- player.rect.y += STEP
- camera.update(player)
- for sprite in all_sprites:
- camera.apply(sprite)
- screen.fill(pygame.Color('#000000'))
- tiles_group.draw(screen)
- player_group.draw(screen)
- pygame.display.flip()
- clock.tick(FPS)
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement