pygame框架简介
对于pygame的介绍,在网上真的基本上千篇一律,大多会感慨感谢一下作者,惋惜一下这个包在09年的时候就停止更新(但是它神奇地在17年1月份更新了)。真正的它的意义,很少人提及。下面引用一下《pygame菜鸟入门指南》里的一段介绍:
pygame是一个由Pete Shinners编写的SDL的Python封装。这就意味着,使用pygame,你可以写出可以不作修改就可以在任何支持SDL的平台(Windows, Unix, Mac, BeOS,等等)上运行的游戏或者多媒体程序。
简单的理解一下,它的底层是使用C编写的SDL(simple DirectMedia Layer)。提供了多种控制凸显个、声音、输出入得函数。让开发者是要用相同或者是相似的代码就可以开发出跨多个平台(linux、windows、mac OS X等)的应用软件。目前SDL多用于开发游戏,模拟器,媒体播放器等多媒体应用领域……
SDL内置调用了OpenGL的函数。……SDL也有其他语言的包装,SDL用C语言写成,但是很容易在C++下工作,并且绑定了许多其他的语言……包装的比较好的是python语言的pygame……
在我省略了好多……之后,pygame和SDL和OpenGL的关系渐渐明朗了起来。虽然没有对pygame的能力有很详细的描述,但是也能简单了解它的主要应用场景和主要的功能。
安装
超简单,如果有完整的python开发环境,这个应该不是什么问题。
pip install pygame
模块列表
模块名 | 功能 |
---|---|
pygame.cdrom |
访问光驱 |
pygame.cursors |
加载光标 |
pygame.display |
访问显示设备 |
pygame.draw |
绘制形状、线和点 |
pygame.event |
管理事件 |
pygame.font |
使用字体 |
pygame.image |
加载和存储图片 |
pygame.joystick |
使用游戏手柄或者类似的东西 |
pygame.key |
读取键盘按键 |
pygame.mixer |
声音 |
pygame.mouse |
鼠标 |
pygame.movie |
播放视频 |
pygame.music |
播放音频 |
pygame.overlay |
访问高级视频叠加 |
pygame.rect |
管理矩形区域 |
pygame.sndarry |
操作声音数据 |
pygame.sprite |
操作移动图像 |
pygame.surface |
管理图像和屏幕 |
pygame.surfarry |
管理点阵图像数据 |
pygame.time |
管理时间和帧信息 |
pygame.transform |
缩放和移动图像 |
其中一些我觉得比较重要的或者在初级使用阶段会经常碰到的一些字段,我都添加了标记,在之后的学习中可以重点关注一下这一块的源码。
有些模块可能在某些平台上不存在(有这个名称字段,但是为空),可以用None判断一下。
In [3]: pygame.font is None
Out[3]: False
详解一个简单的pygame程序
background_image_filename = 'sushiplate.jpg'
mouse_image_filename = 'fugu.png'
#指定图像文件名称
import pygame
#导入pygame库
from pygame.locals import *
#导入一些常用的函数和常量
from sys import exit
#向sys模块借一个exit函数用来退出程序
pygame.init()
#初始化pygame,为使用硬件做准备
screen = pygame.display.set_mode((640, 480), 0, 32)
#创建了一个窗口
pygame.display.set_caption("Hello, World!")
#设置窗口标题
background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加载并转换图像
while True:
#游戏主循环
for event in pygame.event.get():
if event.type == QUIT:
#接收到退出事件后退出程序
exit()
#这个负责监听事件的循环非常重要,是event模块在pygame程序中最频繁的使用
screen.blit(background, (0,0))
#将背景图画上去 blit(图片源,起始点)
x, y = pygame.mouse.get_pos()
#获得鼠标位置
x-= mouse_cursor.get_width() / 2
y-= mouse_cursor.get_height() / 2
#计算光标的左上角位置
screen.blit(mouse_cursor, (x, y))
#把光标画上去
pygame.display.update()
#刷新一下画面
上面的程序其实注释已经非常详尽了,我们有几点需要注意的:
- set_mode():他会返回一个surface对象,代表了在桌面上出现的那个窗口,从源码中可以看到:
set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
Initialize a window or screen for display
它需要三个参数,resolution就是分辨率,flags就是标志位,depth是色深
分辨率很好理解暂时就不多BB了,flags具体见下表,如果不需要什么特性,就0
标志位 | 功能 |
---|---|
FULLSCREEN | 创建一个全屏窗口 |
DOUBLEBUF | 创建一个“双缓冲”窗口,建议在HWSURFACE或者OPENGL时使用 |
HWSURFACE | 创建一个硬件加速的窗口,必须和FULLSCREEN同时使用 |
OPENGL | 创建一个OPENGL渲染的窗口 |
RESIZABLE | 创建一个可以改变大小的窗口 |
NOFRAME | 创建一个没有biang狂的窗口 |
convert
函数试讲图像数据都转化为surface对象,每次加载完图像以后就应该做这件事件(使用频率很高,如果你不写,pygame也会帮你写);convert_alpha
相比convert
保留了ALPHA通道信息(就简单理解为透明的部分),这样就可以获得PNG图标的效果。
blit
是一个重要函数。第一个参数是一个surface对象,第二个为左上角位置,画完一个后要记得update
更新一下,否则会出现画面一片漆黑的情况。
blit(source, dest, area=None, special_flags = 0) -> Rect
draw one image onto another