Как я могу исправить мою спрайт-анимацию в Pygame? - PullRequest
1 голос
/ 24 марта 2019

Я пишу игру на python 3 (с pygame) для школьного проекта, но я борюсь с чем-то: я пытаюсь заставить мой спрайт иметь анимацию при движении, но он показывает только статическийизображение: когда я нажимаю левую клавишу, изображение спрайта меняется на статическое изображение вместо анимации, сделанной из 3 png.Вот эта часть кода:

clock = pygame.time.Clock()

walkRight = [pygame.image.load('ressources/images/R1.png'), pygame.image.load('ressources/images/R2.png'), pygame.image.load('ressources/images/R3.png')]
walkLeft = [pygame.image.load('ressources/images/L1.png'), pygame.image.load('ressources/images/L2.png'), pygame.image.load('ressources/images/L3.png')]
walkUp = [pygame.image.load('ressources/images/U1.png'), pygame.image.load('ressources/images/U2.png'), pygame.image.load('ressources/images/U3.png')]
walkDown = [pygame.image.load('ressources/images/D1.png'), pygame.image.load('ressources/images/D2.png'), pygame.image.load('ressources/images/D3.png')]


#this is the player sprite

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = (walkDown[4//3])
        self.rect = self.image.get_rect()
        self.rect.centerx = width / 2
        self.rect.bottom = height / 2
        self.speedx = 0
        self.speedy = 0
        self.velocity = 2


    def update(self):
        self.speedx = 0
        self.speedy = 0
        left = False
        right = False
        up = False
        down = False
        run = False  
        walkCount = 4
        runCount = 4   
        clock.tick(FPS)
        keys = pygame.key.get_pressed()

#I believe this is the part that has something wrong!
        if walkCount + 1 >= 9:
            walkCount = 0
        if (down == True and run == False):
            walkCount += 1
            self.image = (walkDown[walkCount//3])     
        elif (up == True and run == False):
            walkCount += 1
            self.image = (walkUp[walkCount//3])
        elif (right == True and run == False):
            walkCount += 1
            self.image = (walkRight[walkCount//3])
        elif (left == True and run == False):
            walkCount += 1
            self.image = (walkLeft[walkCount//3])

1 Ответ

0 голосов
/ 24 марта 2019

walkCount является локальной переменной в методе update.Он инициализируется 4 каждый раз, когда вызывается update.Таким образом, значение walkCount в начале функции всегда одинаково.Это приводит к тому, что изображение кажется статичным.
walkCount должен быть атрибутом класса Player, а не локальной переменной:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = (walkDown[4//3])
        self.rect = self.image.get_rect()
        self.rect.centerx = width / 2
        self.rect.bottom = height / 2
        self.speedx = 0
        self.speedy = 0
        self.velocity = 2

        self.walkCount = 4 # <---- add attribute

    def update(self):

        # [...]

        # walkCount = 4  <------ delete local variable

        keys = pygame.key.get_pressed()
        down = keys[pygame.K_DOWN]
        up = keys[pygame.K_UP]
        right = keys[pygame.K_RIGHT]
        left = keys[pygame.K_LEFT]
        run = False

        if self.walkCount + 1 >= 9:
            self.walkCount = 0
        if (down == True and run == False):
            self.walkCount += 1
            self.image = (walkDown[self.walkCount//3])     
        elif (up == True and run == False):
            self.walkCount += 1
            self.image = (walkUp[self.walkCount//3])
        elif (right == True and run == False):
            self.walkCount += 1
            self.image = (walkRight[self.walkCount//3])
        elif (left == True and run == False):
            self.walkCount += 1
            self.image = (walkLeft[self.walkCount//3])  
...