afrcmg 2022-07-11 11:27 采纳率: 87.5%
浏览 25
已结题

有关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理解有问题。希望有高人解答一下,谢谢

  • 写回答

2条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-07-11 12:25
    关注

    思路很好,问题很小——从第二次循环开始,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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月11日
  • 创建了问题 7月11日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。