pygame是一个第三方包,包含了一组用于开发游戏的python模块,使用之前需要先安装pygame这个包,安装分为两种情况:
在全局环境中安装pygame
windows系统中按Win+R键再输入cmd进入命令行模式,输入命令行:
pip install pygame
如果使用的python版本在3.11之前,按照上面的方式就可以完成安装。但是我使用的是python最新版3.11,采用上面的默认安装会失败,需要强行指定安装的版本号,命令行如下:
pip install pygame==2.1.3.dev8
在pycharm虚拟环境中安装
在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()——主要用于非双缓冲,可进行局部区域的更新
pygame.display.flip()——主要用于双缓冲,也可在非双缓冲下正常工作
★注意:完成创建窗口、设置相关属性和图像绘制等所有操作后,必须调用更新窗口方法,否则窗口上不会显示预定操作的内容,通常使用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()
★重点:这段代码的重点是在循环开始之后,重新绘制背景图片,目的是将飞机图片覆盖掉,接着飞机在新位置又重新显示,循环往复,飞机就动起来了!如果没有重绘背景这一步,那么在飞机运动的横坐标上会产生无数个飞机图像。以上代码运行效果如下:
播放
00:00
进入全屏
50
点击按住可拖动视频
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这个事件,则退出程序。到这里,终于摆脱了死循环,现在是一个顺畅的动画,还不能控制飞机产生相应动作,需要进一步添加键盘监听事件及相应代码来完成控制飞机的功能。
未完,待续!在第二篇里继续完善!
DevOps实践摘要:本文以华为云软件开发平台DevCloud为例,展示飞机大战游戏开发的DevOps实践流程。
DevOps实践是一种开发、测试运维一体化的模式,其实践的外在表现一般包括了如代码仓库、构建、测试、发布、配置、监控等工具形成的一个完整的工具链或者说开发平台,以华为云软件开发平台DevCloud为例,展示飞机大战游戏开发的DevOps实践流程。
实践手册下载>>>
提交实践结果赢奖品>>>
实验介绍项目名称:飞机大战游戏
项目简介:一个用 Cocos Creator 开发的 Web 游戏,可以进行飞机大战。
开发语言:JavaScript(49.3%)、CSS(36.6%)、Html(14%)
部署环境:CentOS 7.6 64bit for Kai1s +jdk1.8
涉及云服务:华为云 DevCloud、华为云弹性云服务器 ECS
操作流程操作步骤创建私有云步骤1:在华为云服务列表找到“服务列表”,进入华为云“虚拟私有云VPC”,创建虚拟私有云,配置虚拟私有云名称和子网名称,其他默认配置,点击立即创建;
步骤2:创建安全组并添加规则
创建安全组
名称:sg-plane
企业:default
模板:通用Web服务器
描述:无
添加规则:添加入向规则
优先级:1协议端口:TCP输入:8080
创建项目在华为云官网产品列表中,前往“软件开发平台DevCloud”的管理控制台,新建项目;
项目流程:看板
项目名称:自定义
创建代码仓库进入代码->代码托管,导入外部仓库:
源仓库地址:https://codehub.devcloud.cn-north4.huaweicloud.com/yxdmmsymbgl00001/planeGame.git
源仓库访问权限:不需要用户名/密码
勾选“我已阅读并同意 《隐私政策声明》 和 《软件开发服务使用声明》”
点击“下一步”按钮
自定义代码仓库名称
其他默认值,最后确认
新建编译构建任务在“构建&制品”中选择“编译构建”后,新建任务:
步骤1:选择Shell模板,在命令行中输入zip -qr WebGames.zip ./
步骤2:在Shell下方增加“上传软件包到软件发布库”
构建包路径:WebGames.zip发布版本号:1.0.0包名:WebGames
步骤3:新建并执行
新建部署任务步骤1:进入“控制台”选择“服务列表”购买弹性云服务器ECS,并进行配置;
计费模式:按需收费
区域:华北-北京四
可用区:随机分配
CPU 架构:鲲鹏计算
规格:kai1s.xlarge.1(4 核 4G)
镜像:CentOS 7.6 64bit for Kai1s(40GB)
网络:选择本实验创建的虚拟私有云
安全组:选择本实验创建的安全组
云服务器名称:自定义(如:ecs-plane-kunpeng)
密码:自定义
步骤2:进入华为云DevCloud控制台,选择“部署”->“主机管理”;
添加主机组,输入主机名,选择linux操作系统,点击保存;
添加主机;
输入自定义主机名称,如planewar
IP(云服务弹性公网IP)
认证方式:密码
用户名:root
密码:自己云服务器ECS的密码
ssh端口:22
勾选我已阅读…,点击添加
添加成功后,显示验证成功。
步骤3:重新进入部署服务,新建任务,选择Tomcat应用部署模板
点击“选择部署来源”下方的加号,添加“解压文件”,配置:
压缩文件路径:${download_path}/WebGames.zip,解压目录:${download_path}/WebGames;
“参数设置”页中,将以下参数进行修改,其余参数保持默认不变
${host_group}:ecs_group_planewar(即本实验中创建的主机组)
${package_url}:/WebGames/1.0.0/WebGames.zip
Service_port:8080
步骤4:访问应用
释放云资源本实验需要释放的资源有:弹性云服务器ECS、虚拟私有云和安全组。
步骤1:前往“弹性云服务器ECS”管理控制台,释放资源;
步骤2:前往“虚拟私有云 VPC”管理控制台,先删除所有子网,再删除虚拟私有云;
步骤3:进入“访问控制”中的安全组,删除需要删除的安全组。