Поиск по сайту:

Как добавить случайно движущиеся объекты с помощью библиотеки Python Arcade


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

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

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

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

pip install arcade

После этого создайте окно с помощью класса arcade.Window и установите белый цвет фона.

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

Установите положение игрока в середину экрана по горизонтали и добавьте небольшое расстояние сверху. Управлять движением игрока можно с помощью клавиш со стрелками.

Вот код нашей базовой игры:

import arcade
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15
class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10
    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, PLAYER_RADIUS, arcade.color.BLUE)
    def update(self, delta_time):
        pass
    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 5
        elif key == arcade.key.RIGHT:
            self.player_x += 5
if __name__ == "__main__":
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

Добавление нескольких объектов

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

В код игры добавьте список objects для хранения положений случайных движущихся объектов. После этого сгенерируйте количество объектов (NUM_OBJECTS) со случайными координатами x и y в границах экрана. Объекты рисуются в виде красных кругов с помощью функции arcade.draw_circle_filled.

import arcade
import random
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15
OBJECT_RADIUS = 10
NUM_OBJECTS = 10
class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10
        self.objects = []
        for _ in range(NUM_OBJECTS):
            x = random.randint(0, SCREEN_WIDTH)
            y = random.randint(0, SCREEN_HEIGHT)
            self.objects.append((x, y))
    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, PLAYER_RADIUS, arcade.color.BLUE)
        for obj in self.objects:
            x, y = obj
            arcade.draw_circle_filled(x, y, OBJECT_RADIUS, arcade.color.RED)
    def update(self, delta_time):
        pass
    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 5
        elif key == arcade.key.RIGHT:
            self.player_x += 5
if __name__ == "__main__":
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

Ниже приведен результат:

Реализация алгоритма случайного движения

Чтобы объекты перемещались случайным образом, обновите их позиции в методе update, используя алгоритм случайного перемещения.

Выполните итерацию по каждому объекту и сгенерируйте случайные значения для dx и dy, представляющие изменение координат x и y. Затем обновите положение объекта, добавив эти значения. Вот измененный код:

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = random.randint(-5, 5)
        dy = random.randint(-5, 5)
        x += dx
        y += dy
        self.objects[i] = (x, y)

Ниже приведен результат:

Объекты движутся к игроку

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

Для этого вычислите разницу в координатах x и y между объектом и игроком. Нормализуя эти значения, вы получаете вектор направления. Затем умножьте этот вектор на коэффициент скорости (в данном случае 3) и прибавьте его к положению объекта. Вот обновленный метод update:

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        dx /= distance
        dy /= distance
        x += dx * 3
        y += dy * 3
        self.objects[i] = (x, y)

Ниже приведен результат:

Объекты начинают двигаться, когда игрок входит в окружение

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

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        
        if distance < 100: # Adjust the radius as needed
            dx /= distance
            dy /= distance
            x += dx * 3
            y += dy * 3
            self.objects[i] = (x, y)

Обнаружение столкновений и взаимодействие

Теперь добавьте обнаружение столкновений между игроком и объектами и определите поведение при возникновении столкновения. Измените метод update для обработки коллизий:

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        
        if distance < PLAYER_RADIUS + OBJECT_RADIUS:
            # if collision occurred, handle it here
            self.objects.pop(i)
            self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
            
        elif distance < 100:
            dx /= distance
            dy /= distance
            x += dx * 3
            y += dy * 3
            self.objects[i] = (x, y)

Балансировка случайности

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

Ограничение максимальной скорости

Чтобы объекты не двигались слишком быстро, можно ввести ограничение максимальной скорости. Измените метод update, включив ограничения скорости:

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        if distance < PLAYER_RADIUS + OBJECT_RADIUS:
            self.objects.pop(i)
            self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
        elif distance < 100:
            dx /= distance
            dy /= distance
            speed = 3 # Adjust the speed value as needed
            dx = min(max(dx * speed, -MAX_SPEED), MAX_SPEED)
            dy = min(max(dy * speed, -MAX_SPEED), MAX_SPEED)
            x += dx
            y += dy
            self.objects[i] = (x, y)

Контроль скорости появления

Вы также можете контролировать скорость появления новых объектов в игре. Измените код, чтобы включить задержку между появлением новых объектов:

import time
class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10
        self.objects = []
        self.last_spawn_time = time.time()
    def update(self, delta_time):
       # control the spawning rate here
        if time.time() - self.last_spawn_time > SPAWN_DELAY:
            if len(self.objects) < MAX_OBJECTS:
                self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
                self.last_spawn_time = time.time()
        for i in range(len(self.objects)):
            x, y = self.objects[i]
            dx = self.player_x - x
            dy = self.player_y - y
            distance = math.sqrt(dx ** 2 + dy ** 2)
            if distance < PLAYER_RADIUS + OBJECT_RADIUS:
                self.objects.pop(i)
                self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
            elif distance < 100:
                dx /= distance
                dy /= distance
                x += dx * 3
                y += dy * 3
                self.objects[i] = (x, y)

Отрегулируйте значения SPAWN_DELAY и MAX_OBJECTS, чтобы найти правильный баланс для вашей игры. Более длительная задержка или меньшее максимальное количество объектов сделают игру менее насыщенной. Принимая во внимание, что более короткая задержка или больший максимум увеличат сложность.

Сделайте игры более увлекательными, используя движущиеся объекты

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

Статьи по данной тематике: