【问题标题】:How to handle sprite animation in Kivy如何在 Kivy 中处理精灵动画
【发布时间】:2013-10-23 04:01:03
【问题描述】:

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

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

【问题讨论】:

    标签: animation 2d-games kivy


    【解决方案1】:

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

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

    另外,kivy可以管理gif,也可以压缩图片压缩包直接做动画(有动画的png很有用),你可以让kivy这样管理整个动画过程。

    【讨论】:

    • "Also, kivy can manage gifs..." 谢谢,你有链接解释更多关于 kivy 的这个功能的细节吗?
    • 只需使用 gif 作为 Image 小部件的来源,它就可以工作,有一些属性可以管理播放和重复的速度,这一切都在官方文档中。
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多