gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:12:54 26 4
gpt4 key购买 nike

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

请参阅附加的代码片段,我在其中将动画图标加载到图像中并同时执行以下操作:(1) add_widget Image(2)创建一个Rectangle canvas指令,其中一个texture = Image's texture

图像动画矩形纹理不

我已经通读了所有 Kivy 手册并通读了 Image 和 Canvas,我认为 Image 是一个很好的高级类,可以处理所有这些图像动画,而 Canvas 更像是一个原始的低级绘图 Canvas .

所以这是我的问题——在 Canvas 上处理动画的 Kivy 正确架构是什么?我查看了 Animation,但它似乎更适合矩阵式动画,例如平移、缩放、旋转。

这是我现在正在做的:我有带有大 map 窗口的游戏,然后在辅助窗口中有一堆游戏 UX游戏 UX 助手窗口 我做了所有的 kivy 布局等等,并且通常使用图像,所以我的图标动画效果很好

但是在游戏 map 中,我使用的是 Canvas :

使用此范例绘制我所有的游戏对象:

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

当世界需要重新绘制时:

1) map.canvas.clear()

2) 把所有的东西画在它们新的位置和状态(为了更快,我应该只跟踪脏物体和位置并绘制它们,但老实说,即使在每次绘制时都有这种核级清晰度,我也能获得出色的 fps)

这当然比创建和销毁数百个小部件类要快得多,重量也轻得多 - map Canvas 的用途 - 对吧?

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

问:我对 Canvas 的看法是不是错了?我应该改为为我的每个游戏对象添加一个图像吗? (并利用所有动画图像支持?)

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 方法绑定(bind)到图像的 texture 属性,因此每次它发生变化时,我都可以相应地更新矩形。

关于python - Kivy:用 Canvas 制作动画图像的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48141004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com