0

我正在使用 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))

我究竟做错了什么?我也接受不同方式的想法。

4

1 回答 1

1

如果您想为您的屏幕使用 Screen 和 ScreenManager,最好使用他们定义和使用的转换系统,因此,定义您自己的转换,并应用它们。如果您想要更多控制,我建议您使用 Screen 和 ScreenManager,并仅使用小部件来控制整个绘图/定位过程。

另外,Clock.schedule_interval(self.update, 0) 相当于你正在做的调用,动画会每帧调用一次,你可以使用dt来管理动画进度。

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

于 2013-10-15T12:16:11.747 回答