Проблема Pygame с использованием списка из списка для создания экземпляра

#python #list #class #pygame

#python #Список #класс #pygame

Вопрос:

Итак, я пытаюсь стрелять пулей. идея состоит в том, чтобы создать список с переменными, необходимыми для создания и маркированного экземпляра, и добавить этот список в список. затем я создаю экземпляр маркера из последнего элемента в списке, который содержит списки. к сожалению, я получил сообщение «TypeError: объект ‘tuple’ не вызывается» для строки, в которой я пытаюсь создать новый экземпляр маркера. надеюсь, вы сможете мне помочь, имена переменных должны быть самоочевидными.

 def shoot(self):
        if self.bullets_isshot == True:
            self.m_x, self.m_y = pygame.mouse.get_pos()
            self.bullets_new_bullet = (self.m_x, self.m_y, self.cords_x, self.cords_y)
            self.bullets_list.append(self.bullets_new_bullet)
            for bullet in self.bullets_list:
                if bullet == self.bullets_list[-1]:
                    new_bullet = bullet(bullet[0], bullet[1], bullet[2], bullet[3])
            self.bullets_isshot = False 
  

и в случае, если вам это нужно, метод инициализации пули:

 def __init__(self, target_x, target_y, player_x, player_y):
        #var img, cords
        self.img = fast_load_img('/data/img/bullets/fireball.png')
        self.width = 128
        self.height = self.width
        self.x = player_x
        self.y = player_y
        self.target_x = target_x
        self.target_y = target_y
        self.d_x = self.target_x - self.x
        self.d_y = self.target_y - self.y

        #var vel, angle
        self.vel = 5
        self.angle = math.atan2(self.d_x, self.d_y)
        self.x_change = self.vel * math.cos(self.angle)
        self.y_change = self.vel * math.sin(self.angle)
  

Комментарии:

1. Посмотрите на свои типы данных. У вас есть list of tuple , но вы пытаетесь вызвать / вызвать кортеж, который является недопустимым действием. На самом деле вы не создаете экземпляр класса

2. @MaximilianBurszley я только что понял это и изменил кортеж на список, но это не имело никакого значения, за исключением того, что в нем говорится, что объект «список» теперь не вызывается

Ответ №1:

Похоже, что вы создаете список из одного элемента, а затем перебираете его. В этом нет необходимости.

На самом деле вам вообще не нужен список или кортеж. Просто создайте новый маркер с помощью конструктора класса. Похоже, вы нигде не сохраняете новый маркер, поэтому я только что вернул его из функции. Вероятно, вам следует сохранить его в списке или подобном (при условии, что одновременно на экране отображается более одного маркера).

 def shoot( self ):
    """ If the player has fired a shot, create a new bullet.
        Returns the new bullet or None """
    new_bullet = None
    if self.bullets_isshot == True:
        self.m_x, self.m_y = pygame.mouse.get_pos()
        new_bullet = bullet( self.m_x, self.m_y, self.cords_x, self.cords_y )
        self.bullets_isshot = False 
    return new_bullet