Вы можете отделить Rect
, который используется для рисования от фактического обнаружения столкновения.Если вы посмотрите на функцию pygame.sprite.spritecollide () , вы увидите параметр с именем collided
:
Аргумент с коллизиями - это функция обратного вызова, используемая для вычисления, еслидва спрайта сталкиваются.он должен принимать два спрайта в качестве значений и возвращать значение bool, указывающее, сталкиваются ли они.Если коллизия не передана, все спрайты должны иметь значение «прямоугольник», представляющее собой прямоугольник области спрайтов, который будет использоваться для расчета коллизии.
Pygame уже поставляется с несколькими функциями, которыеВы можете использовать для обнаружения столкновений:
collide_rect, collide_rect_ratio, collide_circle,
collide_circle_ratio, collide_mask
collide_rect
по умолчанию.
Вы можете использовать collide_mask
для идеального столкновения пикселей, или вы можете предоставить свою собственную функцию.
Если вы хотите просто «переместить» Rect
для обнаружения столкновения, как вы сказали в своем комментарии, вы можетедать вашим спрайтам секунду Rect
, которая находится внизу вашего изображения, что-то вроде этого:
class Sprite(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((64, 80))
self.image.fill((0, 200, 200))
self.rect = pygame.Rect(0, 0, 64, 64)
# some drawing for demonstration
pygame.draw.rect(self.image, (255, 0, 0), self.rect, 2)
self.collision_rect = self.rect.copy()
self.collision_rect.bottom = self.image.get_rect().bottom
pygame.draw.rect(self.image, (255, 255, 0), self.collision_rect, 2)
, затем создайте функцию для передачи в качестве аргумента collided
, который использует этот новый атрибут collision_rect
:
def collide_collision_rect(left, right):
return left.collision_rect.colliderect(right.collision_rect)
и при вызове spritecollide
передайте функцию в качестве последнего аргумента:
pg.sprite.spritecollide(self, self.game.walls, False, collide_collision_rect)
Вы должны убедиться, что все ваши спрайты имеют атрибут collision_rect
или первый check, если переданные спрайты имеют атрибут collision_rect
и возвращаются к rect
, если их нет.Кроме того, при изменении атрибута rect
обязательно обновите также атрибут collision_rect
.
Конечно, есть и другие способы сделать это;Вы также можете рассчитать, насколько изображение больше прямоугольника, сохранить его в спрайте и в новом обратном вызове collided
просто переместить спрайт rect
на эту величину.Примерно так:
class Sprite(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((64, 80))
self.image.fill((0, 200, 200))
self.rect = pygame.Rect(0, 0, 64, 64)
pygame.draw.rect(self.image, (255, 0, 0), self.rect, 2)
self.diff = self.image.get_rect().height - self.rect.height
def collide_collision_rect(left, right):
return left.rect.move(0, left.diff).colliderect(right.rect.move(0, right.diff))