2016-09-28 119 views
0

我正在使用Pygame編寫遊戲,現在我遇到了這個問題,我想在遊戲中的怪物上添加一個產卵計時器。現在計時器工作正常,第一產卵波被製成,一切是偉大的,了不起的,直到第二次浪潮,它說:Python,Pygame,Class對象不再可調用

Monster1 = Monster() 

TypeError: 'Monster' object is not callable

現在,這個我不明白,因爲它已經把它稱爲在在此之前的一輪。

我仔細檢查過我的文本,看看我是否正在改變課程中的任何功能或使其不應該被調用,但我只是不明白。

這個循環使得派生妖怪

while Game: 
    if time.clock() - WaveTimer > 10: 
    WaveTimer = time.clock() 
     print "The Moon is full" 
     for i in range(3*SpawnRate): 
      Monster1 = Monster() 
      monster_list.add(Monster1) 
      character_list.add(Monster1) 
      SpawnRate += 1 

這是怪獸級的

class Monster(Character): 
    Current_HP = 50 
    Max_Hp = 50 
    walking_frame = [] 
    fighting_frame = [] 
    hit_frame = [] 
    Fighting = False 
    Flag = True 
    frame1= 0 
    LastFrame1 = 0 
    TimeBetweenAtkFrames = 0.1 
    X_Speed = 0 
    Y_Speed = 0 
    damaged = False 
    RecordedAni = True 
    damagedspeed = 1 
    image_file = "C:/Users/Gideon/PycharmProjects/untitled1/Sprite Images/All.png" 
    sprite_sheet = SpriteSheet(image_file) 
    hitimage = sprite_sheet.get_image(96, 336, 48, 48) 
    hitimage = pygame.transform.scale(hitimage, (50, 50)) 
    for i in range(5): 
     image = sprite_sheet.get_image(i * 48, 288, 48, 48) 
     fighting_frame.append(image) 
    for i in range(4): 
     image = sprite_sheet.get_image(i * 48, 144, 48, 48) # Temp 
     walking_frame.append(image) 
    for i in range(4): 
     image = sprite_sheet.get_image(i * 48, 192, 48, 48) # Temp 
     walking_frame.append(image) 
    image = sprite_sheet.get_image(0, 144, 48, 48) 
    image = pygame.transform.scale(image, (50, 50)) 
    orgimage = image 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.Loc_x = random.randrange(20,700) 
     self.Loc_y = random.randrange(20,100) # temp 
     self.rect = self.image.get_rect() 
     self.rect.left, self.rect.top = [self.Loc_x, self.Loc_y] 
     for i in range (2): 
      image = self.sprite_sheet.get_image(i * 48, 336, 48, 48) 
      self.hit_frame.append(image) 
      i += 1 
    def move(self,character): 
     if self.Alive: 
      if self.Current_HP < self.Max_Hp: 
       self.damagedspeed = 2 
      if character.Loc_x > self.Loc_x + 25: 
       self.X_Speed = 1.5 * self.damagedspeed 
       self.Loc_x += self.X_Speed 
      if character.Loc_x < self.Loc_x - 25: 
       self.X_Speed = 1.5 * self.damagedspeed 
       self.Loc_x -= self.X_Speed 
      if character.Loc_y > self.Loc_y + 25: 
       self.Y_Speed = 1.5 * self.damagedspeed 
       self.Loc_y += self.Y_Speed 
      if character.Loc_y < self.Loc_y - 25: 
       self.Y_Speed = 1.5 * self.damagedspeed 
       self.Loc_y -= self.Y_Speed 
      if (self.Flag): 
       self.Animation() 
      wall_hit_list = pygame.sprite.spritecollide(self, CollideList, False) 
      for wall in wall_hit_list: 
       if self.X_Speed > 0: 
        self.X_Speed = 0 
        self.Loc_x = self.Loc_x - 5 
       if self.X_Speed < 0: 
        self.X_Speed = 0 
        self.Loc_x = self.Loc_x + 5 
       if self.Y_Speed > 0: 
        self.Y_Speed = 0 
        self.Loc_y = self.Loc_y - 5 
       if self.Y_Speed < 0: 
        self.Y_Speed = 0 
        self.Loc_y = self.Loc_y + 5 
      self.FightAnimation(character) 
      self.image = pygame.transform.rotate(self.orgimage, self.Angle) 
      self.rect = self.image.get_rect() 
      self.rect.left, self.rect.top = [self.Loc_x, self.Loc_y] 
      self.X_Speed = 0 
      self.Y_Speed = 0 
    def FightAnimation(self,character): 
    #  Monster Fight Animation 
     if character.Loc_x <= self.Loc_x + 25 and character.Loc_x >= self.Loc_x - 25: 
      if character.Loc_y <= self.Loc_y + 25 and character.Loc_y >= self.Loc_y - 25: 
       if(self.Fighting == False): 
        self.LastFrame1 = time.clock() 
        self.Fighting = True 
        if (self.frame1 < len(self.fighting_frame)): 
         self.Flag = False 
         self.image = self.fighting_frame[self.frame1] 
         self.image = pygame.transform.scale(self.image, (60, 60)) 
         self.orgimage = self.image 
         if (self.frame1 == 3): 
          character.Current_HP -= 20 
         self.frame1 += 1 
        else: 
         self.frame1 = 0 
      else: 
       if (self.frame1 != 0): 
        self.frame1 = 0 
       self.Flag = True 
     else: 
      if (self.frame1 != 0): 
       self.frame1 = 0 
       self.image = self.fighting_frame[self.frame1] 
       self.image = pygame.transform.scale(self.image, (60, 60)) 
       self.orgimage = self.image 
      self.Flag = True 
     if self.Fighting and time.clock() - self.LastFrame1 > self.TimeBetweenAtkFrames: 
      self.Fighting = False 

如果有其他任何你需要知道的只是告訴我,我將它添加 如果這真的很凌亂我很抱歉它第一次使用StackOverFlow網站:$

+1

你的代碼中的某個地方有'Monster = something',這個陰影創建了類。 –

+0

^感謝您的編輯。我以前從未使用過此網站。你是美好的人 –

+1

什麼@ŁukaszRogalski建議是最有可能的罪魁禍首。在這種情況下, [PEP8](https://www.python.org/dev/peps/pep-0008/)的編碼風格將幫助您,因爲變量名通常用小寫字母指定,即更改實例,如「Monster1 =怪物()'到'怪物1 =怪物()'。你應該能夠快速解決你的問題。 – nluigi

回答

1

在代碼的某處,您「覆蓋」了名稱Monster,然後不再指向你的班級。

確保你沒有在代碼中的任何地方執行Monster = whatever

另外,還要注意Current_HPMax_Hp等都是類的成員,而不是實例成員,因此,如果您在Monster實例偶然Current_HP,你改變它的所有Monster實例。

+0

如果我使用類似Current_Hp或類似的東西我做的東西線:在bullet_list的子彈: monster_hit_list = pygame.sprite.spritecollide(子彈,monster_list,FALSE) 在monster_hit_list怪物: 怪物.Current_HP - = My_Man.Current_Weapon.Damage 如果monster.Current_HP <= 0: monster_list.remove(怪物) character_list.remove(怪物) bullet_list.remove(子彈) character_list.remove(子彈) 這似乎工作很好。 –

+0

非常感謝!我發現了問題線,現在它的工作方式更好。感謝你@謝謝並感謝其他人! –

相關問題