目录
pygame的安装:以管理员身份运行cmd(Windows 操作系统中的命令提示符),执行 pip install pygame,pygame就自动安装好了;
pygame的安装检测:cmd中执行python ‐m pygame.examples.alien,若出现一个小游戏,则说明pygame安装成功啦!
pygame.display.set_mode((600,400)):
pygame.display.set_caption("Pygame游戏之旅"):
pygame.display.flip()与pygame.display.uplate()的区别:
一、Pygame最小开发框架
1.Pygame介绍:
Pygame是一个开源的Python模块,专门用于开发2D游戏和多媒体应用程序。它基于Simple DirectMedia Layer(SDL)库,并提供了一系列功能,使得使用Python语言进行游戏开发变得简单和直观。Pygame的设计目标是提供一个跨平台的框架,使得开发者可以在不同的操作系统上运行他们的游戏,而无需担心底层的系统差异。
2.Pygame的安装:
以管理员身份运行cmd(Windows 操作系统中的命令提示符),执行 pip install pygame,pygame就自动安装好了;
3.Pygame的安装检测:
cmd中执行python ‐m pygame.examples.alien,若出现一个小游戏,则说明pygame安装成功啦!
4.Pygame的最小开发框架:
5.最小程序:
# Unit PYG02: Pygame Hello World Game
import pygame,sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame游戏之旅")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()
二、最小程序框架代码的解释
1.import pygame,sys:
sys,pygame是Python的标准库,提供Python运行时环境变量的操控;sys.exit()用于退出结束游戏并退出;
2.pygame.init():
是 Pygame 模块中的一个函数,用于初始化 Pygame 模块,在使用 Pygame 的任何功能之前,必须先调用 pygame.init()
函数来初始化 Pygame 的各种功能模块及变量,如事件处理、图像、声音等。
3.pygame.display.set_mode((600,400)):
a.是 Pygame 模块中的一个函数,用于创建一个新的显示窗口或屏幕,以便在其中绘制图形和处理事件; b.这个函数返回一个 Surface
对象,代表了创建的窗口或屏幕,你可以在这个 Surface
上绘制图形和文本; c. 函数接受一个参数,即一个表示窗口大小的元组。这个元组包含两个整数,分别代表窗口的宽度和高度; d.此外,这个函数还可以接受一些可选的参数,用于指定窗口的其他属性,如窗口的标题、是否全屏显示、是否可调整大小等。
4.pygame.display.set_caption("Pygame游戏之旅"):
a.是 Pygame 模块中的一个函数,用于设 置 Pygame 窗口的标题。当你调用这个函数时,它会更改窗口的标题栏中显示的文本; b.这个函数通常在创建窗口后调用,以设置窗口的名称或标题; c.它接受一个字符串参数,该字符串将作为窗口的标题显示; d.函数通常在程序的开始部分调用,以便在用户看到窗口之前设置好标题。这样,用户就可以清楚地知道他们正在运行的是哪个程序。
5.pygame.enent.get():
是 Pygame 模块中的一个函数,从Pygame的事件队列中取出事件,并从队列中删除该事件。事件可以是多种类型,例如按键事件、鼠标事件、窗口事件等。每个事件都有自己的属性和方法,用于描述事件的类型和相关信息。
6.event.type:
event.type
是一个属性,它表示事件的类型。当你从 Pygame 的事件队列中获取一个事件时,event.type
可以用来确定该事件的类型。Pygame 支持多种类型的事件,每种事件类型都有其特定的用途和属性。
7.pygame.QUIT:
是 Pygame 模块中定义的一个事件类型常量,它代表了用户请求退出程序的事件。当用户关闭窗口或点击窗口的关闭按钮时,Pygame 会生成一个 pygame.QUIT 事件,并将其放入事件队列中。在 Pygame 程序中,通常需要在主循环中检查 pygame.QUIT
事件,以便在用户请求退出时能够正确地响应。如果检测到 pygame.QUIT
事件,程序应该执行清理工作并退出。
8.pygame.display.flip()与pygame.display.uplate()的区别:
在 Pygame中 pygame.display.flip() 和 pygame.display.update() 都用于更新屏幕显示,但它们的行为有所不同:
9.pygame.display.flip():
a.pygame.display.flip() 会更新整个屏幕的内容,包括所有已经绘制的图形和图像。它会告诉 Pygame 显示卡将双缓冲区的内容复制到屏幕上,这通常会导致屏幕内容的刷新。
b.flip() 通常用于双缓冲场景,以避免屏幕闪烁和撕裂现象。
c.flip() 会等待直到所有屏幕内容都更新完毕,这可能会导致一些延迟。
10.pygame.display.update():
a.pygame.display.update() 用于更新屏幕上的一部分区域,而不是整个屏幕。它允许你指定一个矩形区域,只有这个区域内的内容会被更新。
b.update() 通常用于单缓冲场景,或者当你只想更新屏幕上的特定部分时。
c.update() 不会等待屏幕内容更新完毕,因此它通常比 flip() 更快,但可能不会提供双缓冲的全部好处。
在大多数情况下,如果你正在使用双缓冲来避免屏幕闪烁,你会使用 pygame.display.flip()。如果你需要更精细地控制屏幕更新,例如只更新屏幕上变化的部分,你可以使用pygame.display.update()。
三、Pygame屏幕绘制机制
1.屏幕控制
pygame.display用来控制pygame游戏的屏幕,pygame有且只有一个屏幕,屏幕左上角坐标为(0,0),向右为x轴正方向,向下为y轴正方向,以像素为单位.
2.屏幕控制需求
(1).屏幕模式:全屏、屏幕大小可调节、无边框.
(2).更改游戏标题栏内容
(3).更改游戏图标
3.屏幕控制的重要函数
(1).屏幕尺寸和模式:pygame.display.set_mode()和pygame.display.Info()
(2).窗口标题和图标:pygame.display.set_caption()、pygame.display.set_icon()、pygame.display.get_caption()
(3).窗口感知和刷新:pygame.display.get_active()、pygame.display.flip()、pygame.display.update()
1.pygame.display.set_mode(size,flags):
size是游戏屏幕的分辨率,采用(width, height)方式输入
flags用来控制显示类型,可用|组合使用,常用显示标签如下:
† pygame.RESIZABLE 窗口大小可调
† pygame.NOFRAME 窗口没有边界显示
† pygame.FULLSCREEN 窗口全屏显示
注意:每种显示方式要配合相应的处理机制
2.pygame.display.Info():
产生一个显示信息对象VideoInfo,表达当前屏幕的参数信息
在.set _ mode()之前调用,则显示当前系统显示参数信息
参数很多,其中有两个十分重要,如下:
† current _ w:当前显示模式或窗口的像素宽度
† current _ h:当前显示模式或窗口的像素高度
3.pygame.VIDEORESIZE
这是一种窗口大小更改的事件
事件发生后,返回event.size元组,包含新窗口的宽度和高度
size[0] 宽度,也可以用event.w
size[1] 高度,也可以用event.h
返回参数仅在事件发生时有用
4.pygame.display.set_caption(title,icontitle)
title设置窗口的标题内容(与窗口图标区别)
icontitle设置图表化后的小标题,小标题可选,部分系统没有
5.pygame.display.get_caption()
返回当前设置窗口的标题及小标题内容
返回结构为(title, icontitle)
该函数与游戏交互逻辑配合,可以根据游戏情节修改标题内容
6.pygame.display.set_icon(surface)
设置窗口的图标效果
图标是一个Surface对象
下载:icon=pygame.image.load("图片路径")
7.pygame.display.get_active()
该函数可以用来判断是否游戏窗口被最小化
窗口在系统中显示(屏幕绘制/非图标化)时返回True,否则返回False
进一步,判断后可以暂停游戏,改变响应模式等
8.pygame.display.flip()
重新绘制整个窗口
9.pygame.display.update()
仅重新绘制窗口中有变化的区域,相比flip()执行更快
四、Pygame事件处理机制
1.Pygame事件处理机制简介
a.事件处理需求:
响应用户键盘、鼠标等外设操作
响应屏幕尺寸和模式变化
响应游戏情节的特定触发条件
产生一些触发条件等
b.Pygame事件队列
用户对事件逐一处理,队列缓存并且派发所有事件,原则上先到先处理.
c.Pygame事件
pygame.event.EventType
• 事件本质上是一种封装后的数据类型(对象)
• EventType是Pygame的一个类,表示事件类型
• 事件类型只有属性,没有方法
• 用户可自定义新的事件类型
各种事件类型及属性:
2.Pygame事件处理的重要函数
处理事件函数:
pygame.event.get()
从事件队列中获得事件列表,即获得所有被队列的事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#可以增加参数,获得某类或某些类事件:
pygame.event.get(type)
pygame.event.get(typelist)
pygame.event.poll()
• 从事件队列中获得一个事件
While True:
event = pygame.event.poll()
• 事件获取将从事件队列中删除
• 如果事件队列为空,则返回 event.NOEVENT
pygame.event.clear()
• 从事件队列中删除事件,默认删除所有事件
• 该函数与pygame.event.get()类似,区别仅是不对事件进行处理
• 可以增加参数,删除某类或某些类事件:
pygame.event.clear(type)
pygame.event.clear(typelist)
操作事件队列:
pygame.event.set_blocked()
控制哪些类型事件不允许被保存到事件队列中
pygame.event.get_blocked()
• 测试某个事件类型是否被事件队列所禁止
• 如果事件类型被禁止,则返回True,否则返回False
pygame.event.set_allowed()
控制哪些类型事件允许被保存到事件队列中
生成事件:
pygame.event.post()
• 产生一个事件,并将其放入事件队列
• 一般用于放置用户自定义事件(pygame.USEREVENT)
• 也可以用于放置系统定义事件(如鼠标或键盘等),给定参数
pygame.event.Event()
• 创建一个给定类型的事件
• 其中,事件的属性和值采用字典类型复制,属性名采用字符串形式
• 如果创建已有事件,属性需要一致
3.键盘事件及类型的使用
键盘事件及属性:
键盘按下事件:pygame.event.KEYDOWN
属性:event.unicode 按键的unicode码,与平台有关,不推荐使用.
event.key 按键的常量名称
event.mod 按键修饰符的组合值
键盘释放事件:pygame.event.KEYUP
属性:event.key 按键的常量名称
event.mod 按键修饰符的组合值
event.mod:
修饰符的按位或运算 event.mod=KMOD_ALT | KMOD_SHIFT
按键的常量名称:
按键的修饰符:
鼠标事件及类型的使用
鼠标类型及属性:
鼠标移动事件: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色彩与绘图机制
1.Pygame色彩机制
pygame.Color
Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选(透明度),Color类可以用色彩名字、RGBA值、HTML色彩格式等方式定义
Color(name) 例如:Color("grey")
Color(r,g,b,a) 例如:Color(190, 190, 190, 255)
Color(rgbvalue) 例如:Color("#BEBEBEFF")
RGB色彩模式
• 红绿蓝三个通道颜色组合
• 覆盖视力所能感知的所有颜色
• RGB取值范围0-255
RGBA色彩模式
• RGB色彩模式之外增加了第四维度:alpha通道
• alpha通道表示不透明度,取值0-255,默认255
• alpha通道值越大,不透明度越高,255表示不透明
pygame.Color类
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之间
2.图形绘制机制
pygame.draw
向屏幕上绘制一些简单的图形,如直线、圆形、椭圆等任何一个图形绘制后,会返回一个矩形Rect类表示该形状圆形绘制后,用Rect类表示
Rect类(pygame.Rect)
表达一个矩形区域的类,用于存储坐标和长度信息
Pygame利用Rect类来操作图形/图像等元素
四个参数如下:
left, top, width, height(矩形左上角点坐标为(left,top))
Rect类提供了很多属性和方法
pygame.draw
.rect() 矩形 .line() 直线 .polygon() 多边形 .lines() 连续多线 .circle() 圆形
.aaline() 无锯齿线 .ellipse() 椭圆形 .aalines() 连续无锯齿线 .arc() 椭圆弧形
矩形绘制
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时,与线条所在背景颜色进行混合
3.文字绘制机制
pygame.freetype,向屏幕上绘制特定字体的文字文字不能直接print() ,而是用像素根据字体点阵图绘制,pygame.freetype是绘制文字的增强方法,建议使用必须额外增加import引用,即import pygame.freetype
系统中的字体:Windows系统 C:\Windows\Fonts
字体文件的扩展名*.ttf *.ttc
pygame.freetype.Font():根据字体和字号生成一个Font对象
Font.render_to()、Font.render():用Font对象的render*方法绘制具体文字
Font类: pygame.freetype.Font(file, size=0)
• file 字体类型名称或路径
• size 字体的大小
Font类的绘制方法:
(1)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对象
(2)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
矩形区域
• 对应于当前主图层的某个具体区域
• 相当于某个矩形区域的指针或标识信息
• 可以指定图层绘制在某个矩形区域中
主图层
由pygame.display.set_mode()生成的Surface对象
size = width, height = 600, 400
screen = pygame.display.set_mode(size)
在主图层上绘制其他图层使用.blit()方法
screen.blit(ball(即pygame.Surface), ballrect(即pygame.Rect))