gpt4 book ai didi

python - 如何在pygame中更改圆形 Sprite 碰撞框的大小

转载 作者:行者123 更新时间:2023-12-01 01:02:20 25 4
gpt4 key购买 nike

我正在设计一款游戏,但我推迟了开发,以专注于圆形 Sprite 的碰撞。

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

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

当我练习使用它们时,这两个圆圈位于 Sprite 组中

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)

我原本希望在控制台中看到球和 llab 之间的碰撞,但球和 llab 有一个非常大的碰撞箱,这是我不想要的。我只想看到这两个圆圈的碰撞盒延伸到它们的实际形状并且不再更大。虽然我不确定,但我认为他们的碰撞箱大小似乎是它们的两倍

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

最佳答案

请参阅 pygame.sprite.collide_circle 的文档

If the sprites have a "radius" attribute, that is used to create the circle, otherwise a circle is created that is big enough to completely enclose the sprites rect as given by the "rect" attribute.

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

<小时/>

它是如何工作的?它获取两个 Sprite 的中心并使用 Pythagorean theorem (a**2 + b**2 = c**2) 来计算这些点之间的距离。如果它小于sprite1.radius1 + sprite2.radius2,那么就会发生碰撞。

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

关于python - 如何在pygame中更改圆形 Sprite 碰撞框的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com