【问题标题】:How do I make a sprite as a gif in pygame? [duplicate]如何在pygame中将精灵制作为gif? [复制]
【发布时间】:2021-01-18 14:39:36
【问题描述】:

所以我有这个想法,让你在控制直升机的同时躲避弹丸。我想知道您是否可以使精灵显示为 gif,或者像两幅图像一样每秒钟切换一次。我知道如何让精灵显示为一张图片:

self.surf = pygame.image.load("example.png").convert()

但我想知道这是否有影响:

self.surf = pygame.image.load("example.gif").convert()

不幸的是,它只显示了 gif 中的第一张图片。 这是gif:

编辑:好的,所以我查看了答案并尝试在我的代码中实现它们,但是这太令人困惑了,我试图做一些更简单的事情。这是我想出的:

    if play == 1:
        self.surf = pygame.image.load("Image2.png").convert()
        pygame.display.update()
        play = 2
        time.sleep(.2)
    if play == 2:
        self.surf = pygame.image.load("Image1.png").convert()
        pygame.display.update()
        play = 1
        time.sleep(.2)

但是,所做的只是将播放器精灵显示为图像 1。我可以添加什么来完成这项工作吗?

【问题讨论】:

    标签: python pygame pygame-surface


    【解决方案1】:

    PyGame分别是pygame.image模块只能处理非动画GIFs
    但是在 PyGame 主页上介绍了GIFImage 库:

    这个库为pygame添加了GIF动画播放。


    另一种选择是使用 Pillow 库 (pip install Pillow)。

    编写一个函数,可以将 PIL 图像转换为 pygame.Surface:
    (另见PIL and pygame.image

    def pilImageToSurface(pilImage):
        mode, size, data = pilImage.mode, pilImage.size, pilImage.tobytes()
        return pygame.image.fromstring(data, size, mode).convert_alpha()
    

    使用 PIL 库逐帧加载 GIF:
    (另见Extracting The Frames Of An Animated GIF Using Pillow

    def loadGIF(filename):
        pilImage = Image.open(filename)
        frames = []
        if pilImage.format == 'GIF' and pilImage.is_animated:
            for frame in ImageSequence.Iterator(pilImage):
                pygameImage = pilImageToSurface(frame.convert('RGBA'))
                frames.append(pygameImage)
        else:
            frames.append(pilImageToSurface(pilImage))
        return frames
    

    另请参阅Load animated GIF 和一个简单的动画 gif 查看器示例:

    import pygame
    from PIL import Image
    
    def pilImageToSurface(pilImage):
        mode, size, data = pilImage.mode, pilImage.size, pilImage.tobytes()
        return pygame.image.fromstring(data, size, mode).convert_alpha()
    
    def loadGIF(filename):
        pilImage = Image.open(filename)
        frames = []
        if pilImage.format == 'GIF' and pilImage.is_animated:
            for frame in ImageSequence.Iterator(pilImage):
                pygameImage = pilImageToSurface(frame.convert('RGBA'))
                frames.append(pygameImage)
        else:
            frames.append(pilImageToSurface(pilImage))
        return frames
     
    pygame.init()
    window = pygame.display.set_mode((500, 500))
    clock = pygame.time.Clock()
    
    gifFrameList = loadGIF("my_gif.gif")
    currentFrame = 0
    
    run = True
    while run:
        clock.tick(20)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
    
        window.fill(0)
    
        rect = gifFrameList[currentFrame].get_rect(center = (250, 250))
        window.blit(gifFrameList[currentFrame], rect)
        currentFrame = (currentFrame + 1) % len(gifFrameList)
        
        pygame.display.flip()
    

    您可以使用pygame.Surface 对象列表来生成Spritesheet

    【讨论】:

      【解决方案2】:

      Pygame 不能制作 gif,但如果你真的想要,你可以一次一帧地为它制作动画。

      【讨论】:

      • 我该怎么做?
      • 首先,将gif转换成一堆图片。您只需要显示一帧,然后擦除并显示另一帧。
      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 1970-01-01
      相关资源
      最近更新 更多