Помогите с решением вопроса.
Я только начинаю обучаться языку 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
Помогите понять где ошибка и как её можно исправить, пожалуйста.
Насколько я понимаю в момент нажатия на пробел спрайт не видит где-то нужный ему кластер, либо я где-то не закрыл кластер.