Задать вопрос
BlvlS
@BlvlS

TypeError: pygame.sprite.Sprite.add() argument after * must be an iterable, not pygame.Surface как исправить?

Помогите с решением вопроса.
Я только начинаю обучаться языку Python и по урокам сделал аналог "alien invasion", только в уроке всё работает и при нажатии на пробел спрайт выстрела отображается и летит, у меня выдаёт подобную ошибку при нажатии на выстрел (движение в стороны работает):
Traceback (most recent call last):
  File "F:\В деревню\Новая папка\Game\space.py", line 19, in <module>
    run()
  File "F:\В деревню\Новая папка\Game\space.py", line 14, in run
    controls.events(screen, gun, bullets)
  File "F:\В деревню\Новая папка\Game\controls.py", line 18, in events
    new_bullet = Bullet(screen, gun)
  File "F:\В деревню\Новая папка\Game\venv\lib\site-packages\pygame\sprite.py", line 116, in __init__
    self.add(*groups)
  File "F:\В деревню\Новая папка\Game\venv\lib\site-packages\pygame\sprite.py", line 134, in add
    self.add(*group)
TypeError: pygame.sprite.Sprite.add() argument after * must be an iterable, not pygame.Surface

Process finished with exit code 1


Сам код состоит из 4 модулей подключенных друг к другу, как вы сможете заметить.
space.py
import pygame, controls
from gun import Gun
from pygame.sprite import Group

def run():
    pygame.init()
    screen = pygame.display.set_mode((700, 800))
    pygame.display.set_caption("Иноземцы")
    bg_color = (50, 65, 98)
    gun = Gun(screen)
    bullets = Group()
    
    while True:
        controls.events(screen, gun, bullets)
        gun.update_gun()
        controls.update(bg_color, screen, gun, bullets)
        controls.update_bullets(bullets)

run()


controls.py
import pygame, sys
from bullet import Bullet

def events(screen, gun, bullets):
    """Обработка событий"""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            #вправо
            if event.key == pygame.K_d:
                gun.mright = True
            #влево
            elif event.key == pygame.K_a:
                gun.mleft = True
            #выстрел
            elif event.key == pygame.K_SPACE:
                new_bullet = Bullet(screen, gun)
                bullets.add(new_bullet)
        elif event.type == pygame.KEYUP:
            #вправо
            if event.key == pygame.K_d:
                gun.mright = False
            #влево
            elif event.key == pygame.K_a:
                gun.mleft = False

def update(bg_color, screen, gun, bullets):
    """обновление экрана"""
    screen.fill(bg_color)
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    gun.output()
    pygame.display.flip()

def update_bullets(bullets):
    """Обновление позиции пуль"""
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)


bullet.py
import pygame

class Bullet(pygame.sprite.Sprite):

    def __int__(self, screen, gun):
        """Выстрел пули из пушки"""
        super().__init__(self)
        self.screen = screen
        self.rect = pygame.Rect(0, 0, 2, 12)
        self.color = 255, 255, 255
        self.speed = 1.5
        self.rect.centerx = gun.rect.centerx
        self.rect.top = gun.rect.top
        self.y = float(self.rect.y)

    def update_bullet(self):
        """движение пули вверх"""
        self.y -= self.speed
        self.rect.y = self.y

    def draw_bullet(self):
        """Отрисовка пули"""
        pygame.draw.rect(self.screen, self.color, self.rect)


gun.py
import pygame

class Gun():

    def __init__(self, screen):
        """инициализация пушки"""

        self.screen = screen
        self.image = pygame.image.load("Images/pixilart-drawing.png")
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.center = float(self.rect.centerx)
        self.rect.bottom = self.screen_rect.bottom
        self.mright = False
        self.mleft = False

    def output(self):
        """"Вырисовывание пушки"""

        self.screen.blit(self.image, self.rect)

    def update_gun(self):
            """Обновление позиции танка"""
            #вправо
            if self.mright and self.rect.right < self.screen_rect.right:
                self.center += 1.9
            #влево
            elif self.mleft and self.rect.left > 0:
                self.center -= 1.9

            self.rect.centerx = self.center


Помогите понять где ошибка и как её можно исправить, пожалуйста.
Насколько я понимаю в момент нажатия на пробел спрайт не видит где-то нужный ему кластер, либо я где-то не закрыл кластер.
  • Вопрос задан
  • 1107 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@YariKartoshe4ka
Либо
super().__init__() # Без self
Либо
pygame.sprite.Sprite.__init__(self)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы