#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
oftuple
, но вы пытаетесь вызвать / вызвать кортеж, который является недопустимым действием. На самом деле вы не создаете экземпляр класса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