Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2009 19:19:08

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame - движение

Пытаюсь сделать плавное движение объекта по клеткам со стороной 50 пикселей.

Все время идет глобальный бесконечный цикл отрисовки:

    while 1:
clock.tick(30) # глобальный таймер
input(pygame.event.get()) # ловим события
item.update() # двигаем объект
screen.blit(bk, (0, 0)) # обновляем бэкграунд
allsprites.draw(screen) # рисуем все объекты на новых местах
pygame.display.flip() # обновляем экран
вот с item.update() и есть главная проблема, так как для плавного движения, по идее, нужен собственный таймер, не зависящий от глобального. Но движение должно быть только на 50 пикселей в одну сторону, так как в следующий раз оно может быть в другую. Пытался сделать так:
def moveup(self):
for x in xrange(50):
newpos = self.rect.move((0, -1)) # сдвигаем рамку спрайта на пиксель вверх
self.rect = newpos # перерисовываем спрайт на новом месте
pygame.time.delay(50) # задержка на 50 миллисекунд
но не выходит, объект просто прыгает на новое место.
Знаю, что вопрос очень нубский, но сегодня башка вообще не соображает, ткните носом плиз, а то даже доки не помогают :(



Отредактировано (Апрель 8, 2009 19:21:05)

Офлайн

#2 Апрель 8, 2009 19:54:24

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Pygame - движение

Обрати внимание на это:
> self.rect = newpos # перерисовываем спрайт на новом месте
И на это:
> pygame.display.flip() # обновляем экран

А теперь подумай почему у тебя не выводятся промежуточные состояния объекта. Подскажу, ты не забываешь обновлять экран, отрисовать задний буфер спереди? Хотя всё равно, так делать нельзя.
Задача достаточно элементарная, посиди и подумай еще. Тебе достаточно знать во сколько началось движение, сколько сейчас на часах, из какой точки и в какую точку движется объект, а уж выполнить интерполяцию координат объекта в соответствии с текущим временем может и моя бабушка.

..bw



Офлайн

#3 Апрель 9, 2009 01:04:43

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame - движение

Угу, я пытался так сделать, вот только если функция перерисовки спрайта вызывается с частотой общего fps отрисовки мира, то в ней бесполезно вызывать clock.tick(), он всегда будет нулевым. Поэтому чтобы рассчитать по формуле S=VT - нужен независимый таймер. Вот тут я и запинаюсь.



Отредактировано (Апрель 9, 2009 01:05:21)

Офлайн

#4 Апрель 9, 2009 02:23:45

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Pygame - движение

Я не помню как там в pygame, проблем с таймером у меня не было. А время тебе нужно не прям сейчас (не обязательно), а достаточно времени начала отрисовки сцены. В любом случае, тебе никто не запрещает использовать менее точные time.time() и time.clock().

..bw



Отредактировано (Апрель 9, 2009 02:24:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version