有关pygame的surface.blit的问题

我有一个自己用PIL制作的图片是这样的

img


我想在pygame里通过读取这个图片,作为很多个帧,让足球转起来

已知每个足球都是350350像素的大小,一共12个足球,所以这个图片是35012=4200,即宽4200高350

然后我想写一个通用的方法,凡是这种单行的,且由w和h相等的n个图片拼起来,想让把它们变成n个帧,且每个帧要缩放到pic_w宽,pic_h高

以下是代码

def get_dh_frames(images, w, h, n, pic_w, pic_h, colorkey=None):
    """单行的图片,将n个等宽w,等高h的图片,抽出n个帧,每帧缩放到pic_w,pic_h"""
    frames = []
    surface = pygame.Surface((w, h))  # 建造一个需要的大小的表面
    for i in range(n):
        surface.blit(images, (0, 0), (i * w, 0, w, h)) # 将大图片中的(i*w , 0,w,h)位置的图片粘贴到surface的(0,0)位置
        if colorkey:
            surface.set_colorkey(colorkey)  
        surface = pygame.transform.scale(surface, (pic_w, pic_h)).convert_alpha()  # 将w,h大小的帧,缩放到pic_w,pic_h大小
        frames.append(surface)
    return frames

我的想法是,先建一个和单个图片相等的表面
再把总图片的某个部分粘到表面上,然后存起来

但是结果是,图片动不起来,我估计是因只读到了1个图片
怀疑是这句的问题
surface.blit(images, (0, 0), (i * w, 0, w, h))

其实针对如何动起来,我已经有解决方法了:1.用12个不同的文件,就能动起来了,但这样文件太多。2.用subsurface也可以
但是我仍然来问,主要是因为,这个代码有问题,说明我可能对surface或者blit理解有问题。希望有高人解答一下,谢谢

思路很好,问题很小——从第二次循环开始,surface的尺寸改变了,所以和要截取的图片尺寸不一致,就截取不到正确的图片了。
解决方法有二:
一:改了尺寸的surface赋值给一个新的surface对象(暂命名surface2)

        surface2 = pygame.transform.scale(surface, (pic_w, pic_h)).convert_alpha()  # 将w,h大小的帧,缩放到pic_w,pic_h大小
        frames.append(surface2)

二、把初始化surface的代码放进循环:

def get_dh_frames(images, w, h, n, pic_w, pic_h, colorkey=None):
    """单行的图片,将n个等宽w,等高h的图片,抽出n个帧,每帧缩放到pic_w,pic_h"""
    frames = []
    #surface = pygame.Surface((w, h))  # 建造一个需要的大小的表面
    for i in range(n):
        surface = pygame.Surface((w, h))  # 建造一个需要的大小的表面
        surface.blit(images, (0, 0), (i * w, 0, w, h)) # 将大图片中的(i*w , 0,w,h)位置的图片粘贴到surface的(00)位置
        if colorkey:
            surface.set_colorkey(colorkey)  
        surface = pygame.transform.scale(surface, (pic_w, pic_h)).convert_alpha()  # 将w,h大小的帧,缩放到pic_w,pic_h大小
        frames.append(surface)
    return frames
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632