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

В настоящее время я разрабатываю небольшую игру с pygame, и мне трудно найти способ проверить наличие столкновений. Я нашел этот вопрос , но я не могу использовать pygame.sprite.spritecollide(player, wall_group, True), потому что мой вызываемый проигрыватель не является «спрайтом», это класс, который я создал (который использует функциональность обычного формы (https://www.pygame.org/docs/ref/draw.html)).

Если бы кто-нибудь мог придумать, как я могу обнаружить столкновения и кратко объяснить мне разницу между «спрайтом» и обычной формой, такой как круг / прямоугольник, я был бы признателен.

1 Ответ

0 голосов
/ 12 сентября 2018

Чтобы использовать функции обнаружения коллизий в Pygame (например, pygame.sprite.spritecollide), вашему классу не обязательно быть подклассом Sprite.

в Pygame.

Благодаря типизации уток в Python фактический класс не имеет значения, если ваш класс ведет себя как Sprite. В этом контексте это просто означает, что ваш класс должен иметь атрибут rect, и он должен быть Rect (опять же, технически, он не обязательно должен быть Rect, только «похожим»).

Учитывая простой класс, подобный этому:

>>> class Foo():
...   def __init__(self):
...     self.rect=pygame.rect.Rect(100, 100, 100, 100)

мы можем использовать pygame.sprite.spritecollide так:

>>> f=Foo()
>>> g=Foo()

>>> pygame.sprite.spritecollide(f, [g], False)
[<__main__.Foo instance at 0x0000000003C6DF48>]

Также посмотрите, что второй аргумент - это не Group, а простой List, но для python все равно, поскольку единственное, что имеет значение в этом случае, - это то, что вы можете перебирать объект. Если вы передадите True в качестве третьего аргумента, это не получится, поскольку spritecollide попытается вызвать sprites() и второй аргумент и kill() для элементов внутри.

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

tl; dr: Использовать класс Sprite в Pygame. Вероятно, у вас нет веской причины не делать этого, и есть масса веских причин, чтобы на самом деле использовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...