2012-11-03 6 views
1

키보드의 단추를 누르면 스프라이트 시트에 애니메이션을 적용하려고합니다. 나의 초기 생각은 keypress에서 이미지를 blit하는 것이었다. 애니메이션 코드를 메인 루프에서 사용자 입력 루프로 옮겼습니다. 게임 루프가 전체 게임의 개별 상태를 처리하기 때문에 작동하지 않습니다. 사용자 입력에서 애니메이션을 트리거하는 데 사용되는 기술은 무엇입니까? 사용자 입력과 백그라운드에서 애니메이션을 모두 처리 할 수있는 애니메이션 시스템이 필요합니다. 이 같은 일을해야처럼키 누르기의 스프라이트 애니메이션

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' 객체 업데이트의 결과를 블리팅하기로되어 있습니까? – Aesthete

답변

0

저는 실제 프레임을 추적하면서 애니메이션 프레임을 추적하고 다른 프레임을 사용하여 문제를 해결했습니다.

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

각 버튼 누름은 한 프레임의 애니메이션을 그립니다. –

관련 문제