Как я могу обнаружить столкновения в Pygame? - PullRequest
0 голосов
/ 24 мая 2019

Я делаю игру в стиле космического шутера с астероидами, и я не могу понять, как делать столкновения между моими пулями и астероидами / пришельцами и, конечно же, кораблем.

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

Моя попытка:

        for missile in missiles:
            for asteroid in asteroids:
                if missiles[missile][0] > asteroids[asteroid][0] or missiles[missile][0] + 20 < asteroids[asteroid][0] + 70:
                    # remove missile and asteroid

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

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

Просмотрите документацию здесь: https://www.pygame.org/docs/ref/sprite.html

Он предоставит информацию о том, как реализовать правильное обнаружение столкновений между спрайтами.

Для вашего примера я предполагаю, что ваши отдельные ракеты и астроиды являются спрайтами в PyGame.

Тогда я предполагаю, что отдельные ракеты и астроиды находятся в группах спрайтов, называемых «ракеты» и «астроиды».

Если это так, вы можете просто сделать следующее:

pygame.sprite.groupcollide(missiles, astroids, true, true)

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

0 голосов
/ 24 мая 2019

Проверки столкновений проверяют перекрытия в горизонтальном или вертикальном положениях:

if obj1.y + obj1.radius > obj2.y - obj2.radius
if obj1.y - obj1.radius < obj2.y - obj2.radius

Сделайте то же самое для направления x, но помните, что направления меняются в зависимости от того, в каком направлениипиксели увеличиваются

...