2013-10-15 3 views
0

Я кодирую игру с помощью Kivy. У меня есть класс Screen, где я помещаю свой код анимации. Это не обычная игра, она больше похожа на несколько экранов, каждая со своей собственной анимацией, с командами кнопок для перехода назад и вперед на разные экраны.Как справиться с анимацией спрайтов в Kivy

Это работает нормально, но когда я делаю больше классов, подобных этому, и помещаю все это в ScreenManager, анимация прерывается случайными белыми экранами.

class Pas(Screen): 
def __init__(self, **kwargs): 
    super(Pas, self).__init__(**kwargs) 
    Clock.schedule_interval(self.update, 1/60.0) 

    self.ani_speed_init = 15 
    self.ani_speed = self.ani_speed_init 
    self.ani = glob.glob("img/pas_ani*.png") 
    self.ani.sort() 
    self.ani_pos = 0 
    self.ani_max = len(self.ani)-1 
    self.img = self.ani[0] 
    self.update(1) 

    back = Button(
      background_normal=('img/back-icon.png'), 
      background_down=('img/back-icon.png'), 
      pos=(380, 420)) 
    self.add_widget(back) 
    def callback(instance): 
     sm.current = 'game' 
    back.bind(on_press=callback) 

def update(self, dt): 
    self.ani_speed -= 1 
    if self.ani_speed == 0: 
     self.img = self.ani[self.ani_pos] 
     self.ani_speed = self.ani_speed_init 
     if self.ani_pos == self.ani_max: 
      self.ani_pos = 0 
     else: 
      self.ani_pos += 1 
    with self.canvas: 
     image = Image(source=self.img, pos=(0, 0), size=(320, 480)) 

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

ответ

1

Если вы хотите использовать Screen и ScreenManager для своих экранов, было бы лучше использовать систему перехода, которую они определяют и используют, поэтому, чтобы определить свои собственные переходы и применить их. Если вы хотите большего контроля, я бы посоветовал проехать Screen и ScreenManager и просто использовать Widgets, чтобы контролировать весь процесс рисования/позиционирования.

Кроме того, Clock.schedule_interval (self.update, 0) эквивалентен вызову, который вы создаете, анимация будет вызываться каждый кадр, и вы можете использовать dt для управления ходом анимации.

Кроме того, kivy может управлять gifs, а также zip-архивами изображений, чтобы непосредственно делать анимации (полезно иметь анимированные png), вы можете позволить киви управлять всем процессом анимации таким образом.

+0

'' Кроме того, kivy может управлять gifs ... "' спасибо, и у вас есть ссылка, объясняющая более подробную информацию об этой функции kivy? – ecoe

+0

просто используйте gif как источник для виджета Image, он будет работать, есть свойства для управления скоростью игры и повторения, все это в официальной документации. – Tshirtman