Непонятная ошибка формирования группы спрайтов

ruivit

Новичок
Пользователь
Дек 13, 2021
3
0
1
В общем ерунда какая та получается. Использую один и тот же метод формирования групп спрайтов, в итоге в двух случаях он срабатывает в третьем нет.
Python:
 all_sprites = pygame.sprite.Group()
##   
    mobs = pygame.sprite.Group()

    adidas = pygame.sprite.Group() #Не формируется группа   
##   
##   
##   
    bullets = pygame.sprite.Group()


    adidas = adidas()  #Получается ашибка TypeError: 'Group' object is not callable
    player = Player()
    all_sprites.add(player)


#------------------------------------------
#   Почемуто не формирует группу

#---------------------------------------
#--------------------------

    adidas.add(adidas)
    
# Почемуто не работает!!! (час назад всё работало)
    #creepy.add(creepy)
#---------------------------------------
По идеи должны сформироваться группы спрайтов что бы отслеживать сталкновения следующим когдом.

Python:
    # Проверка, не ударил ли перс жуть игрока
    # Не работает совершенно
        hits = pygame.sprite.spritecollide(player, adidas, False)
        if hits:
           running = False

Но вот не чего подобного не происходит, не формируется группа хотя если переменовать группу под другой класс формирование происходит. Думал по началу что проблемма в классе, но я не нашёл в нём проблем. Более того класс запускается и прога работает при условии если не формируется группа. Вот сам ниже класс:
```
Python:
    class adidas(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.Surface((700, 40))
            self.image.fill(YELLOW)
            self.rect = self.image.get_rect()
    
            self.rect.x = 0
            self.rect.y = 0
```
Бьюсь уже неделю и решить проблему не как не получается.
На всякий случай целиком ниже приведён код всей программы.
Python:
import pygame, sys,random
import threading
from pygame.color import THECOLORS
from pygame import font
#import menu
pygame.init()

def game_1():

    WIDTH = 700
    HEIGHT = 700
    FPS = 60

    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    YELLOW = (255, 255, 0)

    pygame.init()
    #pygame.mixer.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("Игра!")
    clock = pygame.time.Clock()


    class Player(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.Surface((50, 50))
            self.image.fill(GREEN)
            self.rect = self.image.get_rect()
            self.rect.centerx = WIDTH / 2
            self.rect.bottom = HEIGHT - 200
            self.speedx = 0

        def update(self):

            #Перемещение в пространсве перса
            self.speedx = 0
            keystate = pygame.key.get_pressed()
            if keystate[pygame.K_LEFT]:
                self.speedx = -8
            if keystate[pygame.K_RIGHT]:
                self.speedx = 8
            self.rect.x += self.speedx
        
            if keystate[pygame.K_DOWN]:
                self.speedy = +8
                self.rect.y += self.speedy                  # +
            if keystate[pygame.K_UP]:
                self.speedy = -8
                self.rect.y += self.speedy                  # +
#Границы которые не может перс преодолеть
        #Левая правая старона
            if self.rect.right > WIDTH:
                self.rect.right = WIDTH
            if self.rect.left < 0:
                self.rect.left = 0

            #Верх низ
            if self.rect.top > HEIGHT:
                self.rect.top = HEIGHT
            
            if self.rect.bottom > HEIGHT :
               self.rect.bottom = HEIGHT



        def shoot(self):
            bullet = Bullet(self.rect.centerx, self.rect.top)
            all_sprites.add(bullet)
            bullets.add(bullet)




    class Mob(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.Surface((30, 40))
            self.image.fill(RED)
            self.rect = self.image.get_rect()
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)
            self.speedx = random.randrange(-3, 3)

        def update(self):
            self.rect.x += self.speedx
            self.rect.y += self.speedy
            if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
#            self.rect.x = random.randrange(WIDTH - self.rect.width)
#            self.rect.y = random.randrange(-100, -40)
#            self.speedy = random.randrange(1, 8)
            
                self.rect.y = 100


    class Bullet(pygame.sprite.Sprite):
        def __init__(self, x, y):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.Surface((10, 20))
            self.image.fill(YELLOW)
            self.rect = self.image.get_rect()
            self.rect.bottom = y
            self.rect.centerx = x
            self.speedy = -10

        def update(self):
            self.rect.y += self.speedy
        # убить, если он заходит за верхнюю часть экрана
            if self.rect.bottom < 0:
                self.kill()

    #Портал к новой игре
    class Portl(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.Surface((70, 60))
            self.image.fill(BLUE)
            self.rect = self.image.get_rect()
            self.rect.x = 350
            self.rect.y = 60

    class adidas(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.Surface((700, 40))
            self.image.fill(YELLOW)
            self.rect = self.image.get_rect()
    
            self.rect.x = 0
            self.rect.y = 0


    all_sprites = pygame.sprite.Group()
##   
    mobs = pygame.sprite.Group()

    adidas = pygame.sprite.Group() #Не формируется группа   
##   
##   
##   
    bullets = pygame.sprite.Group()


    adidas = adidas()  #Получается ашибка TypeError: 'Group' object is not callable
    player = Player()
    all_sprites.add(player)

    


#------------------------------------------
#   Почемуто не формирует группу





#---------------------------------------
#--------------------------

    adidas.add(adidas)

    
    


# Почемуто не работает!!! (час назад всё работало)
    #creepy.add(creepy)
#---------------------------------------

    for i in range(8):
        m = Mob()
        all_sprites.add(m)
        mobs.add(m)
    
#for i in range(1): #Вызов стены жути  ( 1 штука)
#    creepy = creepy()
#    all_sprites.add(creepy)
     #creepy.add(creepy)

# Цикл игры
    running = True
    while running:
    # Держим цикл на скорости
        clock.tick(FPS)
    # Ввод процесса (события)
        for event in pygame.event.get():
        # проверка для закрытия окна
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.shoot()

    # Обновление
        all_sprites.update()

        hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
        for hit in hits:
            m = Mob()
            all_sprites.add(m)
            mobs.add(m)

        # Проверка, не ударил ли враг игрока
        hits = pygame.sprite.spritecollide(player, mobs, False)
        if hits:
           running = False
        
    # Проверка, не ударил ли перс жуть игрока
    # Не работает совершенно
        hits = pygame.sprite.spritecollide(player, adidas, False)
        if hits:
           running = False
        



    # Рендеринг
        screen.fill(BLACK)
        all_sprites.draw(screen)
    # После отрисовки всего, переворачиваем экран
        pygame.display.flip()
game_1()
pygame.quit()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Непонятная ошибка формирования группы спрайтов
Ошибка возникает потому что у вас в коде используются одинаковые имена переменных для класса, его экземпляра и группы спрайтов.
Если переименовать группу и экземпляр класса, то ошибки не будет.
Замените эти строки:
Python:
adidas = pygame.sprite.Group() #Не формируется группа 
adidas = adidas()  #Получается ашибка TypeError: 'Group' object is not callable
adidas.add(adidas)
на такие
Python:
adidas_group = pygame.sprite.Group() # создаем группу
adidas = adidas1()  # создаем экземпляр класса
adidas_group.add(adidas1)  # добавляем экземпляр класса в группу
all_sprites.add(adidas_group)  # добавляем группу к группе all_sprites
Также переименуйте группу в строке с проверкой:
замените эту строку
Python:
hits = pygame.sprite.spritecollide(player, adidas, False)
на такую
Python:
hits = pygame.sprite.spritecollide(player, adidas_group, False)
 

Форум IT Специалистов