#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 за помощь!