Pygame Настраиваемая прямая линия для обнаружения столкновений

#python #pygame #collision #rectangles

Вопрос:

Мне удалось использовать sprite collide, чтобы заставить игрока столкнуться с другим спрайтом, и это хорошо работает.

Однако spritecollide функция позволяет ей (насколько я могу понять, по крайней мере) сталкиваться только с прямой кишкой, называемой self.rect

У меня есть пользовательская прямая self.hitbox кишка, с которой я хочу, чтобы мой плеер столкнулся, так как прямая кишка хитбокса отличается размером от самой встроенной прямой кишки

Вот мой код для столкновения с самим собой.прямо

 def collide_blocks(self, direction):

    hits = pygame.sprite.spritecollide(self, self.game.block_objects, False)
          
    if hits:
        for i in hits:
            if direction == "x":
              if self.x_change > 0:
                self.rect.x = i.rect.left - self.rect.width
              if self.x_change < 0:
                self.rect.x = i.rect.right 
            if direction == "y":
              if self.y_change > 0:
                self.rect.y = i.rect.top - self.rect.height 
              if self.y_change < 0:
                self.rect.y = i.rect.bottom
 

Как адаптировать мой код, чтобы он сталкивался с i.hitbox вместо i.rect (I = спрайт столкнулся с)

Комментарии:

1. Не могли бы вы просто создать hitbox pygame.Rect объект, а затем использовать pygame.Rect.colliderect() его для обнаружения столкновений?

Ответ №1:

4-м аргументом pygame.sprite.spritecollide может быть определенная пользователем функция обратного вызова, используемая для вычисления, сталкиваются ли два спрайта:

 def hitbox_collide(sprite1, sprite2):
    return sprite1.hitbox.colliderect(sprite2.hitbox)
 
 hits = pygame.sprite.spritecollide(self, self.game.block_objects, False, hitbox_collide)
 

Комментарии:

1. @WilliamRedding Я не вижу вашего кода. Я дал вам общий ответ, но вы должны сами найти ошибки в своем коде.

2. Хорошо, спасибо за вашу помощь в обнаружении!