2012-11-03 37 views
1

我试图在按键盘上的按钮时为动画表单添加动画。我最初的想法是仅仅按下按键上的图像。我将动画代码从主循环移至用户输入循环。这是行不通的,因为游戏循环处理整个游戏的个人状态。用什么技术来触发用户输入的动画?我想要一个动画系统,可以通过用户输入处理动画,也可以在后台处理动画。按键上的精灵动画

if __name__ == "__main__": 
    print "the game" 
    pygame.init() 
    screen = pygame.display.set_mode((800,600)) 

    images = load_sliced_sprites(100, 71, "spinning_roundhouse_kick.png") 
    spritesheet = AnimatedSprite(images, 20) 
    #while pygame.event.poll().type != KEYDOWN: 
    while True: 
     screen.fill((255,255,255)) 
     event = pygame.event.poll() 

     if event.type == KEYDOWN: 
      #print "keydown" 
      for image in images: 
       screen.blit(image, (0,0)) 

     #time = pygame.time.get_ticks() 
     #spritesheet.update(time) 
     #screen.blit(spritesheet.image, (0,0)) 

     pygame.display.update() 
+0

看起来像是在相同的位置再次对相同的图像进行动画处理。你是否应该对一个'AnimatedSprite'对象更新的结果进行blitting? – Aesthete

回答

0

我解决了这个问题,通过跟踪动画帧和使用另一个while循环。

import os 
import pygame 
from pygame.locals import * 

def load_sliced_sprites(w, h, filename): 
    ''' 
    Specs : 
     Master can be any height. 
     Sprites frames width must be the same width 
     Master width must be len(frames)*frame.width 
    Assuming you ressources directory is named "resources" 
    ''' 
    images = [] 
    master_image = pygame.image.load(os.path.join('resources', filename)).convert_alpha() 

    master_width, master_height = master_image.get_size() 
    for i in xrange(int(master_width/w)): 
     images.append(master_image.subsurface((i*w,0,w,h))) 
    return images 



class AnimatedSprite(pygame.sprite.Sprite): 
    def __init__(self, images, fps = 10): 
     pygame.sprite.Sprite.__init__(self) 
     self._images = images 

     # Track the time we started, and the time between updates. 
     # Then we can figure out when we have to switch the image. 
     self._start = pygame.time.get_ticks() 
     self._delay = 1000/fps 
     self._last_update = 0 
     self._frame = 0 

     # Call update to set our first image. 
     self.update(pygame.time.get_ticks()) 

    def update(self, t): 
     # Note that this doesn't work if it's been more that self._delay 
     # time between calls to update(); we only update the image once 
     # then, but it really should be updated twice. 

     if t - self._last_update > self._delay: 
      self._frame += 1 
      #if self._frame >= len(self._images): self._frame = 0 
      if self._frame < len(self._images): 
       self.image = self._images[self._frame] 
       self._last_update = t 

    def getimage(self): 
     return self.image 

    def isfinished(self): 
     if self._frame == len(self._images): 
      return True 
     else: 
      return False 

    def reset(self): 
     if self._frame >= len(self._images): self._frame = 0 

if __name__ == "__main__": 
    print "the game" 
    pygame.init() 
    screen = pygame.display.set_mode((800,600)) 

    images = load_sliced_sprites(100, 71, "spinning_roundhouse_kick.png") 
    sprite = AnimatedSprite(images, 20) 
    #while pygame.event.poll().type != KEYDOWN: 
    while True: 
     screen.fill((255,255,255)) 
     event = pygame.event.poll() 
     if event.type == KEYDOWN and event.key == K_a: 
      #print "keydown" 
      #for image in images: 
      while True: 
       #print "frame" 
       #print sprite._frame 
       #print sprite.isfinished() 
       time = pygame.time.get_ticks() 
       sprite.update(time) 
       screen.blit(sprite.getimage(), (0,0)) 
       pygame.display.update() 
       #sprite.reset() 
       if sprite.isfinished() == True: 
        sprite.reset() 
        break 

     #time = pygame.time.get_ticks() 
     #sprite.update(time) 
     #screen.blit(sprite.image, (0,0)) 

     pygame.display.update() 
2

看起来你应该做这样的事情..

sprite = AnimatedSprite(images, 20) 
if event.type == KEYDOWN: 
     sprite.update(pygame.time.get_ticks()) 
     screen.blit(sprite.getimage()) 

应该发生什么,是你的精灵类应该得到随着时间的增量更新,并且改变到一个新的前计时帧。每当钥匙关闭时绘制动画。

+0

我做了更改,看起来只是画了最后一帧。 –

+0

每个按钮按下一帧动画。 –