程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Kivy:用画布制作图像动画的正确方法是什么?

发布于2019-10-31 08:50     阅读(1690)     评论(0)     点赞(23)     收藏(0)


我不完全了解如何正确使用画布处理带有动画的图像。

请参阅随附的代码段,在该代码段中,我将动画图标加载到图像中并同时执行以下操作:(1)add_widget图像(2)创建带有纹理=图像纹理的Rectangle canvas指令

图像动画矩形纹理不

我通读了所有Kivy手册,并通读了Image和Canvas,我发现Image是具有所有此类图像动画处理功能的不错的高级类,而Canvas更像是原始的低级绘图画布。

所以这是我的问题-在Canvas上处理动画的Kivy正确架构是什么?我看过动画,但它看起来更像矩阵动画,例如平移,缩放,旋转。

这就是我现在正在做的事情:我有一个带有大地图窗口的游戏,然后在帮助程序窗口中有一堆游戏UX游戏UX帮助程序窗口我做了所有的奇异布局,并且通常使用图像,所以我的图标动画效果很好。

但是,在游戏地图中,我使用的是画布:

使用以下范例绘制所有游戏对象:

r=Rectangle(texture=some_Image.texture)
map.canvas.add(r)

需要重新绘制世界时:

1) map.canvas.clear()

2)将所有内容绘制到新的位置和状态(为更快,我应该跟踪脏的对象和位置并绘制它们,但老实说,即使每个对象都具有核级,我也得到了出色的fps画)

当然,这比创建和销毁数百个小部件类要快得多,而且重量也要轻得多-对什么画布来说是正确的?

但是问题是我的zip文件中带有动画的图标没有设置动画

问:我认为帆布错了吗?我应该改为为每个游戏对象添加一个图像吗?(并利用所有动画图像支持吗?)

from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.image import Image
from kivy.app import App
from kivy.graphics import Rectangle


class MainApp(App):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.root = RelativeLayout()

        # use any zip file of an animated image
        self.animated_icon = Image(source='factory_icon.zip')

        # If I add an Image, the icon animates
        self.root.add_widget(self.animated_icon)

        # If I add the Image's texture on to a Rectangle instruction, no animation
        r = Rectangle(texture=self.animated_icon.texture, size=(100, 100), pos=(100, 100))
        self.root.canvas.add(r)

    def build(self):
        return self.root


if __name__ == '__main__':
    MainApp().run()

解决方案


Image.texture属性随时间变化。它安排内部方法来随着动画的进行进行更新。此更改不会传播到您的矩形,因为您在更新之间的某个特定时间点使用捕获的纹理值创建了它。考虑以下示例(我为动画使用了一个.gif文件,但原理应相同):

from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.image import Image
from kivy.app import App
from kivy.graphics import Rectangle


class MainApp(App):
    def __init__(self, **kwargs):
        super(MainApp, self).__init__(**kwargs)
        self.root = RelativeLayout()

        animated_icon = Image(source='test.gif')
        animated_icon.bind(texture=self.update_texture)

        self.r = Rectangle(texture=animated_icon.texture, size=(500, 255), pos=(100, 100))
        self.root.canvas.add(self.r)

    def update_texture(self, instance, value):
        self.r.texture = value

    def build(self):
        return self.root


if __name__ == '__main__':
    MainApp().run()

在这里,我将自己的update_texture方法绑定到图像的texture属性,因此每次更改时,我都可以相应地更新矩形。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/147951/cf9f7f443fbb5ca38fab/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)