【问题标题】:How do you assign a "rect" attribute to a pygame.sprite.rect rectangle in Pygame?如何在 Pygame 中为 pygame.sprite.rect 矩形分配“rect”属性?
【发布时间】:2020-04-22 16:42:02
【问题描述】:

以前有人问过这个问题,但他们回答的代码不适用于我。

我想检查两个矩形何时在我的游戏中发生碰撞,对于圆形,我在圆形后面放了一个矩形(它是黑色的)。

但是,当我运行时,我收到一条错误消息,指出矩形需要具有 rect 属性。

这是我的代码:

clock = pygame.time.Clock()

pygame.init()
change = False
screen = pygame.display.set_mode((400, 300))

done = False
x = 100
y = 30
bound = False
while not done:
    for event in pygame.event.get():


        if event.type == pygame.QUIT:
             done = True
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_f:
             color = (255, 255, 255)
             pygame.draw.rect(screen, color, (110, 30, 60, 60))
             bound = True
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_z:
             change = not change
    if bound:
        pressed = pygame.key.get_pressed()

        if pressed[pygame.K_DOWN] or pressed[pygame.K_s]:
            y += 5
        elif pressed[pygame.K_RIGHT] or pressed[pygame.K_d]:
            x += 5
        elif pressed[pygame.K_LEFT] or pressed[pygame.K_a]:
            x -= 5
        elif pressed[pygame.K_UP] or pressed[pygame.K_w]:
            y -= 5
        elif change:
            color2 = (0, 128, 86)
        else:
            color2 = (0, 128, 10)
        screen.fill((0, 0, 0))
        pygame.draw.rect(screen, color2, (x, y, 60, 60))
        #pygame.draw.rect(screen, (255, 255, 255), (150, 30, 10, 60))
        pygame.draw.rect(screen, (255, 255, 255), (x+ 65, y + 24, 20, 10))
    else:
        pressed = pygame.key.get_pressed()

        if pressed[pygame.K_DOWN] or pressed[pygame.K_s]:
            y += 5
        elif pressed[pygame.K_RIGHT] or pressed[pygame.K_d]:
            x += 5
        elif pressed[pygame.K_LEFT] or pressed[pygame.K_a]:
            x -= 5
        elif pressed[pygame.K_UP] or pressed[pygame.K_w]:
            y -= 5
        elif change:
            color2 = (0, 128, 86)
        else:
            color2 = (0, 128, 10)

        screen.fill((0, 0, 0))
        player = pygame.draw.rect(screen, color2, (x, y, 60, 60))
        back = pygame.draw.rect(screen, (0, 0, 0), (210, 210, 40, 40))
        gun1 = pygame.draw.circle(screen, (0, 0, 255), (250, 250), 40, 1)
        pygame.draw.rect(screen, (255, 255, 255), (240, 245, 20, 10))
    clock.tick(60)

    pygame.display.flip()

谁能给我代码,将 rect 属性分配给我的矩形?

谢谢!

【问题讨论】:

  • 我运行代码没有错误,在运行时或某些操作后是否出现错误?
  • @kaktus_car 有时错误的出现取决于 IDE 运行程序的方式。我运行了代码,它们在运行时引发。
  • 是的,sublime 很好。很高兴看到您找到了正确的答案。
  • @kaktus_car 谢谢!

标签: python error-handling pygame attributes collision-detection


【解决方案1】:

pygame.sprite.collide_rect()pygame.sprite.spritecollide()pygame.sprite.groupcollide() 等操作适用于pygame.sprite.Sprite 对象和pygame.sprite.Group 对象。
此操作使用Sprite 对象的内部.rect 属性来检测冲突。

你既没有Sprite 也没有Group,但你有pygame.Rect 对象。

要验证 2 个pygame.Rect 对象是否发生碰撞,您必须使用pygame.Rect.colliderect()。例如:

player = pygame.draw.rect(screen, color2, (x, y, 60, 60))
back = pygame.draw.rect(screen, (0, 0, 0), (210, 210, 40, 40))
gun1 = pygame.draw.circle(screen, (0, 0, 255), (250, 250), 40, 1)

if player.colliderect(back):
    print("player collide back")
if player.colliderect(gun1):
    print("player collide gun1")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多