Питер предложил, и вы также поняли, что легче работать с Rects вместо позиций при работе с обнаружением столкновений.
Я бы сделал еще один шаг: всегда работаю с Спрайтами !
С помощью Sprites вы получаете доступ ко всем этим удобным функциям обнаружения столкновений в pygame.sprite
. И если вы когда-нибудь решите переместить это изображение, гораздо проще обновить положение и анимировать. Он также содержит поверхность изображения, все в одном объекте. Не говоря уже о спрайте Группы !
Спрайты также имеют атрибут .rect
, поэтому вы всегда можете выполнять низкоуровневые прямоугольные манипуляции, если хотите, с помощью mysprite.rect
Тем не менее, вот как вы можете получить Sprite из вашего изображения:
image_one = pygame.sprite.Sprite()
image_one.image = pygame.image.load("image_one.png").convert()
image_one.rect = pygame.Rect((image_x, image_y), image_one.image.get_size())
Создайте больше спрайтов для image_two
, _three
и т. Д. Или создайте функцию (или, что еще лучше, подкласс Sprite
), получая в качестве аргументов позицию и имя файла, чтобы вы могли создавать спрайты в одиночная строка как:
image_two = MySprite(filename, x, y)
Теперь вы можете при желании группировать их:
my_images = pygame.sprite.Group(image_one, image_two, image_three)
Рисование так же просто, как:
my_images.draw(screen)
Это приведет к блику всех изображений одновременно , каждое на своих позициях! Круто, да?
Давайте создадим «поддельный» спрайт для курсора мыши:
mouse = pygame.sprite.Sprite()
mouse.rect = pygame.Rect(pygame.mouse.get_pos(), (1, 1))
Я сделал его спрайтом 1х1, чтобы он сталкивался только с горячей точкой мыши. Обратите внимание, что у него нет атрибута .image
(отсюда и «поддельный» спрайт), но pygame это не волнует, так как мы не собираемся его рисовать.
А теперь лучшая часть:
imagehit = pygame.sprite.spritecollideany(mouse, my_images)
print imagehit
В одной строке вы проверяли столкновение с всеми изображениями , и не только вы знаете , если мышь столкнулась с любым, но также , который это сделал!
Использование спрайтов действительно окупается;)