作者:Pete Shinners
联系方式:pete@shinners.org
愿景:构建一个真正利用 Python 优势的项目。
目标:让简单的事情变得容易,让困难的事情变得直接。
时间:始于 2000 年 10 月,六个月后,pygame 1.0 版本发布(即2001年)。
import sys, pygamepygame.init()size = width, height = 320, 240speed = [2, 2]black = 0, 0, 0screen = pygame.display.set_mode(size)ball = pygame.image.load("intro_ball.gif")ballrect = ball.get_rect()while True:for event in pygame.event.get():if event.type == pygame.QUIT: sys.exit()ballrect = ballrect.move(speed)if ballrect.left < 0 or ballrect.right > width:speed[0] = -speed[0]if ballrect.top < 0 or ballrect.bottom > height:speed[1] = -speed[1]screen.fill("black")screen.blit(ball, ballrect)pygame.display.flip()
这是弹跳动画最简单的方式。
第 1 行:import sys, pygame
导入系统(sys)和 包含所有可用 pygame 模块的包。
第 2 行:pygame.init()
初始化pygame中全部模块。
第 4 行:size = width, height = 320, 240
设置显示窗口的大小,为了获得最佳效果,你可以将这些数字更改为匹配您自己显示器的分辨率。
第 5 行:speed = [2, 2]
水平方向速度和竖直方向速度。
第 6 行:black = 0, 0, 0
背景颜色为黑色。
第 8 行:screen = pygame.display.set_mode(size)
创建一个图形窗口,默认情况下,Pygame自动选择最佳图形模式。默认情况是可以被覆盖的。Pygame 将图像表示为 Surface 对象。“display.set_mode()” 函数创建一个新的 Surface 对象,表示实际显示的图形。您在此 Surface 上进行的任何绘图都将显示在显示器上。
第 10 行:ball = pygame.image.load("intro_ball.gif")
加载球图像。Pygame 支持多种图像格式,包括 BMP、JPG、PNG、TGA 和 GIF。“pygame.image.load()”函数返回一个包含球数据的 Surface对象。Surface对象中保留图片文件中颜色和透明度(alpha)的全部数据。另存下面的图片(文件名称:intro_ball.gif)到客户端安装目录下:

或下载链接:
https://5xstar.com/pygame/docs/_images/intro_ball.gif。
第 11 行:ballrect = ball.get_rect()
加载球图像后,创建一个名为 ballrect 的变量。这是Pygame自带的一个方便的工具型对象,类名为 Rect,它表示一个矩形区域。稍后,在动画部分代码中,我们将看到 Rect 对象可以做什么。
第 13 行:while True:
此时,程序已初始化并准备好运行。在一个无限循环中,检查用户输入,移动球,然后绘制球。
第 14 行:for event in pygame.event.get():
pygame.event.get()返回的是pygame.event.Event对象列表(List),该句是枚举全部的事件(pygame.event.Event)。
第 15 行:if event.type == pygame.QUIT: sys.exit()
检查是否发生了 QUIT 事件(点关闭按钮)。如果是,只需退出程序,pygame 将确保一切都干净地关闭。
第 17 行:ballrect = ballrect.move(speed)
更新球的位置。将 ballrect 变量按当前速度(x和y分量)移动。
第 18 行:if ballrect.left < 0 or ballrect.right > width:
如果球的左边(ballrect.left)已出了左边界(0)或右边(ballrect.right)出了右边界(width)。
第 19 行:speed[0] = -speed[0]
水平方向速度取反。
第 20 行:if ballrect.top < 0 or ballrect.bottom > height:
如果球的上边(ballrect.top)已出了上边界(0)或下边(ballrect.bottom)出了下边界(height)。
第 21 行:speed[1] = -speed[1]
竖直方向速度取反。
第 23 行:screen.fill("black")
通过涮黑色来擦除屏幕。如果你从未处理过动画,这可能看起来很奇怪。你可能会问“为什么我们需要擦除任何东西,为什么我们不能只在屏幕上移动球?”事实上,这不是计算机动画的工作方式。动画只不过是一系列单个图像,当按顺序显示时,它们很好地欺骗了人眼,使其看到运动。实际上,我们只是看到一个个图像(帧)。如果不将球从屏幕上擦除,就会看到球的“轨迹”,因为在新位置绘制球后,旧球图像还在。下面是注释掉这行后程序运行的结果视频:
第 24 行:screen.blit(ball, ballrect)
将球图像绘制到屏幕上。图像的绘制由 Surface.blit() 方法处理(第一个参数:球的Surface对象)。Surface.blit() 方法将球Surface对象中保留的图像复制到图像窗口对象screen中的新位置上。
第 25 行:pygame.display.flip()
首先注释掉这一行会发生什么情况呢?看下面的视频:
什么也没有!因为前面我们只操作屏幕的后备缓存,所以需要做最后一件事——更新可见屏幕显示。Pygame 使用双缓冲区管理显示。当我们完成绘图后,调用pygame.display.flip()方法使缓存图像可见。这种缓冲机制确保我们只在屏幕上看到完全绘制好的帧,否则可能会看到正在绘制的帧。
报名咨询:
微信:码助教
微信号:www_5xstar_com 13729135043

Python·Pygame游戏从入门到精通系列:
Python·Pygame游戏从入门到精通 第01课 快速入门
资料库:https://5xstar.com