假设我有一个数据类型为myAnimation
的Numpy数组np.uint8
,表示形状为(y,x,4,k)
的动画(多帧仍然是8位RGBA图像),其中y
是高度,x
是宽度,4是通道数(红色,绿色,蓝色) ,alpha),k
是动画中的帧数。
假设我想以指定的帧速率(比如每秒15帧)在PyGame中回放这个NumPy数组的帧并拥有动画循环。
这可能与Pygame有关吗?
如果是这样,你会如何实现它?你能提供一个例子吗?
我在网上找到的所有内容都涉及从磁盘读取文件,但重要的是我能够使用已经在内存中的值,因为它们会在程序运行时频繁更改。
[...]形状
(y,x,4,k)
,其中y
是高度,x
是宽度,4是通道的数量(红色,绿色,蓝色,alpha),而k
是帧的数量[...]
可悲的是,这是不可能直接的。
通过pygame.surfarray.make_surface
,一组(numpy)数据可以转换为pygame.Surface
。
但是阵列必须是具有形状(x, y, 3)
的三维阵列。
这意味着必须首先将数组从形状qazxsw poi转换为qazxsw poi。这可以通过(y, x, 4, k)
来实现:
(k, x, y, 4)
最后,每个帧的alpha通道必须由numpy.moveaxis
删除:
myAnimation = np.moveaxis(myAnimation, 1, 0)
myAnimation = np.moveaxis(myAnimation, 3, 0)
具有形状(y,x,4,k)的numpy.delete
array可以通过以下方式转换为k个np.delete(myAnimation[i], 3, 2) )
es列表:
np.uint8
帧速率可以由pygame.Surface
设置。看例子:
myAnimation = np.moveaxis(myAnimation, 1, 0)
myAnimation = np.moveaxis(myAnimation, 3, 0)
surfL = [pygame.surfarray.make_surface( np.delete(myAnimation[i], 3, 2) ).convert_alpha() \
for i in range(myAnimation.shape[0])]
pygame.time.Clock.tick()