如何解决 Pygame 中的 AttributeError: 'Powup' 对象没有属性 'last_true'

4 阅读1分钟

在 Pygame 中,我们经常会使用 sprite 来创建游戏中的各种对象。sprite 是 Pygame 中的一个类,它可以帮助我们管理游戏中的对象。我们可以通过继承 sprite 类来创建自己的对象。

在下面的代码中,我们创建了一个名为 Powup 的对象。Powup 对象继承了 sprite 类。Powup 对象有一个 last_true 属性,该属性记录了上次对象状态为 true 的时间。

class Powup(pg.sprite.Sprite):
    def __init__(self,x ,y ,color):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((10,10))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.vx = 0
        self.vy = 0
        self.state = False
        self.power = 1
        self.timeout = 5000
        #self.last_true = pg.time.get_ticks()




    def update(self):

        if p.rect.left < self.rect.centerx < p.rect.right and self.rect.bottom >= 560:
            self.kill()
            self.last_true = pg.time.get_ticks()
            self.state = True
            p.image.fill(red)

        if ( pg.time.get_ticks() - self.last_true ) > 5000  :
            p.image.fill(black)
            self.state = False



        self.rect.y += self.vy

Powup 对象的 update 方法中,我们使用了一个 if 语句来检查对象的状态。如果对象的状态为 true,则我们执行一些操作。否则,我们执行其他操作。

但是,当我们运行程序时,我们遇到了一个错误:

AttributeError: 'Powup' object has no attribute 'last_true'

这个错误意味着 Powup 对象没有 last_true 属性。这很奇怪,因为我们在 Powup 对象的初始化方法中已经定义了 last_true 属性。

2、解决方案

这个问题的原因是,我们在 Powup 对象的初始化方法中注释掉了 self.last_true = pg.time.get_ticks() 这行代码。这行代码的作用是将 last_true 属性设置为当前时间。如果没有这行代码,last_true 属性将始终为 None。

因此,为了解决这个问题,我们需要取消对 self.last_true = pg.time.get_ticks() 这行代码的注释。

class Powup(pg.sprite.Sprite):
    def __init__(self,x ,y ,color):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((10,10))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.vx = 0
        self.vy = 0
        self.state = False
        self.power = 1
        self.timeout = 5000
        self.last_true = pg.time.get_ticks() # 取消注释




    def update(self):

        if p.rect.left < self.rect.centerx < p.rect.right and self.rect.bottom >= 560:
            self.kill()
            self.last_true = pg.time.get_ticks()
            self.state = True
            p.image.fill(red)

        if ( pg.time.get_ticks() - self.last_true ) > 5000  :
            p.image.fill(black)
            self.state = False



        self.rect.y += self.vy

现在,当我们运行程序时,错误消失了。