Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

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

Узнайте, как добавить базовую физику и коллизии в свою игру с помощью модуля pygame.

Встроенные функции обнаружения столкновений Pygame

Самая основная встроенная функция обнаружения столкновений — spritecollide. Он принимает спрайт, группу спрайтов и логическое значение, указывающее, должны ли спрайты «умирать» (удаляться) при столкновении. Эта функция возвращает список спрайтов, которые столкнулись. Вот пример того, как его использовать:

collided_sprites = pygame.sprite.spritecollide (sprite1, sprite_group, Истинный)

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

instagram viewer

Collision_dict = pygame.sprite.groupcollide (группа1, группа2, Истинный, Истинный)

Создание базовой игры-платформера с использованием функции spritecollide

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

Начать, установить модуль pygame с помощью pip:

pip установить pygame

После этого, создавать простые классы для Player и Platform, оба из которых должны наследоваться от класса Sprite Pygame. Класс Player должен иметь метод обновления для обработки положения игрока в зависимости от скорости. Кроме того, у него должна быть переменная y_velocity для применения эффекта гравитации. Класс Platform должен иметь метод __init__, который принимает координаты платформы и создает поверхность с таким размером.

Класс игрока

Вы можете создать класс Player, используя файл pygame.sprite. Модуль Спрайт. Этот класс инициализирует игрока с заданными координатами x и y. Затем метод обновления обновит позицию игрока, увеличив значение y_velocity.

Импортировать пигейм

сортИгрок(pygame.спрайт. Спрайт):
деф__в этом__(я, х, у):
супер().__инит__()
self.image = pygame. Поверхность((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0

дефобновлять(себя):
self.rect.y += self.y_velocity

Класс платформы

Класс Platform также использует pygame.sprite. Модуль Спрайт. Этот класс инициализирует платформу с заданными координатами x и y, а также шириной и высотой.

сортПлатформа(pygame.спрайт. Спрайт):
деф__в этом__(я, х, у, ширина, высота):
супер().__инит__()
self.image = pygame. Поверхность((ширина, высота))
self.rect = self.image.get_rect (topleft=(x, y))

Игровой цикл

Игровой цикл позволит вам создать окно размером 640x480. Затем он запустит цикл, который будет проверять любые события, такие как команда выхода. Он также проверит любые столкновения между игроком и платформой. Наконец, он заполнит экран белым цветом, нарисует игрока и платформу, а затем перевернет дисплей.

игрок = игрок(100, 300)
player_group = pygame.sprite. Группа()
player_group.add (игрок)

платформа = платформа(50, 400, 100, 20)
группа_платформы = pygame.sprite. Группа()
platform_group.add (платформа)

# Инициализировать pygame и создать окно
pygame.init()
экран = pygame.display.set_mode((640, 480))

# Основной игровой цикл
работает = Истинный

пока бег:
для событие в pygame.event.get():
если event.type == pygame. ПОКИДАТЬ:
работает = ЛОЖЬ

player_group.update()
столкнулся = pygame.sprite.spritecollide (игрок, группа_платформы, ЛОЖЬ)

если столкнулся:
player.y_velocity = 0
экран.заполнить((255, 255, 255))
player_group.draw (экран)
platform_group.draw (экран)
pygame.display.flip()

pygame.выйти()

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

Реализация гравитации и прыжкового поведения

Чтобы реализовать гравитацию и прыжки в игре-платформере, вам нужно будет добавить скорость по оси Y к спрайту игрока и обновлять его позицию по оси Y в каждом кадре. Для этого вы можете использовать метод update внутри класса Player и добавить следующий фрагмент кода:

сортИгрок(pygame.спрайт. Спрайт):
деф__в этом__(я, х, у):
супер().__инит__()
self.image = pygame. Поверхность((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0

дефобновлять(себя):
self.rect.y += self.y_velocity
self.y_velocity += ГРАВИТАЦИЯ # Применяем гравитацию к скорости y

Теперь каждый раз, когда вы вызываете метод update, он будет обновлять положение игрока в соответствии с его скоростью и гравитацией.

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

ПРЫЖОК_СКОРОСТЬ = -10

# внутри игрового цикла
если event.type == pygame. КЕЙДАУН и event.key == pygame. K_SPACE:
player.y_velocity = ПРЫЖОК_СКОРОСТЬ

Обратите внимание, что вам нужно будет проверить event.type, чтобы убедиться, что событие является событием KEYDOWN, прежде чем проверять значение ключа.

Добавление базовой физики, такой как трение и ускорение

Чтобы добавить базовую физику, такую ​​как трение и ускорение, в вашу платформерную игру, вам нужно будет обновлять x скорость вашего спрайта игрока в каждом кадре. Вы можете добавить скорость x в класс игрока и обновить его так же, как и скорость y. Чтобы реализовать трение, вы можете уменьшить скорость x спрайта игрока на небольшую величину в каждом кадре. Например, вы можете добавить следующий фрагмент кода в метод update класса Player:

ТРЕНИЕ = 0.9

сортИгрок(pygame.спрайт. Спрайт):
деф__в этом__(я, х, у):
супер().__инит__()
self.image = pygame. Поверхность((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0
self.x_velocity = 0

дефобновлять(себя):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += ГРАВИТАЦИЯ # Применяем гравитацию к скорости y
self.x_velocity *= ТРЕНИЕ # Применяем трение к скорости x

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

УСКОРЕНИЕ = 0.5
движение_игрока = 0

если event.type == pygame. КЛЮЧ:
если event.key == pygame. K_LEFT:
движение_игрока = -1
Элиф event.key == pygame. К_ПРАВО:
движение_игрока = 1
Элиф event.type == pygame. КЛАВИАТУРА:
если ключ события в (пигейм. K_LEFT, pygame. К_ПРАВО):
движение_игрока = 0

player.x_velocity += player_movement * УСКОРЕНИЕ

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

Вы можете найти полный код в Репозиторий GitHub.

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

Улучшите взаимодействие пользователей с помощью столкновений

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

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