Pygame несовместимое обновление - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь написать простую программу для пигмеев, в которой на экране движутся некоторые прямоугольники. Я следую этому примеру .

Урок имеет следующую структуру:

class Box(pygame.sprite.Sprite):
...
    def update(self, currtime):
        if self.next_update_time < current_time:
           print time.time() # I added this to debug
           # Do some stuff
           self.next_update_time = current_time + 10

box = Box()
while True:
    pygame.time.delay(10)
    time = pygame.time.get_ticks()
    box.update(time)

Мои коробки двигаются, но не очень плавно. Они ускоряются и замедляются. Когда я строю точки, в которых происходит обновление, я получаю это .

Похоже ли это на проблему с дизайном, предложенным в уроке, которому я следую? Это проблема с моим оборудованием?

EDIT: Исходя из ответа Радомира Доперальского, лучший подход:

class Box(pygame.sprite.Sprite):
...
    def update(self):
           # Do some stuff

box = Box()
clock = pygame.time.Clock()
while True:
    clock.tick(100)
    box.update()

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Дело в том, что pygame.time.delay(10) всегда будет ждать одно и то же время, независимо от того, сколько времени заняло рисование коробок и других вещей, которые вы делаете в игровом цикле. Таким образом, общее время ожидания составляет 10+render_time.

К счастью, PyGame предлагает решение этой проблемы: класс pygame.time.Clock и его метод .tick(framerate), который запоминает время, когда он использовался в последний раз, и ожидает меньшее или большее количество времени в зависимости от него, чтобы сохранить постоянная частота кадров.

1 голос
/ 31 марта 2013

Я думаю, вам нужно использовать объект часов, предоставляемый pygame.time:

c = pygame.time.Clock()

while True:

    dt = c.tick(framerate) # 0 for framerate removes the cap

    ...

    ex_box.update(dt)

и метод обновления выглядит следующим образом:

def update(self, miliseconds_passed):

    self.pos[0] += self.spped[0] * dt # Speed must be in pixels_per_millisecond
    self.pos[1] += self.spped[1] * dt

Примечание:

Если вы хотите, чтобы скорость была в пикселях в секунду, вы должны сделать «* dt / 1000». недомогание "* dt".

И если вы хотите сделать скорость в м / с, если нужно установить постоянную «пикселей на метр» и умножить скорость на dt / 1000. * ppm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...