2013-07-14 2 views
0

У меня небольшие проблемы, и мне было интересно, можете ли вы помочь мне исправить это.Способы Sprite в группах Sprite Pygame

Итак, я создал спрайт и создал простой метод анимации, который я вызываю в методе __init__.

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.attributes = "blah" 

     self.idleAnimation() 

    def idleAnimation(self): 
     self.animationCode = "Works normally I've checked it" 

player  = Player() 
playerGroup = pygame.sprite.Group() 
playerGroup.add(player) 
window = pygame.display.set_mode(yaddi-yadda) 

while StillLooping: 
    window.fill((0, 0, 0)) 
    playerGroup.update() 
    playerGroup.draw(window) 
    pygame.display.flip() 

Но по какой-то причине метод idleAnimation является не работать в группе, несмотря на то вызывается в методе __init__. Если я позвоню позже в петле:

while StillLooping: 
    player.idleAimation() 
    window.fill((0, 0, 0)) 
    playerGroup.update() 
    playerGroup.draw(window) 
    pygame.display.flip() 

Это работает, но не иначе. Я не могу понять, почему. Любые идеи были бы очень благодарны!

ответ

1

Метод idleAnimation() не магически называется методом playerGroup.update(). Я не понимаю, почему вы думаете, что должно быть ...

Документация Group.update говорит, что это вызывает update() метод каждого спрайта, поэтому вы должны переименовать этот метод к update() если вы хотите, чтобы она вызывалась каждый петля.

+0

Я не думал, что это должно быть волшебным, потому что метод idleAnimation был вызван в методе создания экземпляров, который обычно запускал его автоматически. Но спасибо. – LauraKellman

1

Метод __init__ называется только один раз, когда вы создаете свой объект. Таким образом, ваш метод idleAnimation() вызывается при создании объекта, и все.

метод вашей группы update() будет вызывать только update метод вашего спрайта, поэтому вам необходимо либо переименовать idleAnimation(), как было предложено, или добавить update() метод, который вызывает его, которое должно оказаться более гибким:

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.attributes = "blah" 

     self.idleAnimation() # You can probably get rid of this line 

    def idleAnimation(self): 
     self.animationCode = "Works normally I've checked it" 

    def update(self): 
     '''Will be called on each iteration of the main loop''' 
     self.idleAnimation() 

Скорее всего, вам не нужно звонить idleAnimation() в ваш инициализатор, так как он будет запускаться впоследствии в вашем цикле.