【问题标题】:'tuple' has no attribute colliderect pygame'tuple' 没有属性 colliderect pygame
【发布时间】:2018-04-26 17:28:02
【问题描述】:

我正在尝试检测十字准线与我创建的目标之间的碰撞。

当检测到碰撞时,目标将从其所在的所有精灵组中消失。

如果有人可以向我解释为什么会发生这种情况并可能提出解决方案,我将不胜感激。谢谢!

class Cross(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = crosshairImage
        self.rect = crosshairImage
        self.shooting = 0

    def update(self):
        position = pygame.mouse.get_pos()
        self.rect = position

    def shoot(self,attack):
        if not self.shooting:
            self.shooting = 1
            return self.rect.colliderect(attack.rect)

    def undo(self):
        self.shooting = 0

class Target0(pygame.sprite.Sprite):    
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = targetImage
        self.rect = targetImage
        self.hp = 1

    def update(self):
        position0 = screen.blit(targetImage, (181.75,204))
        self.rect = position0

while running:
    milliseconds = clock.tick(FPS)
    playtime += milliseconds/1000.0

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            running = False     
        elif event.type == MOUSEBUTTONDOWN:
            if cross.shoot(target0):
                target0.kill()
        elif event.type == MOUSEBUTTONUP:
            cross.undo()

    allsprites.update()

    screen.blit(background, (0,0))
    allsprites.draw(screen)
    pygame.display.flip()

    text = "FPS: {0:.2f}   Playtime: {1:.2f}".format(clock.get_fps(), playtime)
    pygame.display.set_caption(text) 

    pygame.display.flip()

【问题讨论】:

标签: python pygame


【解决方案1】:

您忘记将get_rect() 值放在矩形上。将self.rect 值更改为这些值,它应该可以工作

self.rect = self.image.get_rect()

【讨论】:

    【解决方案2】:

    Pygasm 已经提到您必须将self.rect 属性设置为实际的rect 实例而不是表面:self.rect = self.image.get_rect()(如果需要,还可以更改矩形的坐标)。

    AttributeError 起源于Crossupdate 方法,您将self.rect 设置为作为元组的pygame.mouse.get_pos() 位置,而元组没有colliderect 方法在Crossshoot 方法中调用它。

    相反,您必须更新 rect 的 center 坐标(或其他 rect 属性之一):

    def update(self):
        self.rect.center = pygame.mouse.get_pos()
    

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2022-01-14
      • 2020-12-28
      • 1970-01-01
      • 2022-11-17
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多