Animation(动画)

现在我们知道如何让Pygame框架绘制到屏幕上,让我们学习如何制作动画图片。只有静止不动的图像的游戏会相当沉闷。动画图像是在屏幕上绘制图像的结果,然后一瞬间在屏幕上绘制略微不同的图像。想象一下,程序的窗口宽6像素,高1像素,除了4,0的黑色像素外,所有像素都是白色的。它看起来像这样:

如果您更改窗口以使3,0为黑色且4,0为白色,则它将如下所示:

对于用户来说,看起来黑色像素已经“移动”到左侧。如果您重新绘制窗口以使黑色像素为2,0,则它将继续看起来像黑色像素向左移动:

它可能看起来像黑色像素在移动,但这只是一种幻觉。对于计算机,它只显示三个不同的图像,每个图像碰巧有一个黑色像素。考虑是否在屏幕上快速显示以下三个图像:

对于用户来说,看起来猫正朝着松鼠移动。但对于电脑来说,它们只是一堆像素。制作可信的动画制作的技巧是让你的程序在窗口上绘制一张图片,等待几分之一秒,然后绘制一幅略有 不同的图片。

代码

import pygame, sys
from pygame.locals import *

pygame.init()

FPS = 30 # frames per second setting
fpsClock = pygame.time.Clock()

# set up the window
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')

WHITE = (255, 255, 255)
catImg = pygame.image.load('cat.png')
catx = 10
caty = 10
direction = 'right'

while True: # the main game loop

    DISPLAYSURF.fill(WHITE)
    
    if direction == 'right':
        catx += 5
        if catx == 280:
            direction = 'down'
    elif direction == 'down':
        caty += 5
        if caty == 220:
            direction = 'left'
    elif direction == 'left':
        catx -= 5
        if catx == 10:
            direction = 'up'
    elif direction == 'up':
        caty -= 5
        if caty == 10:
            direction = 'right'
            
    DISPLAYSURF.blit(catImg, (catx, caty))
    
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
            
    pygame.display.update()
    fpsClock.tick(FPS)
    

结果

cat.PNG

Frames Per Second and pygame.time.Clock Objects

帧速率或刷新速率是程序每秒绘制图像的数目,测量FPS或每秒帧数。(在计算机显示器上,FPS的通用名称是赫兹。许多显示器的帧速率为60赫兹,或每秒60帧。)视频游戏中的低帧率会使游戏看起来不稳定或跳跃。如果程序有太多的代码要运行以足够频繁地绘制到屏幕上,则FPS会下降。
一个pygame.time.Clock对象可以帮助我们确保我们的程序在一定的最大FPS运行。这个Clock对象将通过在游戏循环的每次迭代中进行小的暂停来确保我们的游戏程序不会运行得太快。如果我们没有这些暂停,我们的游戏程序将以计算机运行的速度运行。对于玩家来说这通常太快了,而且随着计算机变得更快,他们也会更快地运行游戏。在游戏循环中调用Clock对象的tick() 方法可以确保游戏以相同的速度运行,无论它运行的计算机有多快。

fpsClock = pygame.time.Clock()

Clock对象的tick()方法在游戏循环的最后调用,pygame.display.update()之后调用。停的长度是根据自上次调用tick()以来的时间长度计算的,这将在游戏循环的上一次迭代结束时发生。(第一次调用tick()方法时,它根本不会暂停。)
您需要知道的是,应该在循环结束时通过游戏循环每次迭代调用tick()方法一次。通常这是在调用pygame.display.update()之后。

fpsClock.tick(FPS)

Drawing Images with pygame.image.load() and blit()

Pygame能够将图像从PNG,JPG,GIF和BMP图像文件加载到Surface对象上。
猫的图像存储在名为cat.png的文件中。要加载此文件的图像,字符串'cat.png'将传递给pygame.image.load ()函数。该pygame.image.load()函数调用将返回一个Surface object。此Surface对象并不在显示的Surface中,因此必须将图像的Surface对象blit(即复制)到显示Surface对象。Blitting 将一个Surface的内容绘制到另一个Surface上。它是使用Surface对象的方法blit()完成的。
如果你得到一个错误信息,如“ pygame.error: Couldn't open cat.png ”当调用pygame.image.load() ,然后确保cat.png文件和catanimation.py在同一文件夹中 。
DISPLAYSURF.blit(catImg, (catx, caty))
blit()方法将catImg复制到 DISPLAYSURF。blit()有两个参数。第一个是源Surface对象,它将被复制到DISPLAYSURF Surface对象上。第二个参数是一个两个整数的元组,其中图像应该被复制到左上角什么地方。
如果catx和caty 设置为100和200 且catImg的宽度为125 且高度为79,则此blit() 调用会将此图像复制到DISPLAYSURF,以便catImg的左上角位于XY坐标(100 ,200)和右下角的XY坐标是(225,279)。
请注意,您无法对当前“已锁定”的Surface进行blit(例如,当PixelArray对象已从其中生成但尚未删除时)。
游戏循环的其余部分只是改变catx,caty和direction变量,以便猫在窗口周围移动。还有一个调用pygame.event.get() 来处理QUIT事件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容