Как использовать идеальное столкновение пикселей с двумя изображениями pygame

Примечание. Я не хочу использовать спрайты pygame.

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

(Эти изображения имеют прозрачный фон)


person L D    schedule 16.06.2020    source источник
comment
Обычный способ состоит в создании попиксельной битовой маски, пиксели которой считаются частью столкновения. Определите, перекрываются ли прямоугольники, окружающие изображения, затем сравните битовые маски перекрывающейся области, чтобы увидеть, есть ли перекрытие важных пикселей. Меня интересуют ваши причины нежелания использовать спрайты pygame! Не могли бы вы подробнее рассказать о причинах этого?   -  person Kingsley    schedule 16.06.2020
comment
@Kingsley Во-первых, спасибо за предложение о битовых масках. Моя единственная проблема в том, что я не знаю, как их генерировать и / или сравнивать. Отвечая на ваш вопрос, возможно, я не понимаю спрайты так хорошо, как следовало бы, но судя по тому немногому, что я на них смотрел, казалось, что в конечном итоге у меня будет меньше контроля - возможно, мне стоит изучить это больше.   -  person L D    schedule 16.06.2020
comment
Да, это небольшая работа - поначалу, но создание собственных спрайтов (что вы и предлагаете) - это намного больше работы! Я думаю, у вас есть полный контроль со спрайтами. Может попробовать, жду ваших вопросов: D   -  person Kingsley    schedule 16.06.2020


Ответы (1)


Прежде всего, не бойтесь спрайтов.

Sprite - это простой класс с изображением. (Surface, который хранится в атрибуте image), а также размер и положение изображения (Rect хранится в атрибуте rect).

Итак, когда вы используете такой класс:

class Player:
    def __init__(self, image, pos):
        self.image = image
        self.pos = pos

    def draw(self, screen):
        screen.blit(self.image, self.pos)

вместо этого вы можете просто использовать класс Sprite, так как мало что изменится:

class Player(pygame.sprite.Sprite):
    def __init__(self, image, pos):
        super().__init__()
        self.image = image
        self.rect = image.get_rect(center=pos)

Вместо этого это стало проще, потому что мы можем позволить pygame обрабатывать отображение изображения на экране.

Итак, чтобы использовать идеальное столкновение пикселей, вы можете использовать Mask < / a> класс. Используйте pygame.mask.from_surface, чтобы создать Mask из вашего Surface, и используйте pygame.mask.Mask.overlap, чтобы проверить, не перекрываются ли две маски.

Его проще использовать, если вы используете класс Sprite, поскольку вы можете просто использовать такие функции, как _ 13_ вместе с _14 _ .

Но если вы не хотите использовать класс Sprite, просто посмотрите, насколько collide_mask реализовано, чтобы узнать, как можно использовать маски:

def collide_mask(left, right):
    xoffset = right.rect[0] - left.rect[0]
    yoffset = right.rect[1] - left.rect[1]
    try:
        leftmask = left.mask
    except AttributeError:
        leftmask = from_surface(left.image)
    try:
        rightmask = right.mask
    except AttributeError:
        rightmask = from_surface(right.image)
    return leftmask.overlap(rightmask, (xoffset, yoffset))
person sloth    schedule 16.06.2020