pygame是一个第三方包,包含了一组用于开发游戏的python模块,使用之前需要先安装pygame这个包,安装分为两种情况:
windows系统中按Win R键再输入cmd进入命令行模式,输入命令行:
pip install pygame
如果使用的python版本在3.11之前,按照上面的方式就可以完成安装。但是我使用的是python最新版3.11,采用上面的默认安装会失败,需要强行指定安装的版本号,命令行如下:
pip install pygame==2.1.3.dev8
在pycharm中依次点击File--settings...--你的项目名称--Python Interpreter,右侧窗口中会显示你的项目的虚拟环境中安装的所有包,点页面中的“ ”,在弹出窗口左上角搜索框输入pygame,默认安装版本是2.1.2,选中右下角Specify version选项,默认指定2.1.3.dev8,最后点Install即可成功安装。
pycharm中安装pygame界面
1、init方法
用来对pygame的所有元素进行初始化,使用pygame创建游戏窗口必须首先调用init方法。
格式:pygame.init()
2、quit
用来退出pygame图形模式,一般跟init配套使用,在程序结束之前必须调用quit方法。
格式:pygame.quit()
3、Rect类
用来创建矩形区域对象,该对象拥有位置坐标、宽高尺寸等属性,可以方便地控制其里面图像的显示位置和大小等因素。
格式:pygame.Rect(left,top,width,height)
pygame.Rect((left,top),(width,height))
本着由浅入深的原则,也是为了便于理解吸收,在这里只介绍这几个必须用到的方法。
pygame模块概览:
模 块 | 作 用 |
cdrom | 管理cdrom设备和音频播放 |
cursors | 加载光标形状 |
display | 管理显示窗口 |
draw | 绘制图形(点、线、形状) |
event | 管理鼠标和键盘等产生的事件 |
font | 加载字体 |
image | 加载和保存图像 |
joystick | 管理游戏手柄装置 |
key | 管理键盘行为 |
mouse | 管理鼠标行为 |
movie | mpeg电影播放 |
sndarray | 数字处理声音 |
surfarray | 数字处理声音 |
time | 控制时间 |
transform | 变换图像(缩放、旋转和翻转) |
这里介绍几个常用模块的用法,如下:
1、display模块
该模块的作用是管理显示窗口,用来创建窗口、设置窗口标题、更新窗口显示内容和图像绘制等,是pygame里最重要的模块。
格式:screen = pygame.display.set_mode(size=(width,height),flags=0,depth=0)
size代表创建窗口的尺寸(宽和高),元组类型;flags是标志位,depth是颜色位深,目前用不到,暂不介绍。
★ 创建的窗口有一个重要方法,就是绘制图像blit方法,简单格式如下:
格式:screen.blit(图片对象,(left,top))
格式:pygame.display.set_caption(title)
格式:pygame.display.update()——主要用于非双缓冲,可进行局部区域的更新
★注意:完成创建窗口、设置相关属性和图像绘制等所有操作后,必须调用更新窗口方法,否则窗口上不会显示预定操作的内容,通常使用update方法来更新窗口内容。为了减少内存占用和节省代码,通常先把所有窗口及图像操作的代码写完后,在最后写一行更新窗口语句。
2、image模块
image模块用来加载和保存图片,主要是将需要用到的图片加载到内存中以备后面使用。
格式:image对象 = pygame.image.load(图片地址)
3、time模块
time模块里有一个重要的类就是Clock时钟类,用来创建一个时钟对象,时钟对象用来调整窗口画面显示的帧率,即刷新率。
格式:clock = pygame.time.Clock()
★ 通常游戏的帧率可以设置为60,即每秒刷新60次,让游戏画面看起来更加顺畅
格式:clock.tick(60)
4、event模块
event模块用来监听鼠标和键盘操作,这是游戏里人机交互的重要手段。
格式:pygame.event.get()
上面语句是用来得到所有监听来的事件,结果是一个列表,可以通过遍历事件列表来完成相关操作。
上面已经简要介绍了pygame的基本情况,现在开始使用pygame的模块和方法构建游戏框架,并逐步增添内容和功能,看看最后能够实现怎样的效果。
1、创建窗口及主要元素
import pygame
# 初始化pygame图形模式
pygame.init()
# 使用display模块创建游戏窗口,窗口尺寸为470*758
screen = pygame.display.set_mode((470, 758))
# 设置窗口标题
pygame.display.set_caption('飞机大战V1.0')
# 使用image模块的load方法加载背景图片到内层中
bg = pygame.image.load(r'images\background.jpg')
# 加载飞机图片到内层中
plane = pygame.image.load(r'images\plane.png')
# 在游戏窗口坐标为(0,0)即左上角处开始绘制背景图片
screen.blit(bg, (0, 0))
# 在游戏窗口坐标为(177,600)处绘制飞机图片
screen.blit(plane, (177, 600))
# 使用display模块的update方法更新图形窗口
pygame.display.update()
# 设置无限循环,否则程序顺序执行完毕,窗口画面一闪而过
while True:
pass
# 退出pygame图形模式
pygame.quit()
以上代码都是介绍过的pygame的基本方法和模块,为了便于观看,这里暂时使用了无限循环语句,避免程序瞬间执行完毕。
另外要事先准备好所需要的图片素材,例如背景图片、己方飞机图片和敌方飞机图片等等。除了背景图片之外,其余所有图片基本上都要求是png格式的背景透明图片,需要自己制作,素材图片放置在项目目录下的images文件夹中。
这段代码构建了飞机大战游戏界面的雏形,如果不添加绘制背景图片和飞机图片的那几行代码,创建的将是一个470*758的黑屏窗口,这也是使用pygame模块创建图形界面的基本流程。下面看一下运行效果:
2、让飞机动起来
为了更方便地控制飞机图片的显示位置,下面使用pygame的Rect类创建一个矩形区域对象,让飞机图片绘制在这个矩形区域内,然后通过不断更改矩形区域对象坐标的办法,让飞机图片形成移动的动画效果。同时,为了让这种动画效果看起来更顺畅,我们采用pygame.time模块里的Clock类创建一个时钟,用来控制动画帧率。代码如下:
import pygame
# 初始化pygame图形模式
pygame.init()
# ★★★注意这里创建了时钟对象★★★
# 创建一个时钟对象,用来控制游戏屏幕刷新率,也就是帧率
clock = pygame.time.Clock()
# 使用display模块创建游戏窗口,窗口尺寸为470*758
screen = pygame.display.set_mode((470, 758))
# 设置窗口标题
pygame.display.set_caption('飞机大战V1.0')
# 使用image模块的load方法加载背景图片到内层中
bg = pygame.image.load(r'images\background.jpg')
# 加载飞机图片到内层中
plane = pygame.image.load(r'images\plane.png')
# 在游戏窗口坐标为(0,0)即左上角处开始绘制背景图片
screen.blit(bg, (0, 0))
# ★★★这里创建了矩形区域对象★★★
# 创建矩形区域对象,用来显示己方飞机图片
plane_rect = pygame.Rect(177, 600, 112, 111)
# 设置移动步长
step = 2
while True:
# ★★★这里设置了时钟频率,即动画帧率★★★
# 设置时钟帧率为60,即每秒钟执行60次
clock.tick(60)
# 重新绘制背景图片,目的是覆盖一下游戏屏幕,将图片移动位置后的原有影像清除
screen.blit(bg, (0, 0))
# 让矩形区域的横坐标减去步长,循环改变位置
plane_rect.x -= step
# 如果飞机移动到了最左边或者最右边,给步长取反,从而改变飞机移动方向
if plane_rect.x <= 0 or plane_rect.x >= (470-112):
step = -step
# 将飞机图片绘制到矩形区域中
screen.blit(plane, plane_rect)
# 所有图片元素都更改完毕后,更新显示窗口
pygame.display.update()
# 退出pygame图形模式
pygame.quit()
★重点:这段代码的重点是在循环开始之后,重新绘制背景图片,目的是将飞机图片覆盖掉,接着飞机在新位置又重新显示,循环往复,飞机就动起来了!如果没有重绘背景这一步,那么在飞机运动的横坐标上会产生无数个飞机图像。以上代码运行效果如下:
3、增加关闭窗口功能
以上代码运行时是一个死循环,因为没有关闭程序的操作,下面使用pygame的event模块来获取程序运行过程中产生的所有事件,然后遍历事件列表,通过判断鼠标点击关闭按钮事件来关闭窗口,结束程序运行。添加的事件检测部分代码如下:
# 获取全部事件,并遍历判断,如果是点击退出按钮事件,则执行退出操作
for event in pygame.event.get():
if event.type == pygame.QUIT:
print('退出游戏...')
# 退出pygame图形模式
pygame.quit()
# 这里使用exit直接退出程序,而不使用break中断循环
# 可能因为有时钟的关系,使用break中断循环后,还会再执行一次绘图操作,
# 但上面已经退出了pygame图形模式,所以会有一个报错
exit()
以上代码中,使用pygame.event.get()这个语句获取事件列表,然后使用for循环进行遍历,如果有pygame.QUIT这个事件,则退出程序。到这里,终于摆脱了死循环,现在是一个顺畅的动画,还不能控制飞机产生相应动作,需要进一步添加键盘监听事件及相应代码来完成控制飞机的功能。
未完,待续!在第二篇里继续完善!
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved