Почему мой спрайт не появляется постоянно вместо анимации на изображениях, когда стоит на месте - PullRequest
2 голосов
/ 07 февраля 2020

Итак, когда я создаю игру, мой спрайт - летучая мышь. Пока пользователь нажимает левую или правую клавишу, анимация работает отлично; однако я попытался добавить, где пользователь стоит на месте, анимация «полета» по-прежнему воспроизводится в направлении, в котором был последний игрок, поэтому не похоже, что летучая мышь просто плавает.

В результате я получаю, что спрайт не появляется на экране, если я не удерживаю одну из клавиш перемещения, когда я просто хочу, чтобы он постоянно анимировался, даже когда пользователь не двигается.

Я могу получить спрайт в определенном направлении, отображая одно изображение в неподвижном состоянии, но не должным образом анимировать.

Я слышал о библиотеке pyganim, но не могу использовать ее из-за окружающая среда, в которой я нахожусь, поэтому я борюсь с опциями.

Вот соответствующий код для функции рисования:

     def draw(self,window): 
#we must keep track of direction, are they moving and how many steps for frames
        if self.walkcount +1 >= 15: #15 as we have 5 sprites, which will be displayed 3 times per second
            self.walkcount = 0

        if not(self.standing): #if hes not standing still or moving, we'll walk through our animation 
            if self.left:
                window.blit(walkleft[self.walkcount//3],(self.x,self.y))#excludes remainders
                self.walkcount+=1
            elif self.right:
                window.blit(walkright[self.walkcount//3],(self.x,self.y)) 
                self.walkcount+=1
            elif self.isjump:
                window.blit(jumpp,(self.x,self.y))
                self.walkcount+=1
        else: #if he is, we'll blit him looking right or left
            if self.right:
                if self.walkcount +1 >= 15:#
                    self.walkcount = 0#
                    while True:#
                        #anim1.blit(window,(self.x,self.y)) #previous attempt
                        #window.blit(walkright[0],(self.x,self.y)) #displays first image of that direction when stood still
                        window.blit(walkright[self.walkcount//3],(self.x,self.y))
                        self.walkcount+=1
            else:
                if self.walkcount +1 >= 15: 
                    self.walkcount = 0#
                    while True:#
                        #anim2.blit(window,(self.x,self.y))
                        #window.blit(walkleft[0],(self.x,self.y))
                        window.blit(walkright[self.walkcount//3],(self.x,self.y)) 
                        self.walkcount+=1

Это то место, где сделаны базовые c анимации для где true или left - true, анимация будет воспроизводиться, пока это правда.

Фактический бит, который я редактировал, пытаясь заставить его работать:

else: #if he is, we'll blit him looking right or left
            if self.right:
                if self.walkcount +1 >= 15:#
                    self.walkcount = 0#
                    while True:#
                        #anim1.blit(window,(self.x,self.y)) #previous attempt
                        #window.blit(walkright[0],(self.x,self.y)) #displays first image of that direction
                        window.blit(walkright[self.walkcount//3],(self.x,self.y))
                        self.walkcount+=1
            else:
                if self.walkcount +1 >= 15: 
                    self.walkcount = 0#
                    while True:#
                        #anim2.blit(window,(self.x,self.y))
                        #window.blit(walkleft[0],(self.x,self.y))
                        window.blit(walkright[self.walkcount//3],(self.x,self.y)) 
                        self.walkcount+=1

Функции движения:

if keys[pygame.K_LEFT] and man.x > man.vel-man.vel: #if pressed we move our character by the velocity in whatever direction via grid which works from the TOP LEFT of screen
                                                    #vel-vel to equal 0, makes border better
        man.x -= man.vel
        man.left = True #were global variables
        man.right = False
        man.standing = False
    elif keys[pygame.K_RIGHT] and man.x < 500 - man.width: 
        man.x += man.vel                #screenwidth
        man.right = True
        man.left = False
        man.standing = False
    else:
        man.standing = True #now we'll know if he's looking left or right
        man.walkcount = 0

Любые другие предложения / отзывы оценили.

1 Ответ

2 голосов
/ 07 февраля 2020

Поскольку, стоя на месте, вы устанавливаете:

    man.standing = True #now we'll know if he's looking left or right
    man.walkcount = 0

, поэтому walkcount равно 0, а standing равно True.

В функции draw, not(self.standing) равно False, поэтому мы переходим к блоку else.

Есть еще if/else, и в каждой ветви вы проверяете

if self.walkcount +1 >= 15:

, который никогда не будет True, поскольку walkcount равно 0, поэтому строки window.blit в любой ветви никогда не будут достигнуты; следовательно, изображение не скрыто за окном.


Без его тестирования, я думаю, весь метод можно было бы упростить до

 def draw(self,window): 

    #we must keep track of direction, are they moving and how many steps for frames
    if self.walkcount +1 >= 15: #15 as we have 5 sprites, which will be displayed 3 times per second
        self.walkcount = 0

    if self.isjump:
        window.blit(jumpp,(self.x,self.y))
    else:
        if self.left:
            window.blit(walkleft[self.walkcount//3],(self.x,self.y))#excludes remainders
        else:
            window.blit(walkright[self.walkcount//3],(self.x,self.y)) 

    self.walkcount+=1

и строки

    man.walkcount = 0

следует удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...