Время анимации Python - PullRequest
       15

Время анимации Python

4 голосов
/ 18 апреля 2010

В настоящее время я работаю над инструментом для спрайтов в Python, который экспортирует организацию в документ XML, но я столкнулся с некоторыми проблемами при попытке анимировать предварительный просмотр. Я не совсем уверен, как рассчитать частоту кадров с питоном. Например, предполагая, что у меня есть все мои соответствующие данные кадров и функции рисования, как бы я пошел о кодировании синхронизации, чтобы отображать ее со скоростью 30 кадров в секунду (или с любой другой произвольной скоростью).

Ответы [ 3 ]

8 голосов
/ 18 апреля 2010

Самый простой способ сделать это с Pygame :

import pygame
pygame.init()

clock = pygame.time.Clock()
# or whatever loop you're using for the animation
while True:
    # draw animation
    # pause so that the animation runs at 30 fps
    clock.tick(30)

Второй самый простой способ сделать это вручную:

import time

FPS = 30
last_time = time.time()
# whatever the loop is...
while True:
    # draw animation
    # pause so that the animation runs at 30 fps
    new_time = time.time()
    # see how many milliseconds we have to sleep for
    # then divide by 1000.0 since time.sleep() uses seconds
    sleep_time = ((1000.0 / FPS) - (new_time - last_time)) / 1000.0
    if sleep_time > 0:
        time.sleep(sleep_time)
    last_time = new_time
0 голосов
/ 18 апреля 2010

Вы могли бы использовать select? Обычно используется для ожидания завершения ввода-вывода, но посмотрите на подпись:

select.select(rlist, wlist, xlist[, timeout])

Итак, вы можете сделать что-то вроде:

timeout = 30.0
while true:
    if select.select([], [], [], timeout):
        #timout reached
        # maybe you should recalculate your timeout ?        
0 голосов
/ 18 апреля 2010

В модуле threading есть класс Timer. Это может быть удобнее, чем использовать time.sleep для некоторых целей.

>>> from threading import Timer
>>> def hello(who):
...    print 'hello %s' % who
... 
>>> t = Timer(5.0, hello, args=('world',))
>>> t.start()      # and five seconds later...
hello world
...