python-Pygame库介绍和使用,基本游戏开发
python Pygame库介绍和使用,基本游戏开发
Pygame的介绍
Pygame是被设计用来写游戏的python模块集合,Pygame是在优秀的SDL库之上开发的功能性包。使用python可以导入pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上。
安装库:
pip install pygame
。如果安装速度慢,可以使用换源安装。
我们可以执行第一个pygame库自带的小游戏
pygame理解:
- Python最经典的2D游戏开发第三方库,也支持3D游戏开发
- Pygame适合用于游戏逻辑验证、游戏入门及系统演示验证
- Pygame是一种游戏开发引擎,基本逻辑具有参考价值
- Pygame有些"过时",但永远"不过时"
- 使用Pygame可以开发出优秀的游戏!
最小开发框架
import pygame,sys #sys是python的标准库,提供Python运行时环境变量的操控
pygame.init() #内部各功能模块进行初始化创建及变量设置,默认调用
size = width,height = 800,600 #设置游戏窗口大小,分别是宽度和高度
screen = pygame.display.set_mode(size) #初始化显示窗口
pygame.display.set_caption("小游戏程序") #设置显示窗口的标题内容,是一个字符串类型
while True: #无限循环,直到 Python 运行时退出结束
for event in pygame.event.get(): #从 Pygame 的事件队列中取出事件,并从队列中删除该事件
if event.type == pygame.QUIT: #获得事件类型,并逐类响应
sys.exit() #用于退出结束游戏并退出
pygame.display.update() #对显示窗口进行更新,默认窗口全部重绘
运行后
代码执行流程
获取事件并筑类响应
刷新屏幕
图像的基本使用
pygame 默认是采用的笛卡尔坐标系。左上角的顶点是(0,0)
#加载导入的图片
sr = pygame.image.load("xxxx.jpg") #放入图片的路径
rectsr = sr.get_rect()
路径下的图像载入游戏,支持 JPG、PNG、GIF(非动画)等 13 种常用图片格式。
Pygame 使用内部定义的 Surface 对象表示所有载入的图像,其中.get_rect()方法返回一个覆盖图像的矩形 Rect 对象
Rect 对象有一些重要属性,例如:top,bottom,left,right 表示上下左右 width,height 表示宽度、高度。
ballrect.move(x,y)
矩形移动一个偏移量(x,y),即在横轴方向移动 x 像素,纵轴方向移动 y 像素,xy 为整数。
screen.fill(color)
显示窗口背景填充为 color 颜色,采用 RGB 色彩体系。由于壁球不断运动,运动后原有位置将默认填充白色,因此需要不断刷新背景色
screen.blit(src, dest)
将一个图像绘制在另一个图像上,即将 src
绘制到 dest 位置上。通过 Rect 对象引导对壁球的绘制。
pygame.time.Clock()
创建一个 Clock 对象,用于操作时间
clock.tick(framerate)
控制帧速度,即窗口刷新速度,例如:clock.tick(100)表示每秒钟 100 次帧刷新视频中每次展示的静态图像称为帧
键盘使用
Pygame 采用事件来对应键盘操作
获取事件将得到键盘输入
不同按键编写操作函数即可
pygame.KEYDOWN:
Pygame 对键盘敲击的事件定义,键盘每个键对应一个具体定义。
pygame.K_UP 上
pygame.K_LEFT 左
pygame.K_DOWN 下
pygame.K_RIGHT 右
更多按键属性可以参考 pygame 官方文档:
# coding: utf-8
import pygame,sys
pygame.init() #初始化 init() 及设置
size = width,height = 800,600
speed = [1,1]
BLACK = 0,0,0
screen = pygame.display.set_mode(size)
icon = pygame.image.load("image/dog01.jpg")#加载图片
pygame.display.set_icon(icon) #图标的使用
pygame.display.set_caption("你是猪") #游戏开始的首标题设置
ball = pygame.image.load("image/cat.jpg") #
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)_int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] +1 if speed[0] >0 else speed[0]-1
elif event.key == pygame.K_UP:
speed[1] = speed[1] +1 if speed[1] >0 else speed[1]-1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)_int(speed[1]/abs(speed[1]))
elif event.key == pygame.ESCAPE:
sys.exit()
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0],event.size[1]
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
if pygame.display.get_active():
ballrect = ballrect.move(speed[0], speed[1])
ballrect = ballrect.move(speed[0], speed[1])
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.update()
fclock.tick(fps) #控制刷新的时间
可以控制图片中的狗的运动
pygame 几个函数的使用
详细内容还是需要参考官方文档
pygame.display
用来控制 Pygame 游戏的屏幕,Pygame 有且只有一个屏幕,屏幕左上角坐标为(0,0),以像素为单位。
屏幕控制的需求有:
游戏全屏,游戏屏幕大小调节,屏幕的边框,更改游戏标题,更改游戏图标等
屏幕控制的重要函数
屏幕尺寸和模式
pygame.display.set_mode()
pygame.display.Info()
窗口标题和图标
pygame.display.set_caption()
pygame.display.set_icon()
pygame.display.get_caption() #图标的感知和刷新
pygame.display.get_active()
pygame.display.flip()
pygame.display.update()
pygame.display
可以采用 OpenGL 支持显示
可以采用硬件加速显示
绘制加速将带来更流畅的运行效果
pygame 事件处理
需求:
响应用户键盘、鼠标等外设操作,响应屏幕尺寸和模式变化,响应游戏情节的特定触发条件,产生一些触发条件等等
pygame.event.EventType
事件本质上是一种封装后的数据类型(对象)
EventType 是 Pygame 的一个类,表示事件类型
事件类型只有属性,没有方法
用户可自定义新的事件类型
事件处理的重要函数
处理事件
pygame.event.get()
pygame.event.poll()
pygame.event.clear() #操作事件队列
pygame.event.set_blocked()
pygame.event.get_blocked()
pygame.event.set_allowed() #生成事件
pygame.event.post()
pygame.event.Event
键盘事件及类型的使用
pygame.event.KEYDOWN 键盘按下事件
pygame.event.KEYUP 键盘释放事件
event.unicode 按键 unicode 码,不推荐
event.key 按键的常量名称
event.mod 按键修饰符的组合值
按键的常量名称:
按键的修饰符:
修饰符的按位或运算
如
event.mod = KMOD_ALT | KMOD_SHIFT
鼠标事件
pygame.event.MOUSEMOTION 鼠标移动事件
pygame.event.MOUSEBUTTONUP 鼠标键释放事件
pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件
鼠标移动事件 pygame.event.MOUSEMOTION
event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
event.rel 鼠标相对运动距离(X,Y),相对于上次事件
event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键
鼠标键释放事件 pygame.event.MOUSEBUTTONUP
event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
event.button 鼠标按下键编号 n 取值 0/1/2,分别对应三个键
鼠标键按下事件 pygame.event.MOUSEBUTTONDOWN
event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
event.button 鼠标按下键编号 n 取值为整数,左键为 1,右键为 3,设备相关
pygame 色彩机制
色彩
pygame.Color
Color 类用于表达色彩,使用 RGB 或 RGBA 色彩模式,A 可选代表透明度
Color 类可以用色彩名字、RGBA 值、HTML 色彩格式等方式定义
Color(name) 例如:Color("grey")
Color(r,g,b,a) 例如:Color(190, 190, 190, 255) #取值范围 0-255 a 代表透明度
Color(rgbvalue) 例如:Color("#BEBEBEFF")
RGB 色彩模式之外增加了第四维度:alpha 通道
alpha 通道表示不透明度,取值 0-255,默认 255
alpha 通道值越大,不透明度越高,255 表示不透明
pygame.Color.r 获得 Color 类的红色值 r
pygame.Color.g 获得 Color 类的绿色值 g
pygame.Color.b 获得 Color 类的蓝色值 b
pygame.Color.a 获得 Color 类的不透明度值 a
pygame.Color.normalize 将 RGBA 各通道值归一到 0-1 之间
图形绘制
pygame.draw
向屏幕上绘制一些简单的图形,如直线、圆形、椭圆等任何一个图形绘制后,会返回一个矩形 Rect 类表示该形状
pygame.Rect
表达一个矩形区域的类,用于存储坐标和长度信息 Pygame 利用 Rect 类来操作图形/图像等元素
四个参数 left,top,width,height
Rect 类属性,返回一个数值或一个代表坐标的元组
Rect 类提供了如下方法,用来操作 Rect 类
图形绘制 pygame.draw
矩形 pygame.draw.rect(Surface, color, Rect, width=0)
Surface 矩形的绘制屏幕
color 矩形的绘制颜色
Rect 矩形的绘制区域
width=0 绘制边缘的宽度,默认为 0,即填充图形
多边形 pygame.draw.polygon(Surface, color, pointlist, width=0)
Surface 多边形的绘制屏幕
color 多边形的绘制颜色
pointlist 多边形顶点坐标列表
width=0 绘制边缘的宽度,默认为 0,即填充图形
圆形 pygame.draw.circle(Surface, color, pos, radius, width=0)
• Surface 圆形的绘制屏幕
• color 圆形的绘制颜色
• pos 圆形的圆心坐标
• radius 圆形的半径
• width=0 绘制边缘的宽度,默认为 0,即填充图形
椭圆 pygame.draw.ellipse(Surface, color, Rect, width=0)
• Surface 椭圆形的绘制屏幕
• Color 椭圆形的绘制颜色
• Rect 椭圆形的绘制区域
• width=0 绘制边缘的宽度,默认为 0,即填充图形
椭圆弧形 pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=0)
Surface 椭圆弧形的绘制屏幕
Color 椭圆弧形的绘制颜色
Rect 椭圆弧形的绘制区域
start_angle, stop_angle 弧形绘制起始和结束弧度值
width=0 绘制边缘的宽度,默认为 0,即填充图形
直线 pygame.draw.line(Surface, color, start_pos, end_pos, width=1)
Surface 直线的绘制屏幕
Color 直线的绘制颜色
start_pos, end_pos 直线的起始和结束坐标
width=1 直线的宽度,默认值为 1
连续多线 pygame.draw.lines(Surface, color, closed, pointlist, width=1)
• Surface 连续多线的绘制屏幕
• Color 连续多线的绘制颜色
• closed 如果为 True,起止节点间自动增加封闭直线
• pointlist 连续多线的顶点坐标列表
• width=1 连续多线的宽度,默认值为 1
无锯齿线 pygame.draw.aaline(Surface, color, start_pos, end_pos, blend=1)
• Surface 无锯齿线的绘制屏幕
• Color 无锯齿线的绘制颜色
• start_pos, end_pos 无锯齿线的起始和结束坐标
• blend=1 不为 0 时,与线条所在背景颜色进行混合
连续无锯齿线 pygame.draw.aalines(Surface, color, closed, pointlist, blend=1)
• Surface 连续无锯齿线的绘制屏幕
• Color 连续无锯齿线的绘制颜色
• closed 如果为 True,起止节点间自动增加封闭直线
• pointlist 连续无锯齿线的顶点坐标列表
• blend=1 不为 0 时,与线条所在背景颜色进行混合
文字绘制
向屏幕上绘制特定字体的文字
pygame.freetype
pygame.freetype 是绘制文字的增强方法,建议使用必须额外增加 import 引用
根据字体和字号生成一个 Font 对象
用 Font 对象的方法绘制具体文字
Font 类
pygame.freetype.Font(file, size=0)
file 字体类型名称或路径
size 字体大小
Font 类的绘制方法 Font.render_to(surf, dest, text, fgcolor=None, bgcolor=None, rotation=0, size=0) ——> Rect
• surf 绘制字体的平面,Surface 对象
• dest 在平面中的具体位置,(x,y)
• text 绘制的文字内容
• fgcolor 文字颜色
• bgcolor 背景颜色
• rotation 逆时针的旋转角度,取值 0-359,部分字体可旋转
• size 文字大小,赋值该参数将覆盖 Font 中的设定值
Rect 返回一个 Rect 对象
Font.render(text, fgcolor=None, bgcolor=None,rotation=0, size=0) —> (Surface, Rect)
• text 绘制的文字内容
• fgcolor, bgcolor 字体颜色、背景颜色
• rotation 逆时针的旋转角度,取值 0-359,部分字体可旋转
• size 文字大小,赋值该参数将覆盖 Font 中的设定值
返回一个元组,包含 Surface 对象和 Rect 对象
pygame 的两个重要类型
pygame.Surface 绘图层,或绘图平面,或图层
• 用于表示图形、文字或图像的绘制效果
• 与当前屏幕主图层可以并列存在
• 如果不绘制在主图层上,则不会被显示
Pygame.Rect 矩形区域
• 对应于当前主图层的某个具体区域
• 相当于某个矩形区域的指针或标识信息
• 可以指定图层绘制在某个矩形区域中
主图层:
其它功能内容参照官方文档更加详细: