Pygame和Numpy动画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pygame和Numpy动画相关的知识,希望对你有一定的参考价值。

假设我有一个数据类型为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.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()

以上是关于Pygame和Numpy动画的主要内容,如果未能解决你的问题,请参考以下文章

0x01 [游戏制作]精灵动画类的实现--基于python3.7和pygame

改变精灵动画速度(pygame)

在PyCharm中导入Numpy和Pygame模块 (win8.1)

如何在 Pygame 中使用 Sprite Sheets 创建动画精灵?

如何在 Pygame 中使用 Sprite Sheets 创建动画精灵?

使用嵌套片段和动画对象