Pygame和Numpy动画

问题描述 投票:2回答:1

假设我有一个数据类型为myAnimation的Numpy数组np.uint8,表示形状为(y,x,4,k)的动画(多帧仍然是8位RGBA图像),其中y是高度,x是宽度,4是通道数(红色,绿色,蓝色) ,alpha),k是动画中的帧数。

假设我想以指定的帧速率(比如每秒15帧)在PyGame中回放这个NumPy数组的帧并拥有动画循环。

这可能与Pygame有关吗?

如果是这样,你会如何实现它?你能提供一个例子吗?

我在网上找到的所有内容都涉及从磁盘读取文件,但重要的是我能够使用已经在内存中的值,因为它们会在程序运行时频繁更改。

python python-3.x numpy animation pygame
1个回答
0
投票

[...]形状(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.deletearray可以通过以下方式转换为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()
© www.soinside.com 2019 - 2024. All rights reserved.