现在我们知道如何让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.PNGFrames 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事件。
网友评论