> For the complete documentation index, see [llms.txt](https://pygame.gitbook.io/razrabotchiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pygame.gitbook.io/razrabotchiki/teoriya/rabota-s-tailami.md).

# Работа с тайлами

Для отрисовки уровня, создам класс **`World`**

Создание класса **`World`** для представления игрового мира включает несколько шагов. В этом классе будут использоваться **Pygame** для графики и будет читаться двумерный список, представляющий уровень игры. В каждом элементе этого списка содержится информация о типе тайла.&#x20;

Класс **`World`** обрабатывает данные уровня, которые хранятся в текстовых файлах. Эти файлы содержат двумерные списки чисел, где каждое число пре доставляет определенный тип тайла в игровом мире.

**Пример содержимого файла уровня**

Файл уровня может выглядеть примерно так:

```
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,1,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
```

то есть :

0 - ничего нет

1 - трава и т.д.

![](https://pygame.gitbook.io/~gitbook/image?url=https%3A%2F%2F609239862-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F5KnZia3Kb4EO6MGc9zsi%252Fuploads%252FcDEuuAgXGl3zyCMWjEnj%252Fimage.png%3Falt%3Dmedia%26token%3D2b3f84d8-2e9f-4564-a18e-0a7d4e459465\&width=300\&dpr=4\&quality=100\&sign=ba7297d9\&sv=1)

цифры зависят от того, кто уровень создавал

Давайте рассмотрим процесс по шагам:

#### Шаги по созданию класса `World`

1. **Загрузите и убедитесь, что у вас есть текстовый файл с уровнем, а также все необходимые изображения**\
   как создавать такие текстовые файлы, можете посмотреть [здесь](https://pygame.gitbook.io/dizain/sozdanie-karty)\
   ![](https://1656654867-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJQnuUxWSF0jQ4BgRs3k4%2Fuploads%2FDmsLrt3ivN75Iw4yLxNX%2Fimage.png?alt=media\&token=8a797031-b7bb-4645-ab5c-121dab772f00)
2. **Инициализация Pygame и создание окна**:
   * Импортируем необходимые модули и инициализируем Pygame.
   * Создаем окно для отображения игрового мира.<br>

     ```python
     import pygame
     # Константы
     TILE_SIZE = 32
     WIDTH = 640
     HEIGHT = 600
     SCREEN_HEIGHT = 640

     # Инициализация Pygame
     pygame.init()
     screen = pygame.display.set_mode((WIDTH, HEIGHT))
     pygame.display.set_caption("Game Level")
     clock = pygame.time.Clock()
     ```
3. **Создание класса `World`**:

   * Определяем конструктор `__init__`, который принимает двумерный список данных уровня.
   * Загружаем изображения тайлов.
   * Обрабатываем данные уровня, создаем объекты тайлов и добавляем их в список тайлов мира.
   * **Метод `draw` для отрисовки тайлов**:

     Определяем метод для отрисовки всех тайлов на экране.

   ```python
   class World:
       """
       Класс для представления игрового мира.
       """
       def __init__(self, data):
           """
           Инициализация мира на основе данных.
           """
           self.tile_list = []  # Список тайлов в мире

           # Загрузка изображений тайлов
           dirt_img = pygame.image.load('img/dirt.png')
           grass_img = pygame.image.load('img/grass.png')

           # Обход данных уровня и создание тайлов
           row_count = 0
           for row in data:
               col_count = 0
               for tile in row:
                   if tile == 1:
                       # Создание тайла земли
                       img = pygame.transform.scale(dirt_img, (TILE_SIZE, TILE_SIZE))
                       img_rect = img.get_rect()
                       img_rect.x = col_count * TILE_SIZE
                       img_rect.y = row_count * TILE_SIZE
                       tile = (img, img_rect)
                       self.tile_list.append(tile)
                   if tile == 2:
                       # Создание тайла травы
                       img = pygame.transform.scale(grass_img, (TILE_SIZE, TILE_SIZE))
                       img_rect = img.get_rect()
                       img_rect.x = col_count * TILE_SIZE
                       img_rect.y = row_count * TILE_SIZE
                       tile = (img, img_rect)
                       self.tile_list.append(tile)
                   col_count += 1
               row_count += 1

       def draw(self):
           """
           Отрисовка всех тайлов мира на экране.
           """
           for tile in self.tile_list:
               screen.blit(tile[0], tile[1])
   ```
4. **Чтение уровня из файла**:

   Функция **`get_data_from_file`** читает данные уровня из текстового файла и преобразует их в двумерный список.<br>

   ```python
   def get_data_from_file(file):
       """
       Функция для чтения уровня игры из файла и преобразования его в двумерный список.
       """
       world_data = []
       for l in file:
           temp = []
           s_temp = l.strip().split(',')
           temp = [int(s) for s in s_temp]
           world_data.append(temp)
       return world_data
   ```
5. **Перезапуск уровня**:

   Функция **`reset_level`** сбрасывает состояние уровня, очищает группы спрайтов и создает новый мир на основе загруженных данных<br>

   ```python
   def reset_level(level):
       player.reset(100, SCREEN_HEIGHT - 130)  # сбрасываем игрока в начальную позицию
       blob_group.empty()  # очищаем группу врагов (blob)
       coin_group.empty()  # очищаем группу монет
       exit_group.empty()  # очищаем группу выходов

       # загружаем данные уровня и создаем мир
       if path.exists(f'levels/level{level}.txt'):
           with open(f'levels/level{level}.txt', 'r') as file:
               world_data = get_data_from_file(file)

       world = World(world_data)  # создаем мир на основе загруженных данных
       score_coin = Coin(TILE_SIZE // 2, TILE_SIZE // 2)
       coin_group.add(score_coin)
       return world  # возвращаем объект мира
   ```
6. **Создание основной игры**:

   В основной игровой петле обрабатываем события, отрисовываем мир и обновляем экран.

   ```python
   # Основная игровая петля
   world = reset_level()

   running = True
   while running:
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               running = False

       screen.fill((0, 0, 0))  # Очистка экрана
       world.draw()
       pygame.display.flip()
       clock.tick(60)

   pygame.quit()
   ```
