如何在PyGame中更改圆形精灵的碰撞盒的大小

时间:2019-04-15 15:32:14

标签: python pygame

我正在设计游戏,但是我推迟了开发,将精力集中在圆形的精灵碰撞上。

我不是100%不确定'pygame.sprite.collide_circle'命令如何使用其括号,但是我将其包含在Collidecheck变量中,并创建了一个名为'collided'的新变量,然后将其包含在Collidecheck中为'碰撞=无”。

我的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)

我本来希望在控制台内看到ball和llab之间的碰撞,但是ball和llab的碰撞盒很大,我不希望这样。我只希望看到这两个圆圈的命中框扩展到其实际形状,并且不会更大。尽管我不确定,但似乎他们的Hitbox大小是其两倍大

P.S我知道我可以使用数学并且可能必须这样做,我想知道是否有人对Sprite函数有更好的了解以帮助我。

1 个答案:

答案 0 :(得分:2)

请参阅pygame.sprite.collide_circle的文档

  

如果子图形具有“ 半径”属性,该属性用于创建圆,否则将创建一个圆,该圆大到可以完全包围“矩形”给定的子矩形rect属性。

因此,您必须在self.radius中创建Ball,它的大小可以小于球形的大小。


它如何工作?它获取两个精灵的中心,并使用Pythagorean theorema**2 + b**2 = c**2)计算这些点之间的距离。如果它小于sprite1.radius1 + sprite2.radius2,则说明您有冲突。

顺便说一句:PyGame有pygame.math.Vector2.distance_to()来计算它。