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

#python #pygame

#python #pygame

Вопрос:

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

Я не уверен на 100%, как работает команда ‘pygame.sprite.collide_circle’ со скобками, однако я включил ее в свою переменную Collidecheck, а также создал новую переменную с именем ‘collided’, чтобы затем включить в Collidecheck как ‘collided = None’.

Мой класс Ball использует объекты ball, которые все являются кругами. Есть два, которые должны взаимодействовать, это ball и llab.

 class Ball(pygame.sprite.Sprite):
    def __init__(self, width, height, herex, herey):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect() 
        pygame.draw.circle(self.image, BLACK, [int(width/2),int(height/2)], int(width/2), 10)
        self.rect.x = herex
        self.rect.y = herey

    def moveRight(self, pixels):
        self.rect.x  = pixels
    def moveLeft(self, pixels):
        self.rect.x -= pixels
    def moveUp(self, pixels):
        self.rect.y -= pixels
    def moveDown(self, pixels):
        self.rect.y  = pixels
 

2 круга находятся в группах спрайтов, поскольку я практикую их использование

 ball = Ball(100, 100, 50, 50)
llab = Ball(100, 100, 350, 250)

g = pygame.sprite.Group(ball)
h = pygame.sprite.Group(llab)
 

В основном игровом цикле мяч перемещается, чтобы я мог протестировать хитбоксы. Если вы посмотрите на консоль, когда она печатает проверку на столкновение, вы увидите, что она работает.

     keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ball.moveLeft(5)
        ballFollow.moveLeft(5)
    if keys[pygame.K_RIGHT]:
        ball.moveRight(5)
        ballFollow.moveRight(5)
    if keys[pygame.K_UP]:
        ball.moveUp(5)
        ballFollow.moveUp(5)
    if keys[pygame.K_DOWN]:
        ball.moveDown(5)
        ballFollow.moveDown(5)

    Collidecheck = pygame.sprite.spritecollide(ball, h, False, pygame.sprite.collide_circle)
    print(Collidecheck)
    screen.fill(RED)

    g.draw(screen)
    h.draw(screen)
 

Изначально я ожидал увидеть в консоли столкновение между ball и llab, но у ball и llab действительно большой хитбокс, который мне не нужен. Я хочу видеть только, что хитбоксы обоих этих кругов соответствуют их фактической форме и не больше. Кажется, что их хитбоксы удваивают их размеры, я думаю, хотя я не уверен

P.S Я понимаю, что мог бы использовать математику и, возможно, придется, мне было интересно, может ли кто-нибудь лучше знать функции спрайта, чтобы помочь мне.

Ответ №1:

Смотрите документацию для pygame.sprite.collide_circle

Если у спрайтов есть атрибут «radius«, который используется для создания круга, в противном случае создается круг, достаточно большой, чтобы полностью охватить спрайты rect, как указано атрибутом «rect».

Итак, вам нужно создать self.radius in Ball , и он может быть меньше размера шара.


Как это работает? Он получает центры обоих спрайтов и использует теорему Пифагора ( a**2 b**2 = c**2 ) для вычисления расстояния между этими точками. Если он меньше sprite1.radius1 sprite2.radius2 , тогда у вас столкновение.

Кстати: в PyGame есть pygame.math.Vector2.distance_to() для его вычисления.

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

1. Спасибо furas за помощь!