如何处理Kivy中的精灵动画

时间:2013-10-15 11:07:53

标签: animation 2d-games kivy

我正在使用Kivy编写游戏代码。我有一个Screen类,我在其中放置动画代码。这不是一般的游戏,它更像是几个屏幕,每个屏幕都有自己的动画,按钮命令可以来回切换到不同的屏幕。

它工作正常,但是当我制作更多这样的类并将其全部放在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 个答案:

答案 0 :(得分:1)

如果您想为屏幕使用Screen和ScreenManager,最好使用他们定义和使用的过渡系统,以便定义您自己的过渡并应用它们。如果你想要更多的控制,我会建议你骑上Screen和ScreenManager,然后只使用Widgets来控制整个绘图/定位过程。

此外,Clock.schedule_interval(self.update,0)等同于您正在进行的调用,每帧都会调用动画,您可以使用dt来管理动画进度。

此外,kivy可以管理GIF,以及图像的zip存档直接进行动画制作(对于动画png很有用),你可以让kivy以这种方式管理整个动画过程。