我不完全了解如何正确使用画布来制作带动画的图像。
请参阅附件中的代码片段,我将动画图标加载到图片中并同时执行以下操作: (1)add_widget图片 (2)创建一个带有texture = Image纹理
的Rectangle画布指令图像动画 矩形纹理不
我已经阅读了所有Kivy手册并阅读了Image和Canvas,我认为Image是一个很好的高级类,所有这些图像动画处理和Canvas更像是一个原始的低级绘图画布
所以这是我的问题 - 在Canvas上处理动画的Kivy正确架构是什么?我看了动画,但这似乎更像矩阵般的动画,如平移,缩放,旋转。
以下是我现在正在做的事情: 我有一个带有大地图窗口的游戏,然后是辅助窗口中的一堆游戏用户体验 游戏UX助手窗口我做所有kivy布局等,并使用一般图像,所以我的图标很好地动画
但是在游戏地图中,我使用的是画布:
使用此范例绘制我的所有游戏对象:
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()
答案 0 :(得分:2)
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
属性,因此每次更改时我都可以相应地更新矩形。