十、pygame小游戏开发

目录

  • 一、安装pygame
  • 二、pygame快速入门
    • 2.1 坐标系认识
    • 2.2 创建游戏主窗口
    • 2.3 实现图像绘制
    • 2.4 游戏循环和游戏时钟
    • 2.5 简单动画实现的实现
    • 2.6 监听事件
    • 2.7 精灵和精灵组
  • 三、游戏框架搭建
    • 3.1 实现飞机大战主游戏类
    • 3.2 完成游戏初始化部分
    • 3.3 使用常量代替固定的数值
    • 3.4 完成游戏循环部分
    • 3.5 准备游戏精灵组
  • 四、游戏背景
    • 4.1 设计背景类
  • 五、敌机出场
    • 5.1设计Enemy 类
  • 六、英雄登场
    • 6.1 设计英雄和子弹
    • 6.2 创建英雄
    • 6.3 移动英雄位置
    • 6.4 移动英雄位置的具体实现
    • 6.5 控制英雄运动边界
    • 6.6 添加发射子弹事件
    • 6.7 定义子弹类
    • 6.8 发射子弹
  • 七、碰撞检测
    • 7.1 碰撞实现
    • 7.2 添加碰撞爆炸效果
  • 八、游戏结束
  • 九、游戏重新开始

一、安装pygame

关于第三方模块的安装可以参考这里

pip install pygame

pygame 就是一个 Python 模块,专为电子游戏设计,官方网站
安装完后,通过下面命令可以验证是否成功

python3 -m pygame.examples.aliens

如果成功会看到这个界面
在这里插入图片描述

二、pygame快速入门

游戏的初始化和退出

  • 要使用 pygame 提供的所有功能之前,需要调用 init 方法
  • 在游戏结束前需要调用一下 quit 方法

在这里插入图片描述

例如:

import pygamepygame.init()print("游戏执行代码")pygame.quit()

2.1 坐标系认识

原点在左上角 (0, 0)

  • x 轴 水平方向向 右,逐渐增加
  • y 轴 垂直方向向 下,逐渐增加

在这里插入图片描述

在游戏中,所有可见的元素 都是以 矩形区域Rect 来描述位置的,要描述一个矩形区域有四个要素:

  • x : 矩形的左上角x坐标
  • y : 矩形的左上角y坐标
  • width: 矩形的宽度
  • height: 矩形的高度

pygame 专门提供了一个类 pygame.Rect 用于描述 矩形区域,pygame.Rect 是一个比较特殊的类,内部只是封装了一些数字计算,不执行 pygame.init() 方法同样能够直接使用
pygame.Rect可以使用的属性有:
在这里插入图片描述
例如:

hero_rect = pygame.Rect(0, 0, 200, 250)
print("矩形的左上角坐标 %d %d" % (hero_rect.x, hero_rect.y))
print("矩形的宽高 %d %d" % (hero_rect.width, hero_rect.height))
# size 属性会返回矩形区域的 (宽, 高) 元组
print("矩形的大小 %d %d" % hero_rect.size)
print("矩形的中心坐标 %d %d" % (hero_rect.centerx, hero_rect.centery))
# center 属性会返回矩形区域的 (centerx, centery) 元组
print("矩形的中心坐标 %d %d" % hero_rect.center)
print("矩形的四个顶角 %d %d %d %d" % (hero_rect.left, hero_rect.top, hero_rect.right, hero_rect.bottom))

输出结果:

矩形的左上角坐标 0 0
矩形的宽高 200 250
矩形的大小 200 250
矩形的中心坐标 100 125
矩形的中心坐标 100 125
矩形的四个顶角 0 0 200 250

2.2 创建游戏主窗口

pygame 专门提供了一个 模块 pygame.display 用于创建、管理 游戏窗口

  • pygame.display.set_mode(): 初始化游戏显示窗口
  • pygame.display.update(): 刷新屏幕内容显示(稍后介绍)

set_mode方法

set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
  • 参数
    • resolution 指定屏幕的 宽 和 高,默认创建的窗口大小和屏幕大小一致
    • flags 参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
    • depth 参数表示颜色的位数,默认自动匹配
  • 返回值
    • 可以理解为 游戏的屏幕,游戏的元素 都需要被绘制到 游戏的屏幕 上
      注意:必须使用变量记录 set_mode 方法的返回结果!因为后续所有的图像绘制都基于这个返回结果

创建一个480*700的游戏窗口可以这样做:

screen = pygame.display.set_mode((480, 700))

为了能够让窗口一直显示,我们需要保持程序处于运行中, 那么可以使用游戏循环来解决,所谓游戏循环 就是一个 无限循环
注意: 在创建游戏窗口代码下方,增加一个无限循环即可,游戏窗口不需要重复创建

# 创建游戏主窗口
screen = pygame.display.set_mode((480, 700))# 游戏循环
while True:pass

此外, pygame.display还可以通过set_caption方法来设置窗口的标题,例如:

pygame.display.set_caption("飞机大战游戏")

在这里插入图片描述

2.3 实现图像绘制

在游戏中,能够看到的 游戏元素 大多都是 图像,图像文件 初始是保存在磁盘上的,如果需要使用,第一步就需要被加载到内存,要在屏幕上看到某一个图像的内容,需要按照三个步骤:

  • 使用 pygame.image.load() 加载图像的数据, 传入的图片格式支持JPG、PNG、GIF等, 返回值是一个surface对象,surface对象表示所有载入的图像
  • 使用 游戏屏幕(screen) 对象,调用 blit 方法 将图像绘制到指定位置
  • 调用 pygame.display.update() 方法更新整个屏幕的显示
    在这里插入图片描述

提示:要想在屏幕上看到绘制的结果,就一定要调用 pygame.display.update() 方法

(1) 绘制游戏窗口的背景
首先需要将背景图片导入到项目工程内容,通常会建一个images文件夹用于存放资源图片

import pygamepygame.init()# 创建游戏主窗口
screen = pygame.display.set_mode((480, 700))# 1.加载图片
bg = pygame.image.load("./images/background.png")
# 2.绘制到屏幕上
screen.blit(bg, (0, 0))
# 3.更新窗口
pygame.display.update()# 游戏循环
while True:passpygame.quite()

效果图如下:
在这里插入图片描述
(2) 绘制英雄战机

'''绘制英雄战机'''
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (200, 500))
pygame.display.update()

效果图:
在这里插入图片描述
(3) 理解 update() 方法的作用

  • 可以在 screen 对象完成 所有 blit 方法之后,统一调用一次 display.update 方法,同样可以在屏幕上 看到最终的绘制结果;
  • 使用 display.set_mode() 创建的 screen 对象 是一个 内存中的屏幕数据对象,可以理解成是 画布;
  • screen.blit 方法可以在 画布 上绘制很多 图像,例如:英雄、敌机、子弹…
  • display.update() 会将 画布的最终结果 绘制在屏幕上,这样可以提高屏幕绘制效率,增加游戏的流畅度

完整示例如下:

import pygamepygame.init()# 创建游戏主窗口
screen = pygame.display.set_mode((480, 700))'''绘制背景图像'''
# 1> 加载图像
bg = pygame.image.load("./images/background.png")# 2> 绘制在屏幕
screen.blit(bg, (0, 0))'''绘制英雄图像'''
# 1> 加载图像
hero = pygame.image.load("./images/me1.png")# 2> 绘制在屏幕
screen.blit(hero, (200, 500))# 3> 更新显示 - update 方法会把之前所有绘制的结果,一次性更新到屏幕窗口上
pygame.display.update()# 游戏循环
while True:passpygame.quite()

2.4 游戏循环和游戏时钟

现在 英雄飞机 已经被绘制到屏幕上了,怎么能够让飞机移动呢 ?

(1) 游戏中的动画实现原理
跟 电影 的原理类似,游戏中的动画效果,本质上是 快速 的在屏幕上绘制 图像; 而电影是将多张 静止的电影胶片 连续、快速的播放,产生连贯的视觉效果!
一般在电脑上 每秒绘制 60 次,就能够达到非常 连续 高品质 的动画效果,每次绘制的结果被称为 帧 Frame

(2) 游戏初始化与游戏循环
游戏初始化是在游戏循环之前准备工作, 绘制的图片通常是静止的
游戏循环的作用就是保证游戏不会直接退出,变化图像位置 —— 产生动画效果

在这里插入图片描述
(3) 游戏时钟
pygame 专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度 —— 刷新帧率

  • 要使用时钟对象需要两步:
    • 在 游戏初始化 创建一个 时钟对象
    • 在 游戏循环 中让时钟对象调用 tick(帧率) 方法
  • tick 方法会根据 上次被调用的时间,自动设置 游戏循环 中的延时
# 创建游戏时钟对象
clock = pygame.time.Clock()
i = 0# 游戏循环
while True:# 设置屏幕刷新帧率, 没隔1s循环执行60次, 这样就可以控制游戏循环执行的频率了.clock.tick(60)print(i)i += 1

2.5 简单动画实现的实现

  • 在 游戏初始化 定义一个 pygame.Rect 的变量记录英雄的初始位置
  • 在 游戏循环 中每次让 英雄 的 y - 3 —— 向上移动
  • y <= 0 将英雄移动到屏幕的底部

每一次调用 update() 方法之前,需要把所有的游戏图像都重新绘制一遍, 而且应该最先重新绘制背景图像

import pygame'''游戏初始化'''
pygame.init()'''创建游戏主窗口'''
screen = pygame.display.set_mode((480, 700))'''绘制背景图像'''
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))'''绘制英雄图像'''
hero = pygame.image.load("./images/me1.png")
# 定义英雄的初始位置(水平居中)
center_x = 240 - hero.get_width() / 2
hero_rect = pygame.Rect(center_x, 500, 102, 126)'''创建游戏时钟对象'''
clock = pygame.time.Clock()'''游戏循环'''
while True:# 设置屏幕刷新帧率clock.tick(60)# 更新英雄位置,向上移动,每次移动3个像素hero_rect.y -= 3# 如果移出屏幕,则将英雄的顶部移动到屏幕底部if hero_rect.bottom <= 0:hero_rect.y = 700# 绘制背景图片screen.blit(bg, (0, 0))# 绘制英雄图像screen.blit(hero, hero_rect)# 更新显示pygame.display.update()pygame.quite()

效果图:
请添加图片描述

2.6 监听事件

事件 event就是,用户针对游戏所做的操作,例如:点击关闭按钮,点击鼠标,按下键盘…
pygame 中通过 pygame.event.get() 可以获得 用户当前所做动作 的 事件列表, 例如:

# 游戏循环
while True:# 设置屏幕刷新帧率clock.tick(60)# 事件监听fo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年DDoS攻击发展趋势的分析和推断

DDoS是一种非常“古老”的网络攻击技术&#xff0c;随着近年来地缘政治冲突对数字经济格局的影响&#xff0c;DDoS攻击数量不断创下新高&#xff0c;其攻击的规模也越来越大。日前&#xff0c;安全网站Latest Hacking News根据DDoS攻击防护服务商Link11的统计数据&#xff0c;对…

Java代码hello word

一、安装java环境 开始学习java之前&#xff0c;我们的第一步就是安装java环境&#xff0c;即常说的JDK和JRE&#xff0c;此处就不在详细介绍配置环境过程&#xff0c;可以到网上搜索java开发环境配置。 二、编写第一个程序 工具&#xff1a; 常用的java编写工具有IDE、Notep…

机器学习:随机森林

集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习方法&#xff0c;通过将多个基本学习算法的预测结果进行组合&#xff0c;以获得更好的预测性能。集成学习的基本思想是通过结合多个弱分类器或回归器的预测结果&#xff0c;来构建一个更强大的集成模…

Window Anaconda 安装pytorch 启用cuda 终究手段

1.首先你的电脑要有NVIDIA 的显卡.没有就走吧,你如果不是window &#xff0c;也走吧&#xff0c;不一定教程管用。 2.然后要明白&#xff0c;有两种CUDA版本&#xff0c;一个叫运行时api&#xff0c;一个是驱动api 2.1 运行时cuda 版本查看 &#xff08;是你跑深度学习模型或其…

Android用户登录与数据存储:从权限请求到内外部存储的完整实践【完整实践步骤、外部存储、内部存储】

步骤 1: 登录页面布局 在 MainActivity 中实现用户登录功能&#xff0c;首先创建一个布局文件 activity_main.xml 包含用户名和密码的输入字段以及登录按钮。 <!-- activity_main.xml --> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/andr…

单元测试该怎么写

单元测试对于开发人员来说很熟悉&#xff0c;各种语言都提供了单元测试的框架&#xff0c;用于自动化执行单元测试并生成测试报告。它通常提供了一组API和工具&#xff0c;使开发人员能够编写和运行测试用例&#xff0c;比较预期行为和实际行为之间的差异&#xff0c;并准确地识…

【已验证】微信小程序介绍及创建过程23.10.08

1、环境准备 开发微信⼩程序之前&#xff0c;必须要准备好相应的环境 1.1.注册账号 建议使用全新的邮箱&#xff0c;没有注册过其他小程序或者公众号的。访问注册⻚⾯&#xff0c;耐⼼完成注册即可。 1.2.获取APPID 由于登录&#xff0c;然后获取APPID 2.开发工具 下载地…

ElementUI结合Vue完成主页的CUD(增删改)表单验证

目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中&#xff0c;CU代表创建&#xff08;Create&#xff09…

设备搭建(waf、蜜罐、ids和ips)

文章目录 防火墙waf网闸蜜罐idsips 防火墙 DMZ区域叫非军事化区减&#xff0c;DMZ有web服务或者MySQL服务&#xff0c;从互联网到dmz的流量一般不拦截&#xff08;因为需要互联网用户访问web服务&#xff09;&#xff0c;如果dmz沦陷&#xff0c;攻击者想要继续横向移动到内网…

Vue中实现自定义编辑邮件发送到指定邮箱(纯前端实现)

formspree里面注册账号 注册完成后进入后台新建项目并且新建表单 这一步完成之后你将得到一个地址 最后就是在项目中请求这个地址 关键代码如下&#xff1a; submitForm() {this.fullscreenLoading true;this.$axios({method: "post",url: "https://xxxxxxx…

什么是数据库锁(Lock)?有哪些类型的锁

数据库锁&#xff08;Lock&#xff09;&#xff1a;保护数据完整性与并发性的关键 数据库锁&#xff08;Lock&#xff09;是在数据库管理系统中用于管理并发访问数据的重要机制。它们确保了多个用户或事务可以同时访问数据库&#xff0c;同时保护数据的完整性。在本文中&#…

7.wifi开发【智能家居:终】,实践总结:智能开关,智能采集温湿,智能灯。项目运行步骤与运行细节,技术归纳与提炼,项目扩展

一。项目运行步骤与运行细节 1.项目运行步骤&#xff08;一定有其他的运行方式&#xff0c;我这里只提供一种我现在使用的编译方式&#xff09; &#xff08;1&#xff09;项目运行使用软件与技术&#xff1a; 1.Virtual linux 使用这个虚拟机进行程序的编译 2.Makefile与shl…

【Navicat】win 10 / win 11:Navicat 15 安装完整教程(navicat 连接 mysql 出现 2059 报错问题解决)

目录 一、Navicat 连接 mysql 出现 2059 报错问题解决 二、Navicat 15 的下载 三、Navicat 15 的安装 四、Navicat 15 的使用 一、Navicat 连接 mysql 出现 2059 报错问题解决 之前使用的是完整版本 navicat 12&#xff0c;但是随着 MySQL 的升级&#xff0c;再连接 MySQL…

【SpringCloud】认识微服务

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 认识微服务 一、 服务架构演变1.1 单体架构…

库存管理与策略模式

库存管理是个难题&#xff0c;涉及到采购、销售、仓储、门店、网站订单各个环节&#xff0c;实物库存和系统库存很难保证完全一致&#xff0c;记得系统刚上线第一天&#xff0c;因为实物库存与导入系统的库存有差异&#xff0c;系统又做了限制系统库存必须大于0才允许销售普通订…

Spring的beanName生成器AnnotationBeanNameGenerator

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

软件设计原则 1小时系列 (C++版)

文章目录 前言基本概念 Design Principles⭐单一职责原则(SRP) Single Responsibility PrincipleCode ⭐里氏替换原则(LSP) Liskov Substitution PrincipleCode ⭐开闭原则(OCP) Open Closed PrincipleCode ⭐依赖倒置原则(DIP) Dependency Inversion PrincipleCode ⭐接口隔离…

【Oracle】Oracle系列十九--Oracle的体系结构

文章目录 往期回顾前言1. 物理结构2. 内存结构2.1 SGA2.2 后台进程 3. 逻辑结构 往期回顾 【Oracle】Oracle系列之一–Oracle数据类型 【Oracle】Oracle系列之二–Oracle数据字典 【Oracle】Oracle系列之三–Oracle字符集 【Oracle】Oracle系列之四–用户管理 【Oracle】Or…

基于springboot实现人职匹配推荐管理系统演示【项目源码+论文说明】分享

基于springboot实现人职匹配推荐管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于人职匹配推荐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了…

ADuM1250 ADuM1251 模块 I2C IIC总线2500V电磁隔离 接口保护

功能说明&#xff1a; 1&#xff0c;2500V电磁隔离&#xff0c;2通道双向I2C&#xff1b; 2&#xff0c;支持电压在3到5.5V&#xff0c;最大时钟频率可达1000KHz&#xff1b; 3&#xff0c;将该隔离模块接入总线&#xff0c;可以保护主MCU引脚&#xff0c;降低I2C总线上的干…