2013-04-18 3 views
0

Я хочу использовать модуль pygame python, чтобы сделать 2D «рывок».Рыба плавает в pygame

В основном я загружу изображение в формате jpg в качестве фона и загружаю анимированное изображение gif, изображающее плавание рыбы и перемещающее его.

Я знаю, как сделать перемещение статического изображения, но как сделать изображение в формате gif, пока изображение само по себе анимируется.

У меня установлен PIL, обязательно, если вам нужно его использовать.

Если это не сработает, я также могу разбить файл gif на несколько статических кадров и циклически сделать каждое из них отображаемым на экране. Когда последний отправлен, первый нужно удалить, как его удалить?

ответ

0

Вот класс я на мое имя, чтобы получить PyGame анимации для работы:

class Animation(pygame.sprite.Sprite): 
    def __init__(self, img, fps = 6): 
     # Call the parent class (Sprite) constructor 
     pygame.sprite.Sprite.__init__(self) 

     # Slice source image to array of images 
     self.images = self.loadSliced(img) 

     # 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 
     self.image = self._images[self._frame] 

def loadSliced(w, h, filename): 
    """ 
    Pre-conditions: 
     Master can be any height 
     Sprites frames must be the same width 
     Master width must be len(frames)*frames.width 

    Arguments: 
     w -- Width of a frame in pixels 
     h -- Height of a frame in pixels 
     filename -- Master image for animation 
    """ 
    images = [] 

    if fileExists(img, "Animation Master Image"): 
     master_image = pygame.image.load(filename).convert_alpha() 
     master_width, master_height = master_image.get_size() 
     for i in range(int(master_width/w)): 
      images.append(master_image.subsurface((i*w, 0, w, h))) 
    return images 

def update(self, t): 
    # Note that this doesn't work if it's been more than 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 
      self.image = self._images[self._frame] 
      self._last_update = t 
     self.image = self._images[self._frame] 
     self._last_update = t 

def getFrame(self, screen): 
    # Update Frame and Display Sprite 
    self.update(pygame.time.get_ticks()) 
    return self.image 
+0

Выглядит хорошо - вы могли бы добавить кое-что объясняет, как то, что вы делаете помогает OP? – GHC

+0

Позвольте мне проверить это, спасибо за то, что поделились этим. –

+0

@GHC: Он создает ** spritesheet ** из одного изображения. Затем используется таймер для переключения 'image'. – ninMonkey

Смежные вопросы