Как изменить размер коллизионного ящика круга спрайта в Pygame - PullRequest
1 голос
/ 15 апреля 2019

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

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

В классе My Ball используются объекты ball, представляющие собой круги.Есть два, которые должны взаимодействовать друг с другом: шар и лаб.

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)

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

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

1 Ответ

2 голосов
/ 15 апреля 2019

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

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

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


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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...