Реализация метода столкновений с точки зрения отношения

Я хотел бы создать список объектов, которые сталкиваются с пользователем. Однако я не хочу использовать метод sprite.collide_rect_ratio(), потому что он создает прямоугольную область, которая слишком велика для столкновения (т. е. кажется, что объекты сталкиваются, хотя на самом деле они не соприкасаются). Я хочу использовать pygame.sprite.collide_rect_ratio(ratio): для решения проблемы. Как реализовать метод, чтобы он возвращал список объектов, с которыми сталкивается пользователь?

Он будет реализовывать тот же код, но с меньшей площадью столкновения, как следующий код:

sprite_list = pygame.sprite.spritecollide(myself, all_sprites_list, False)

Спасибо.


person user1111042    schedule 16.01.2012    source источник


Ответы (1)


Это может быть полезно для вас,

Возможно, вы захотите изучить «Столкновение на пиксель», которое сначала будет использовать ограничивающую рамку объекта (что, как я подозреваю, делает функция collide_rect).

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

Эта ссылка может быть вам полезна, это очень хорошо сделанный учебник для Фреймворк C++ похож на pygame.

Код Per Pixel Collision находится на полпути вниз по странице и действует так, как я описал выше. Надеюсь, это будет полезно для вас, поскольку сводит на нет необходимость в соотношениях прямоугольников из-за «невидимых столкновений».

быстрый поиск в Google может помочь вам с этим типом обнаружения столкновений.

Для небольшого повышения вот пример кода pygame:

for s in sprites:
    # if no intersection then 'intersection' will be of size 0
    intersection = s.Rect.clip(user.rect)
    if intersection.width != 0 and intersection.height != 0:
        # perform collision detection

Вот уже написанная и протестированная версия из вики pygame. Чтение каждой вещи на этой странице даст вам хорошие знания о столкновении пикселей и хороший пример кода, который вы можете использовать сразу.

извините, если это было слишком далеко от темы, но я чувствую, что это может быть очень полезно для вас, поскольку отношения (я чувствую) не будут хорошо работать для обнаружения столкновений.

Вы также можете посмотреть документацию по прямоугольникам в pygame.


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

person Serdalis    schedule 16.01.2012
comment
как бы вы реализовали столкновение пикселей в pygame? - person user1111042; 16.01.2012
comment
Я включил в ответ небольшой фрагмент кода, как бы я его реализовал. Используя pygames Rect.clip(), чтобы получить пересечение между ограничивающими рамками спрайтов, я мог бы выполнить предварительное обнаружение столкновений (например, то, что вы делаете, и оттуда я могу просто проверить каждый пиксель в этом пересечении, я расширим else для вас немного однако. - person Serdalis; 16.01.2012