无类型对象没有属性更新

时间:2017-06-13 13:41:13

标签: python python-3.x pygame sprite

我正在尝试制作游戏。就像在任何其他射击游戏中一样,敌人应该在射击时消失。显然,你不能杀死表面,但你可以杀死精灵。所以我试图将我的图像作为精灵加载,但我得到一个奇怪的错误。我创建类,向其应用变量,为pygame.sprite.Group创建变量,并将类变量添加到组中。当我尝试更新群组时,它会说"'NoneType' object has no attribute 'update'"。这是该类的代码:

class Spawn(pygame.sprite.Sprite):
    def __init__(self,primaryx,primaryy):
        pygame.sprite.Sprite.__init__(self)
        global directionM
        self.directionM=directionM
        x1=random.randint(100,400)
        y1=random.randint(100,400)
        self.x1=x1
        self.y1=y1
        self.primaryx=primaryx
        self.primaryy=primaryy
    def AIPrototype(self):
        minionup=pygame.image.load("Alien.png").convert_alpha()
        miniondown=pygame.image.load("Aliendown.png").convert_alpha()
        minionleft=pygame.image.load("Alienleft.png").convert_alpha()
        minionright=pygame.image.load("Alienright.png").convert_alpha()
        global x,y,posx,posy
        seperate=random.randint(1,1000)
        screen.blit(self.directionM,(self.primaryx,self.primaryy))
        if seperate==2:
            self.primaryx=x+100
        if seperate==20:
            self.primaryx=x-100
        if seperate==150:
            self.primaryy=y+100
        if seperate==200:
            self.primaryy=y-100
        self.x1=self.primaryx
        self.y1=self.primaryy
        if self.x1<x:
            xspeed1=1
            slopex1=x-self.x1
        if self.x1>x:
            xspeed1=-1
            slopex1=self.x1-x
        if self.y1<y:
            yspeed1=1
            slopey1=y-self.y1
        if self.y1>y:
            yspeed1=-1
            slopey1=self.y1-y       
    #
        hypo1=((slopex1**2)+(slopey1**2))**0.5
        speedmark1=hypo1/1
        speedy1=slopey1/speedmark1
        speedx1=slopex1/speedmark1
        movex1=speedx1
        movey1=speedy1
        if self.x1<=640 and self.x1>=0:
            if self.x1>x:
                self.x1+=xspeed1*movex1
                if self.x1<x:
                    xspeed1=0
        if self.y1<=480 and self.x1>=0:
            if self.y1>y:
                self.y1+=yspeed1*movey1
                if self.y1<y:
                    yspeed1=0
        if self.x1<=640 and self.x1>=0:
            if self.x1<x:
                self.x1+=xspeed1*movex1
                if self.x1>x:
                    xspeed1=0
        if self.y1<=480 and self.x1>=0:
            if self.y1<y:
                self.y1+=yspeed1*movey1
                if self.y1>y:
                    yspeed1=0
    #
        if self.x1>640:
            self.x1=640
        if self.x1<0:
            self.x1=0
        if self.y1>480:
            self.y1=480
        if self.y1<0:
            self.y1=0
        if self.y1>=posy-20 and self.y1<=posy+20 and self.x1>=x-20 and self.x1<=x+20:
            Spawn.kill()
        self.primaryx=self.x1
        self.primaryy=self.y1

这是游戏循环:

spritegroup=pygame.sprite.Group()
spawn=Spawn(600,200)
spritegroup=spritegroup.add(spawn)
clock = pygame.time.Clock() 
keepGoing = True        

try:
    while keepGoing:
        clock.tick(60) 
        screen.fill(THECOLORS['red'])
        char()#start
        x+1
        posxlist.append(x)
        posylist.append(y)
        spritegroup.update()
        pygame.display.flip()

我意识到我的代码非常混乱且效率低下,我真的很抱歉。我完全不习惯使用类和精灵。

1 个答案:

答案 0 :(得分:2)

spritegroup.add(spawn)返回None。不要将其分配回spritegroup,操作会将对象更改为

换句话说,请改为:

spritegroup = pygame.sprite.Group()
spawn = Spawn(600,200)
spritegroup.add(spawn)

来自spritegroup.Group.add() documentation

  

将Sprite添加到此组
  add(*sprites) - &gt; None