bg = "lv1.jpg"
    ch = "char.png"

    import pygame, sys
    from pygame.locals import *

    pygame.init()
    screen = pygame.display.set_mode((640, 400), 0, 32)
    background = pygame.image.load(bg).convert()
    char = pygame.image.load(ch).convert_alpha()


    clock = pygame.time.Clock()
    charspeed = 0

    charx = 100
    chary = 200

    running = True

    class Player(pygame.sprite.Sprite):


        def __init__(self):

            pygame.sprite.Sprite.__init__(self)


            self.rect = self.image.get_rect()
        def blit(self):
            screen.blit(char, (100,400))

    while running:

        milli = clock.tick()
        seconds = milli/1000.
        chardm = seconds*charspeed 
        charx += chardm



        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
                pygame.quit()
                sys.exit()



        screen.blit(background, (0,0))

        player1 = Player()
        player1.blit()

        pygame.display.update()

По какой-то причине класс Sprite «Player» не хочет работать. Я никогда не понимал, как работают спрайты. Для меня они очень сложны. Я очень новичок в PyGame, поэтому может кто-нибудь дать мне краткое объяснение того, как работают спрайты и как создавать и использовать классы спрайтов.

2
Jesus Velarde 13 Авг 2014 в 07:10
Что вы имеете в виду под классом Sprite "Player", который не хочет работать ?
 – 
ZenOfPython
13 Авг 2014 в 07:18
Он не хочет отображать изображение char.png
 – 
Jesus Velarde
13 Авг 2014 в 07:19
Без обид, но похоже, что вы пытаетесь слишком далеко забежать, основываясь на своих текущих знаниях. Классы в Python трудно осмыслить, когда вы только начинаете. Я бы посоветовал немного отступить и, возможно, просмотреть несколько руководств, например этот
 – 
Marius
13 Авг 2014 в 08:46

1 ответ

Лучший ответ

Линия

self.rect = self.image.get_rect()

Произойдет сбой, потому что класс Player не имеет атрибута с именем image.

Если вы хотите использовать класс pygame Sprite, вы должны следовать его документацию и добавьте атрибуты image и rect:

Базовый класс для видимых игровых объектов. Производные классы захотят переопределить Sprite.update () и назначить атрибуты Sprite.image и Sprite.rect. Инициализатор может принимать любое количество добавляемых экземпляров группы.

Преимущество использования класса Sprite pygame заключается в том, что вы можете легко управлять своим спрайтом, используя класс Group и его подклассы.

Итак, создайте Group:

sprites = pygame.sprite.Group()     

Добавьте своего игрока в эту группу и создайте атрибут image:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self, sprites)
        self.image = char
        self.rect = self.image.get_rect(left=100, top=100)

Кроме того, создайте только один экземпляр класса Player вместо одной на каждой итерации вашего основного цикла и просто вызовите sprites.draw, чтобы нарисовать все спрайты сразу:

...
player1 = Player()

while running:
    ...
    sprites.draw(screen)
    pygame.display.update()
0
sloth 13 Авг 2014 в 13:45
Не следует ли вам добавить спрайт в свою группу спрайтов перед его рисованием?
 – 
Anuran Barman
25 Мар 2018 в 09:06
1
Вы можете передать Groups функции Sprite __init__, и она добавится ко всем этим. Посмотрите на эту строку: pygame.sprite.Sprite.__init__(self, sprites)
 – 
sloth
26 Мар 2018 в 10:31