TypeError: дескриптор «collidelist» для объектов «pygame.Rect» не применяется к объекту «список»

Пытаюсь настроить систему, чтобы зарабатывать очки, убивая врагов. но я продолжаю получать: TypeError: дескриптор «collidelist» для объектов «pygame.Rect» не применяется к объекту «список». Но это работало на одну строку раньше.

Это первая программа, которую я пытаюсь написать самостоятельно. Я все еще очень новичок в этом, поэтому любая помощь будет оценена по достоинству.

код:

import pygame
from random import randint
from sys import exit
pygame.init()

def star_movement(stars):
    if stars:
        for star_rect in stars:
            star_rect.x -= 5

            if star_rect.x >= 0: screen.blit(star_surf,star_rect)
        star_list = [star for star in stars if star.x > -100]
        return star_list
    else: return []

def fireb_movement(fire_ball):
    if fire_ball:
        for fire_rect in fire_ball:
            fire_rect.x += 20

            if fire_rect.x >= 0: screen.blit(Fire_ball,fire_rect)
        fireB_list = [fireB for fireB in fire_ball if fireB.x > -100]
        return fireB_list
    else: return []

def enemy_movement(enemy_rect_list):
    if enemy_rect_list:
        for enemy_rect in enemy_rect_list:
            enemy_rect.x -= 5

            if enemy_rect.x >= 0: screen.blit(enemy_surf,enemy_rect)
        enemy_list = [enemy for enemy in enemy_rect_list if enemy.x > -100]
        return enemy_list
    else: return []

game_active = False

score = 0

stars = []
enemy_rect_list = []
fire_ball = []

time = float(pygame.time.get_ticks()/1000)

screen = pygame.display.set_mode((800,400))
game_icon = pygame.image.load("Graphics/pixels.png").convert_alpha()
pygame.display.set_icon(game_icon)
pygame.display.set_caption("Quick Dash")
clock = pygame.time.Clock()

player_surf = pygame.transform.rotate(pygame.image.load("Graphics/ships/pix_ship.png").convert_alpha(), -90)
player_rect = player_surf.get_rect(center = (100, 200))

enemy_surf = pygame.transform.rotate(pygame.image.load("Graphics/ships/pix_ship2.png").convert_alpha(), 90)

Fire_ball = pygame.transform.rotate(pygame.image.load("Graphics/ships/fireball.png").convert_alpha(), -90)

background_surf = pygame.image.load("Graphics/space.png").convert_alpha()
background_rect = background_surf.get_rect(center = (400,200))

homepage_surf = pygame.image.load("Graphics/homespace.png").convert_alpha()
homepage_rect = homepage_surf.get_rect(topleft = (0,0))

star_surf = pygame.image.load("Graphics/star.png").convert_alpha()

star_a = pygame.USEREVENT + 2
pygame.time.set_timer(star_a, 200)

enemy_wave = pygame.USEREVENT + 3
pygame.time.set_timer(enemy_wave, 1500)

font = pygame.font.Font("fonts/PublicPixel-z84yD.ttf", 20)


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.QUIT
            exit()
        if game_active:
            if event.type == star_a:
                stars.append(star_surf.get_rect(center=(randint(800, 1600), randint(0, 400))))
            if event.type == enemy_wave:
                enemy_rect_list.append(enemy_surf.get_rect(center=(randint(800, 1600), randint(0, 400))))
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    player_rect.y += -50
                if event.key == pygame.K_DOWN:
                    player_rect.y += 50
            if player_rect.collidepoint((100, 400)):
                player_rect.y = 300
            if player_rect.collidepoint((100, -55)):
                player_rect.y = -15
            if pygame.Rect.collidelist(player_rect, enemy_rect_list) != -1:
                game_active = False
            if pygame.Rect.collidelist(fire_ball, enemy_rect_list) != -1:
                score += 1
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                fire_ball.append(Fire_ball.get_rect(center =(110,(player_rect.y + 60))))
        else:
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                game_active = True
    if game_active:
        screen.blit(background_surf, background_rect)
        stars = star_movement(stars)
        enemy_rect_list = enemy_movement(enemy_rect_list)
        fire_ball = fireb_movement(fire_ball)
        screen.blit(player_surf, player_rect)
        main_message2 = font.render(score, False, "#11339c")
        main_message_rect = main_message2.get_rect(center=(400, 100))
    else:
        main_message = font.render(f"Press SPACE to start!", False, "#11339c")
        main_message_rect = main_message.get_rect(center=(400, 100))
        screen.blit(homepage_surf, homepage_rect)
        screen.blit(main_message, main_message_rect)
    pygame.display.update()
    clock.tick(60)

error:
Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\pythonProject\venv\game1.py", line 97, in <module>
    if pygame.Rect.collidelist(fire_ball, enemy_rect_list) != -1:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: descriptor 'collidelist' for 'pygame.Rect' objects doesn't apply to a 'list' object
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

fire_ball — это список. Однако collidelist предназначен для обнаружения столкновений между одним прямоугольником и списком прямоугольников. Если вы хотите обнаружить столкновение между двумя списками прямоугольников, вы должны сделать это в цикле:

for ball in fire_ball:
    if ball.collidelist(enemy_rect_list) >= 0:
        score += 1

В качестве альтернативы вы можете использовать pygame.sprite.Sprite , pygame.sprite.Group и pygame.sprite.groupcollide (также см. Навсегда удалить спрайт из памяти Pygame).

Другие вопросы по теме

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

Как я могу сделать так, чтобы начало оси x и начало оси y графика перекрывались в matplotlib?
Разделите одну строку на несколько строк данных за 6 часов на основе 15-минутного интервала времени в фрейме данных pandas
Я не могу показать даты в том же встраивании с python от discord BOT
Есть ли привязка Python к XML-базе данных Berkeley DB?
Введите количество учеников — введите имя, возраст, рост каждого ученика. Распечатать список в отсортированном порядке Имя(Abc)>Возраст(маленький-большой)>Рост (маленький-большой)
Пакет Python Latex не вставляет графику
Как преобразовать файл PDF в файл CSV с помощью Python Pandas
Мне нужно использовать точно такие же имена атрибутов для свойств в пользовательском классе предварительной обработки, которые наследуют scikit Learn BaseEstimator?
Как создать метод обновления для MongoDB
Разделение изображения пополам, оставляя одну половину прозрачной, сохраняя те же размеры изображения