一开始上来就写一些对函数的理解,终究是对初学者的不友好,考虑到更多学习pygame这个模块的人大多是从事编程教育或是初学者,觉得有一篇文风和善,细细道来的安装文档总归是相宜的。
并且pygame这个模块近些年的更新,还是有很多的不适配或是各种各样的问题,在学生和外地的同事中总有这样那样的反馈。在这里保留一篇安装文档,能让他们更快地解决这些在安装和使用过程中的问题。
我之前有写过一篇《pygame的第一步》,这里我就把它引用过来,并且做一个完善。有点长,简书也暂时不支持TOC目录,所以看到不感兴趣的快速下拉吧。
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
上面的话是我之前刚开始教学的时候写的,后来随着接触的学生越来越多,我发现事实并不是这样的,以下的内容就是我的补充。
-
问题一:Python版本安装不正确导致pygame异常
这个异常我碰到过两次,都是在Python刚刚更新到3.7的版本的时候。很多时候初学者去学习Python,都会挑选最新的版本Python去学习。但是pygame作为一个,相对来说之前比较“懒”更新的库(最近他们更新的还是很勤快及时的,官网和文档也都做了很好的优化和更新),很容易在Python语言更新的初期,跟不上更新进度,导致安装的时候出现问题。
在前段时间的教学中,我一直使用的3.6.x版本的Python,相对来说比较稳定,而且版本也很新。所以我这里推荐暂时需要稳定学习pygame的同学,安装使用3.6左右版本的Python,然后使用pip命令安装pygame(自动匹配版本,如果要手动安装的话,去pygame的官网下载对应版本号的就可以。)。 -
问题二:Python安装位置的权限问题影响pygame安装
之前有很多回家安装的学生有和我说过,安装的时候出现红色的字或者是灰色的字。大部分学生在安装Python的时候,根据我的要求去打了相关的√,但是很少有去修改Python的安装路径的。所以大部分的这些学生的Python都被安装在了C盘。
报错截图.png
如果要在C盘的Python文件夹中安装一个新的库,多半是需要用到管理员权限的,如果是使用软件的过程中需要用到管理员权限,PC系统会提示你是否授权。但是在CMD窗口安装的时候,这个弹窗不会弹出来,而是直接说明报错,无法获取这个写入权限。
这时候其实只要用管理员权限的CMD窗口输入pip命令就不会出现这种问题。
管理员权限CMD.png
点击确认弹出的权限窗口,这时候的CMD窗口左上角应该是:
窗口名称.png
Installing collected packages: pygame
Successfully installed pygame-1.9.4
如果在结果中没有报出红色报错信息,而且能够看到上面的两句话,就说明安装成功了。
模块列表
模块名 | 功能 |
---|---|
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
网友评论