2016-09-28 3 views
0

私はPygameを使ってゲームを書いています。今ではゲーム内のモンスターにスポーンタイマーを追加したいところです。今、タイマーが正常に動作し、最初のスポーン波が作られますと、すべてがそれが言う第二波まで素晴らしいと素晴らしいです:今、この私は得ることはありません、それはすでにそれを呼ばれるので、Python、Pygame、Classオブジェクトはもはや呼び出し可能ではありません

Monster1 = Monster() 

TypeError: 'Monster' object is not callable

それまでのラウンド。

私はクラス内の機能を変更しているのか、それ以上呼び出し可能にならないようにしているのかを確認するために、テキストを何度も見てきましたが、私はそれを取得しません。

このループが行うには、あなただけの私に言うとした場合、私はそれを を追加します知っておく必要があるだろう何かがあればこれはモンスタークラス

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 

あるモンスター

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 

を生成しますこれは本当に面倒です。私は初めてStackOverFlowのウェブサイトを使用しています。$

+1

コードのどこかに、「Monster = something」があります。これは、作成されたクラスをシャドウします。 –

+0

^編集ありがとうございました。私は以前このサイトを使ったことはありません。あなたはすばらしい人です –

+1

@ŁukaszRogalskiが示唆しているのは最も有望な原因です。 [PEP8](https://www.python.org/dev/peps/pep-0008/)のコーディングスタイルに従えば、変数名は通常小文字で指定されます。つまり、 'Monster1 = Monster() 'から' monster1 = Monster() 'に変更します。あなたはすぐにあなたの問題をゼロにすることができるはずです。 – nluigi

答えて

1

あなたのコードのどこかに、あなたは名前を「上書き」しますMonsterはあなたのクラスを指していません。

コードのどこにでもMonster = whateverを実行していないことを確認してください。

また、Current_HPMax_Hpなどは、クラスメンバーではなく、インスタンスメンバーなので、あなたがMonsterインスタンス上Current_HPをチャンスあれば、あなたはすべてMonsterのインスタンスのためにそれを変更することに注意してください。

+0

私はラインで何かをそのように私はCurrent_Hpか何かのようなものを使用している場合: monster_hit_list = pygame.sprite.spritecollide(弾丸、monster_list、False)がmonster_hit_listでのモンスターのため : モンスターbullet_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

ありがとうございました!私は問題のある行を見つけ出し、現在はより良い方法で動作します。あなたのおかげで、他の人に感謝します! –

関連する問題