Как реализовать прокрутку параллакса в Python Arcade

9
и технологии 25.webp.webp

Последнее обновление 21.07.2023 — Василий Иванов

Добавление визуальных эффектов в ваши игры может значительно улучшить впечатления игроков и сделать игры более увлекательными. Одним из популярных методов для достижения этого является прокрутка параллакса.

Параллаксная прокрутка создает иллюзию глубины за счет перемещения нескольких слоев изображений или объектов с разной скоростью, создавая ощущение погружения в игровой мир. Реализовать параллаксную прокрутку в ваших играх с помощью библиотеки Arcade не только легко, но и добавить профессиональный штрих к вашим проектам.

Создайте простую игру

Прежде чем начать, убедитесь, что на вашем устройстве установлен pip. Используйте эту команду для установки аркадной библиотеки:

 pip install arcade 

После этого создайте простую игру, используя библиотеку Arcade. В этой игре игрок сможет двигаться влево и вправо, и будут платформы, с которыми игрок сможет взаимодействовать.

По теме:  Как исправить внутреннюю ошибку Audacity PortAudio в Windows 10 и 11

Код, использованный в этой статье, доступен в этом репозитории GitHub, и его можно использовать бесплатно по лицензии MIT.

Сценарий simple-game.py определяет класс Player, который наследуется от класса arcade.Sprite. Он устанавливает начальную позицию и переменные движения для игрока. Код также включает класс Platform, представляющий прямоугольные платформы. Каждая платформа имеет определенное положение, размер и цвет.

Класс MyGame отвечает за настройку игры, включая создание игрока и платформ, а также обработку рисунков, обновлений и событий ввода.

Вот как выглядит базовая игра-платформер на данный момент:

Настройка слоев

Чтобы добиться параллаксной прокрутки, создайте разные слои, которые движутся с разной скоростью. Для этого примера создайте пять слоев. Каждый слой будет иметь разную скорость прокрутки, чтобы создать ощущение глубины.

 class Layer(arcade.SpriteList):
    def __init__(self, scroll_speed):
        super().__init__()
        self.scroll_speed = scroll_speed

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player = None
        self.platforms = None
        self.layers = []

    def setup(self):
        self.player = Player()
        self.platforms = arcade.SpriteList()
        gray = arcade.color.GRAY
        red = arcade.color.RED
        brown = arcade.color.BROWN
        yellow = arcade.color.YELLOW

        w = SCREEN_WIDTH // 2
        h = SCREEN_HEIGHT // 2

        self.platforms.append(Platform(w, h - 100, 200, 20, yellow))
        self.platforms.append(Platform(w, h + 100, 200, 20, yellow))

        layers_data = [
            (Layer(0.2), Platform(w, h, 800, 600, gray)),
            (Layer(0.5), Platform(w, h - 200, 400, 20, red)),
            (Layer(0.5), Platform(w, h + 200, 400, 20, red)),
            (Layer(1.0), Platform(w, h - 300, 200, 20, brown)),
            (Layer(1.0), Platform(w, h + 300, 200, 20, brown))
        ]

        for layer, platform in layers_data:
            layer.append(platform)
            self.layers.append(layer)

    # Rest of the code remains the same

Реализация параллаксной прокрутки

Чтобы реализовать параллаксную прокрутку, обновите положение каждого слоя в зависимости от скорости прокрутки и движения игрока. Создайте новый файл с именем parallax-scrolling.py и добавьте код со следующими обновлениями:

 class MyGame(arcade.Window):
    # ...

    def on_draw(self):
        arcade.start_render()

        for layer in self.layers:
            layer.draw()

        self.platforms.draw()
        self.player.draw()

    def update(self, delta_time):
        self.player.update()

        for layer in self.layers:
            for sprite in layer:
                change = self.player.change_x * layer.scroll_speed
                sprite.center_x -= change

    # ...

Ниже приведен вывод:

В методе on_draw рисуйте каждый слой с помощью инструментов рисования аркады, прежде чем рисовать платформы и игрока. Это гарантирует, что слои будут отображаться позади игрока и платформ.

В методе обновления выполните итерацию по каждому слою и обновите положение каждого спрайта в слое на основе горизонтального движения игрока (self.player.change_x) и скорости прокрутки слоя (layer.scroll_speed). Умножая движение игрока на скорость прокрутки, можно добиться эффекта прокрутки параллакса.

Настройка скорости прокрутки

Чтобы создать более визуально привлекательный эффект прокрутки параллакса, вы можете настроить скорость прокрутки для разных слоев. Эксперименты с различными скоростями могут добавить глубины и сделать игровой мир более захватывающим.

 class MyGame(arcade.Window):
    # ...

    def setup(self):

       # ...

        layers_data = [
            (Layer(1.2), Platform(w, h, 800, 600, gray)),
            (Layer(2.5), Platform(w, h - 200, 400, 20, red)),
            (Layer(3.0), Platform(w, h + 200, 400, 20, red)),
            (Layer(4.0), Platform(w, h - 300, 200, 20, brown)),
            (Layer(5.0), Platform(w, h + 300, 200, 20, brown))
        ]

        # ...

    # ...

Не стесняйтесь экспериментировать с различными скоростями прокрутки, чтобы добиться желаемого эффекта прокрутки параллакса для вашей игры.

Включая дополнительные функции

Параллаксная прокрутка открывает мир возможностей для улучшения вашей игры. Комбинируя его с другими функциями, вы можете создать действительно захватывающий и захватывающий опыт. Вот некоторые дополнительные функции, которые вы можете включить в свою игру, чтобы дополнить эффект прокрутки параллакса:

Динамические фоновые эффекты

Вы можете воспользоваться слоями прокрутки параллакса, чтобы добавить динамические фоновые эффекты. Например, вы можете имитировать погодные условия, такие как дождь, снег или падающие листья. Каждый слой может иметь свой собственный набор эффектов частиц, которые реагируют на движения игрока, создавая более захватывающую и реалистичную среду.

Создайте новый файл с именем background-effects.py и добавьте код со следующими обновлениями:

 class Raindrop(arcade.Sprite):
    def __init__(self, x, y):
        super().__init__()

        self.texture = arcade.make_soft_square_texture(
            3, blue, outer_alpha=100)

        self.center_x = x
        self.center_y = y

class BackgroundLayer(arcade.SpriteList):
    def __init__(self, scroll_speed):
        super().__init__()
        self.scroll_speed = scroll_speed
        self.raindrops = arcade.SpriteList()

    def update(self):
        for raindrop in self.raindrops:
            raindrop.center_y -= self.scroll_speed * 5

            if raindrop.center_y < -10:
                raindrop.remove_from_sprite_lists()

    def draw(self):
        super().draw()
        self.raindrops.draw()

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.background_layer = BackgroundLayer(0.2)
        # ...

    def setup(self):
        # ...
        self.background_layer.raindrops.append(
            Raindrop(SCREEN_WIDTH // 2, SCREEN_HEIGHT + 10))

    def update(self, delta_time):
        self.player.update()
        self.background_layer.update()

    def on_draw(self):
        arcade.start_render()
        self.background_layer.draw()
        self.platforms.draw()
        self.player.draw()

Вот результат:

Лучшие практики для прокрутки параллакса

Вот несколько рекомендаций по реализации прокрутки параллакса в ваших играх.

Тщательно планируйте свои слои

Прежде чем внедрять параллаксную прокрутку, найдите время, чтобы спланировать и спроектировать свои слои. Подумайте, какие элементы вы хотите включить в каждый слой и как они будут способствовать общему визуальному эффекту. Стратегическое размещение объектов и фона на разных слоях может создать более захватывающий опыт.

Оптимизация размеров и форматов изображений

Если вы решите использовать изображения для слоев с прокруткой параллакса, оптимизируйте их размеры и форматы, чтобы минимизировать размер файлов и повысить производительность. Сжимайте изображения и используйте соответствующие форматы (например, JPEG или PNG), чтобы уменьшить использование памяти и время загрузки.

Проверка производительности на разных устройствах

Убедитесь, что ваша реализация прокрутки параллакса хорошо работает на различных устройствах и размерах экрана. Протестируйте свою игру на разных платформах и устройствах, чтобы выявить узкие места в производительности или проблемы совместимости.

Рассмотрите возможность оптимизации кода или корректировки количества и сложности слоев, если это необходимо. Сбалансируйте визуальную привлекательность прокрутки параллакса с удобством использования и играбельностью вашей игры.

Включите плавные переходы

Плавные переходы между слоями могут улучшить общее визуальное качество прокрутки параллакса. Используйте функции плавности или методы интерполяции для создания постепенных переходов по мере движения игрока или панорамирования камеры. Это может помочь уменьшить неприятные эффекты и создать более плавный и приятный опыт.

Следуя этим передовым методам, вы можете гарантировать, что ваша реализация прокрутки параллакса будет плавной, визуально привлекательной и органично интегрированной в вашу игру.

Сделайте игры более увлекательными с помощью прокрутки параллакса

С прокруткой параллакса вы можете превратить простую игру в визуально ошеломляющее приключение. Будь то платформер, шутер или бесконечный раннер, прокрутка параллакса добавляет тот дополнительный слой полировки, который очаровывает игроков и заставляет их возвращаться снова и снова.

Итак, приступайте к реализации прокрутки параллакса в своих играх с помощью библиотеки Arcade на Python.