Pygame如何更改Surface的大小?

4

如何更改pygame中具有图像的表面的大小(而不是缩放)。当我在pygame中加载图像时,表面变为图像的大小。我需要将表面的大小更改为帧(精灵表)的大小。

这是我用来解决问题的代码(感谢Chris Dennett):

self.surface = pygame.Surface((20, 20))
self.surface.blit(pygame.image.load(imageName).convert_alpha(), (0,0), (0, 0, frameWidth, frameHeight))

2
不是很确定,我会回答的。 - Chris Dennett
surface docs中提到了一个构造函数,它接受一个大小和另一个表面:pygame.Surface((width, height), flags=0, Surface): return Surface。但是不清楚它是否复制该表面,还是只复制该表面的属性。 - Merlyn Morgan-Graham
1
是的,我看过了。我不确定它在这种情况下是否有效。我认为它只是复制表面属性,因此可能有助于保持相同的颜色深度/像素格式等。 - Chris Dennett
2个回答

5
对于精灵表,你有两个好的选择。
1)将精灵表作为一个Surface加载。
在blitting时,使用源矩形参数。这将从表中blit一个帧。
2)使用子表面。
将精灵表作为一个Surface加载。 加载每个要素的子表面:http://www.pygame.org/docs/ref/surface.html#Surface.subsurface 就您而言,子表面是一个具有单元格宽度和高度的“新”表面。但是,它不是重复的内存。它是链接的。
从文档中:
返回与其新父级共享像素的新Surface。新Surface被认为是原始Surface的子级。对任一Surface像素的修改都会影响彼此。Surface信息(如剪辑区域和颜色键)对每个Surface都是唯一的。

3
创建一个新的表面,将所需的宽度和高度作为参数传递(即精灵的大小)。然后使用 newsurf.blit(spritesheet, (0, 0), (posX, posY, newsurf.getWidth(), newsurf.getHeight()))。应该没问题。现在你可以将 newsurf 用作你的精灵。 posXposY 分别应该是你想要从精灵图中 blit 的 x 和 y 坐标。

1
问题已解决。非常感谢:self.surface.blit(pygame.image.load(imageName).convert_alpha(), (0,0), (0, 0, frameWidth, frameHeight)) - nobody
哦,你想避免一遍又一遍地加载精灵表。这真的很低效 :) - Chris Dennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接