ошибка: AttributeError: 'NoneType' object has no attribute 'all_sprites'

adislan

Новичок
Пользователь
Окт 21, 2020
20
0
1
OC: Windows 10
Python: 3.9.7

--------------------------------

pygame
os
sys

-------------------------------

хочу сделать свою первую игру на pygame
игра "найди две похожие карты"

набросал код
Python:
import os
import sys

import pygame


# создание игрового поля
class Board:
    def __init__(self):
        self.width = 4
        self.height = 3
        self.board = [[0] * self.width for _ in range(self.height)]
        self.side = 10
        self.top = 10
        self.cell_size = 30

    def set_view(self, side, top, cell_size):
        self.side = side
        self.top = top
        self.cell_size = cell_size

    def render(self, screen):
        y = self.top
        for i in self.board:
            x = self.side
            for j in i:
                width = 1 if j == 0 else 0
                pygame.draw.rect(screen, "white", ((x, y), (self.cell_size, self.cell_size)), width)
                x += self.cell_size
            y += self.cell_size

    def get_click(self, mouse_pos):
        cell = self.get_cell(mouse_pos)
        if cell:
            self.on_click(cell)
        return
        print(None)

    def get_cell(self, mouse_pos):
        x = (mouse_pos[0] - self.side) // self.cell_size
        y = (mouse_pos[1] - self.top) // self.cell_size
        if x > self.width - 1 or y > self.height - 1 or x < 0 or y < 0:
            return None
        print((x, y))
        return x, y

    def on_click(self, cell):
        pass


# загрузка спрайтов
def load_image(name, colorkey=None):
    fullname = os.path.join('data', name)
    # если файл не существует, то выходим
    if not os.path.isfile(fullname):
        print(f"Файл с изображением '{fullname}' не найден")
        sys.exit()
    image = pygame.image.load(fullname)
    return image


# создадим группу, содержащую все спрайты
def render_sprite(name):
    all_sprites = pygame.sprite.Group()

    # создадим спрайт
    sprite = pygame.sprite.Sprite()
    # определим его вид
    sprite.image = load_image(f"{name}.png")
    # и размеры
    sprite.rect = sprite.image.get_rect()
    # добавим спрайт в группу
    all_sprites.add(sprite)
    sprite.rect.x = 100
    sprite.rect.y = 100


pygame.init()
SIZE_WINDOW = W, H = 640, 480
FPS = 15

screen = pygame.display.set_mode(SIZE_WINDOW)
screen.fill("black")
clock = pygame.time.Clock()


board = Board()
board.set_view(60, 70, 130)

burger = render_sprite(name="бургер")

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            board.get_click(event.pos)
        screen.fill("black")
    burger.all_sprites.draw(screen)
    board.render(screen)

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()

ошибка на строчке #100

спрайты в лажаться в папку data

сами спрайты в закрепе
 

Вложения

  • бургер.png
    бургер.png
    355 байт · Просмотры: 0
  • кекс.png
    кекс.png
    515 байт · Просмотры: 0
  • огурец.png
    огурец.png
    313 байт · Просмотры: 0
  • пицца.png
    пицца.png
    411 байт · Просмотры: 0
  • помидор.png
    помидор.png
    410 байт · Просмотры: 0
  • торт.png
    торт.png
    518 байт · Просмотры: 0

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
ошибка на строчке #100
минус сайтострителю форума-так как нет счётчика, что за строка?
 

adislan

Новичок
Пользователь
Окт 21, 2020
20
0
1
минус сайтострителю форума-так как нет счётчика, что за строка?
burger.all_sprites().draw(screen)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
минус сайтострителю форума-так как нет счётчика, что за строка?
...
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
ошибка: AttributeError: 'NoneType' object has no attribute 'all_sprites'
Ошибка возникает потому что в переменную burger у вас в коде записывается результат выполнения функции render_sprite, которая ничего не возвращает (возвращает None). А у None соответственно нет атрибута all_sprites.
Чтобы исправить можно создавать группу all_sprites вне функций, а внутри функции только создавать спрайт и добавлять его в группу:
Python:
# создадим группу, содержащую все спрайты
all_sprites = pygame.sprite.Group()


def render_sprite(name):
    # создадим спрайт
    sprite = pygame.sprite.Sprite()
    # определим его вид
    sprite.image = load_image(f"{name}.png")
    # и размеры
    sprite.rect = sprite.image.get_rect()
    # добавим спрайт в группу
    all_sprites.add(sprite)
    sprite.rect.x = 100
    sprite.rect.y = 100


...
# burger = render_sprite(name="бургер")
# создаем спрайт и добавляем его в группу all_sprites
render_sprite('бургер')

...

# burger.all_sprites.draw(screen)
# выводим на экран все спрайты
all_sprites.draw(screen)
Также можно создать класс для работы со спрайтами. Это даст возможность отрисовывать их по отдельности и более гибко настраивать их параметры:
Python:
# класс вместо функции render_sprite
# класс для создания спрайтов (для создания нужно указать координаты и имя)
class Item(pygame.sprite.Sprite):
    def __init__(self, x, y, name):
        pygame.sprite.Sprite.__init__(self)
        # загрузка изображения для спрайта с помощью функции load_image
        self.image = load_image(f"{name}.png")
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        # добавление спрайта в группу
        all_sprites.add(self)

    def render(self):
        """Метод для отрисовки спрайта"""
        screen.blit(self.image, self.rect)
        
...

# создание экземпляра
burger = Item(100, 100, 'бургер')

...

# отрисовка
burger.render()
# или в составе группы
all_sprites.draw(screen)
 

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