文章目录
概述
pygame 是为开发2D游戏而设计的Python跨平台模块,该模块中定义了很多接口,开发人员使用这些接口可以方便时间游戏开发的常用功能。例如,图形和图像绘制,播放音频等。
提示:以下是本篇文章正文内容,下面案例可供参考
1. pygame的初始化和退出
在使用Pygame开发游戏或图形界面应用时,初始化和退出是整个程序生命周期中非常关键的两个步骤。其初始化和退出的函数为:
函数 | 作用 |
---|---|
init() | 一次性初始化pygame的所有模块,故开发程序时开发人员无须单独调用,每个子模块的初始化方法,可以直接使用子模块 |
quit() | 卸载之前被初始化的所有pygame模块,在python程序退出前,解释器会释放所有模块,quit()函数并非必须调用,但程序开发秉持谁申请,谁释放的原则,因此程序开发人员应当在需要时主动调用quit()函数卸载所有模块资源 |
代码示例:
import pygame
def main():
# 初始化Pygame所有模块
pygame.init()
# 这一步骤会加载所有必要的系统资源,
# 包括音频、视频、事件处理等支持,确保后续能正常使用Pygame的功能。
# ... 其他游戏相关的设置和循环代码 ...
# 游戏主循环结束后,进行资源清理
pygame.quit()
# 可选地,如果你希望彻底清理Pygame的所有资源,还可以调用以下命令
# pygame.display.quit() # 关闭显示部分,不卸载所有模块
# sys.exit() # 强制退出整个程序,但这不是必需的,因为程序结束时Python会自动清理资源
# 调用main函数启动程序
if __name__ == "__main__":
main()
2. 创建游戏窗口
由于命令行窗口中无法绘制图形,若要开发带有图形界面的游戏,程序应先创建一个图形界面窗口,pygame通过displag子模块创建图形界面窗口。常见的函数有:
函数 | 作用 |
---|---|
set_mode() | 初始化游戏窗口 |
set_capyion() | 设置窗口标题 |
update() | 更新屏幕显示内容 |
(1)set_mode()
语法:
set_mode(resolution=(0,0),flages=0,depth=0)->Surface
参数 | 解释 |
---|---|
resolution | 以元组的形式储存,主要指窗口的分辨率,指定图形窗口的宽和高,单位为像素。 |
flages | 标志位,用于设置窗口特性,默认为0 |
depth | 色深,该参数只取整,取值范围为[8,32] |
(2)set_capyion()
set_capyion(title,icontitle=None) ->None
参数 | 解释 |
---|---|
title | 字符类型 |
icontitle | 设置显示在任务栏上的程序标题,一般默认为None,与title一致 |
(3)update()
用于刷新窗口,以显示修改后的新窗口。
代码示例:
# 导入模块
import pygame
# 定义窗口高度和宽度、颜色
WIN_WIDTH = 658
WIN_HEIGHT = 243
BG_COLOR = (125,125,0)
def main():
# 初始化模块
pygame.init()
# 创建窗体,即创建Surface
WINSET=pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
# 为窗口填充背景色
WINSET.fill(BG_COLOR)
# 设置窗口标题
pygame.display.set_caption('小游戏')
# 刷新窗口
pygame.display.update()
# 卸载所有模块
pygame.quit()
if __name__ =='__main__':
main()
3. 游戏循坏与游戏时钟
游戏启动一般时由玩家手动关闭,但目前的程序在开启图形窗口并设置标题后便退出,这是因为程序已经执行完毕,若要使游戏继续执行,需要在程序中添加一个无限循环。
在pygame.display.update()之后添加循环代码,程序会一直保持执行。一般情况下,计算机上1s绘制60帧便能够达到非常连续,高品质的动画效果。换句话说,就是窗口刷新图像的频率只要不低于每秒60帧。过高意味着超高的负荷,为了降低循环执行频率,需要在程序设置时间钟(游戏时间钟)。
代码示例:
# 导入模块
import pygame
# 定义窗口高度和宽度、颜色
WIN_WIDTH = 658
WIN_HEIGHT = 243
BG_COLOR = (125,125,0)
FPS=60
def main():
# 初始化模块
pygame.init()
# 创建窗体,即创建Surface
WINSET=pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
# 为窗口填充背景色
WINSET.fill(BG_COLOR)
# 设置窗口标题
pygame.display.set_caption('小游戏')
# 设置游戏时间钟,创建Colock对象
FPSCOLOCK = pygame.time.Clock()
# 刷新窗口
pygame.display.update()
# 利用无线循环
i=0
while True:
i=i+1
print(i)
# 控制帧率
FPSCOLOCK.tick(FPS)
# 卸载所有模块
pygame.quit()
if __name__ =='__main__':
main()
注意:这是一个死循环代码
4. 图形和文本绘制
图形化窗口时绘制文本和图形的前提,创建窗口后便可在其中绘制文本、图形等元素。
(1)图形绘制
- 加载图片
将图片读取到程序中,该步骤需要使用pygame库中的image模块的load()函数。语法如下:
load(filename) ->Surface
参数 | 解释 |
---|---|
filename | 待加载图片的文件名 |
- 绘制图片
绘制图片本质上时将一个Surface对象叠加在另一个Surface对象上,这种不同尺寸的叠加可以通过blit()函数完成,语法如下:
blit(source,dest,area=None,special_flags=0) -> Rect
参数 | 解释 |
---|---|
source | 接收被绘制的Surface对象 |
dest | 接收一个表示位置的元组,该元组指定left和top2个值,left和top分别表示图片距离窗口左边和顶部的距离,可接收一个表示矩形的元组(left,top,width,height)(left和top表示矩形位置,width和height表示矩形宽高) |
area | 可选参数,用于设置矩形区域 |
special_flags | 标志位 |
(2)文本绘制
pygame的font模块提供了一个Font类,使用该类可以创建系统字体对象,进而实现游戏窗口中文字的绘制。
- 创建字体对象
调用font模块的Font()函数可以创建一个字体对象,Font()函数语法如下:
Font(filename,size) ->Font
参数 | 解释 |
---|---|
filename | 设置字体对象的字体(字体的位置路径) |
size | 设置字体对象的大小 |
拓展
:
也可以通过font模块中的SysFont()函数创建一个系统字体对象。SysFont()函数语法如下:
SysFont(name,size,bold=False,italic=False) ->Font
参数 | 解释 |
---|---|
name | 系统字体名称,可通过pygame.font.get_fonts() 函数获取当前操作系统所有的字体列表 |
size | 字体大小 |
bold | 是否设置为粗体,默认为Flase,表示不设置 |
italic | 是否设置为斜体,默认为Flase,表示不设置 |
- 渲染文本内容
渲染是计算机绘图中使用的名词,经渲染后计算机中会生成一张图像(SurFace对象)。渲染的函数render()语法如下:
render(text,antialias,color,background=None) ->Surface
参数 | 解释 |
---|---|
text | 文字内容 |
antialias | 是否抗锯齿(抗锯齿会让文字看起来更平滑) |
color | 文字颜色 |
background | 背景颜色 |
- 绘制渲染到游戏主窗口
绘制文本图片同样使用Surface的blit()方法。
代码示例:
# 导入模块
import pygame,time
# 定义窗口高度和宽度、颜色
WIN_WIDTH = 658
WIN_HEIGHT = 243
# 设置颜色变量
BG_COLOR = (125,125,0)
MS_COLOR=(95,200,255)
MSGBG_COLOR=(23,78,20)
FPS=60
def main():
# 初始化模块
pygame.init()
# 创建窗体,即创建Surface
WINSET=pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
# 为窗口填充背景色
WINSET.fill(BG_COLOR)
# 设置窗口标题
pygame.display.set_caption('小游戏')
# 加载图片
image=pygame.image.load('D:/Software/pycharm/网页请求/小游戏/image/wallhaven-j5mj3w_1920x1080.png')
# 绘制图片
WINSET.blit(image,(0,0))
# 创建字体对象
BASICFONT=pygame.font.Font("D:/Software/字体/思源黑体/字体文件/SourceHanSansCN-Bold.otf",25)
# 渲染字体
msg_surf=BASICFONT.render('初始化…',True,MS_COLOR,MSGBG_COLOR)
# 绘制渲染到游戏窗口
WINSET.blit(msg_surf,(0,0))
# 设置游戏时间钟,创建Colock对象
FPSCOLOCK = pygame.time.Clock()
# 刷新窗口
pygame.display.update()
# 睡眠十秒
time.sleep(10)
# 利用无线循环
i=0
while True:
i=i+1
print(i)
# 控制帧率
FPSCOLOCK.tick(FPS)
# 卸载所有模块
pygame.quit()
if __name__ =='__main__':
main()
5. 元素位置控制
前文绘制的图像和文本都在(0,0)位置,也就是图形窗口的原点。但游戏中的文字和图片可能出现在窗口的任意位置,若想要准确地放置图片和文本,需要先掌握pygame图形窗口的坐标体系和pygame的Rect类等知识。
(1)pygame图形窗口的坐标体系
定义如下:
- 坐标原点在游戏窗口的左上角
- x轴与水平方向平行,以向右为正
- y轴与垂直方向平行,以向下为正
(2)Rect类
用于描述和控制可见对象(文本、图片等)在pygame窗口中的位置显示
类的构造方法如下
__init__(x,y,width,height) ->Rect
6. 动态效果
大多数游戏都涉及动态效果;实现动态效果的原理是文本或者图片的更换,位置的改变和屏幕的刷新。基础的动态效果分为:
- 多次修改Surface对象绘制的位置并连续绘制、刷新 ,实现移动效果
- 在同一位置绘制不同的Surface对象,实现动画效果。
- 连续绘制不同Surface对象的同时,修改绘制的位置,实现移动的动画
总结
本次章节是为初学者了解pygame模块提供的,为了更有效的学习pygame内容,我也是为此总结了一章节,制作小游戏的七大重要步骤,在此我只做出了前六步解释,最后一步是 : 事件与事件处理
下期为最后一步做出详细解释以及拓展小游戏案例
谢谢大家的支持!🌈🌈