PyGame写写玩玩——第5篇_逐帧动画

原创
11/20 15:50
阅读数 5.2K

什么是逐帧动画?

逐帧动画,是一种动画技术,其原理即将每帧不同的图像连续播放,从而产生动画效果。

承接上一节的代码

我们基于上一节的代码来实现一个圆形来回运动的动画效果。上一节的代码如下

import pygame

pygame.init()

screen = pygame.display.set_mode((640, 480))     # 设置窗口的大小
# 创建一个surface,名字叫background,大小和screen一样
background = pygame.Surface(screen.get_size())
# 用白色填充background;255,255,255是RGB的白色
background.fill((255, 255, 255))

mySurface = pygame.Surface((200, 200))  # 200 x 200 大小的surface
mySurface.set_colorkey((0, 0, 0))
pygame.draw.circle(mySurface, (0, 0, 255), (100, 100), 100)

background = background.convert()
screen.blit(background, (0, 0))

mySurface = mySurface.convert_alpha()
screen.blit(mySurface, (200, 200))


clock = pygame.time.Clock()     # 创建clock对象
FPS = 30                        # 定义帧率的上限,就是帧率的最大值

mainloop = True

while mainloop:
    clock.tick(FPS)                          # 设置最大帧率

    for event in pygame.event.get():         # 这一部分就是事件处理
        if event.type == pygame.QUIT:        # 如果按下右上角的叉叉
            mainloop = False                 # 退出主循环
        elif event.type == pygame.KEYDOWN:   # 如果按下了键盘
            if event.key == pygame.K_ESCAPE:  # 而且按下的还是ESC键
                mainloop = False             # 退出主循环

    # 在这里做一些游戏相关的运算,这里暂时省略
    text = "FPS: {0:.2f}".format(clock.get_fps())
    pygame.display.set_caption(text)

    pygame.display.flip()                    # 刷新显示

pygame.quit()

实现原理和代码

我们将要在主循环中不断修改surface的坐标,从而实现移动的效果。还记得blit一个surface时,有个参数就是坐标吗?

screen.blit(mySurface, (200, 200))

这里的(200, 200)就是坐标。

在第一次blit我们的mySurface时,我们将它的坐标设置为(0, 0),这样它会显示在左上角。

我们定义了mySurfaceX、mySurfaceY来保存当前mySurface的坐标;定义了dx、dy来表示每次循环中mySurfaceX、mySurfaceY的增量。

在主循环中,修改mySurfaceX、mySurfaceY,然后mySurface被blit到(mySurfaceX, mySurfaceY)。

import pygame

pygame.init()

screen = pygame.display.set_mode((640, 480))     # 设置窗口的大小
# 创建一个surface,名字叫background,大小和screen一样
background = pygame.Surface(screen.get_size())
# 用白色填充background;255,255,255是RGB的白色
background.fill((255, 255, 255))

mySurface = pygame.Surface((200, 200))  # 200 x 200 大小的surface
mySurface.set_colorkey((0, 0, 0))
pygame.draw.circle(mySurface, (0, 0, 255), (100, 100), 100)

background = background.convert()
screen.blit(background, (0, 0))

mySurface = mySurface.convert_alpha()

####################################################################
screen.blit(mySurface, (0, 0))

mySurfaceX = 0
mySurfaceY = 0
dx = 10
dy = 0
####################################################################

clock = pygame.time.Clock()     # 创建clock对象
FPS = 30                        # 定义帧率的上限,就是帧率的最大值

mainloop = True

while mainloop:
    clock.tick(FPS)                          # 设置最大帧率

    for event in pygame.event.get():         # 这一部分就是事件处理
        if event.type == pygame.QUIT:        # 如果按下右上角的叉叉
            mainloop = False                 # 退出主循环
        elif event.type == pygame.KEYDOWN:   # 如果按下了键盘
            if event.key == pygame.K_ESCAPE:  # 而且按下的还是ESC键
                mainloop = False             # 退出主循环

####################################################################
    mySurfaceX += dx
    mySurfaceY += dy

    if mySurfaceX + mySurface.get_rect().width > screen.get_rect().width:
        dx *= -1
    elif mySurfaceX < 0:
        dx *= -1
    else:
        pass

    screen.blit(background, (0, 0))  # !!!!!!!!!!!!!!!!!!!!!!!
    screen.blit(mySurface, (round(mySurfaceX, 0), round(mySurfaceY, 0)))
####################################################################

    text = "FPS: {0:.2f}".format(clock.get_fps())
    pygame.display.set_caption(text)

    pygame.display.flip()                    # 刷新显示

pygame.quit()

运行这一段代码,你将看到一个往复运动的圆形。请特别注意下面这一行代码

screen.blit(background, (0, 0))  # !!!!!!!!!!!!!!!!!!!!!!!

如果你注释掉这一行代码,你将得到一个长条。这行代码的作用相当于“擦除”,它覆盖掉了前面画的东西。

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部