十、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,一经查实,立即删除!

相关文章

vba智能办公

VBA是Visual Basic for Applications的缩写&#xff0c;是一种用于Microsoft Office应用程序的编程语言。它提供了许多方便的工具和功能&#xff0c;可以帮助我们自动化任务、增强数据处理和分析能力、提高工作效率等等。在这篇文章中&#xff0c;我们将探讨一些VBA的好处。 自…

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…

LeetCode——动态规划(四)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09; 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff…

【算法与数据结构】--前言

欢迎来到《算法与数据结构》专栏&#xff01;这个专栏将引领您进入计算机科学领域中最重要、最精彩的领域之一&#xff1a;算法与数据结构。不管您是一名初学者&#xff0c;还是已经拥有一定编程经验的开发者&#xff0c;都可以从这里找到有益的知识和实践。 在计算机科学的世…

机器学习:随机森林

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

一、综合——法律法规

文章目录 一、《中华人民共和国电信条例》1.1 《电信条例》关于电信市场的规定1.2 《电信条例》关于电信服务的规定1.3 《电信条例》关于电信建设的规定二、《公用电信网间互联管理规定》2.1《网间互联规定》概述2.2 电信业务经营者的互联义务三、《中华人民共和国网络安全法》…

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…

linux安装idea

下载好之后是.tar.gz文件后缀的 使用命令解压安装包 tar -zxvf 你的安装包 解压好了之后进入解压好的目录找到bin文件里的idea.sh,使用命令启动它 ./idea.sh 这样你就可以在manjaro上使用idea了 在这里插入图片描述 需要手动创建快捷启动方式 每次都使用命令行启动是比较…

ROS+PX4+mavros+qgc环境搭建笔记

环境搭建&#xff1a; Ubuntu20.04中 jmavsim开启失败问题解决方案 b站hg教程&#xff1a; b站px4环境安装教程文档 bilibili 资料链接&#xff1a;https://pan.baidu.com/s/1P2gqfdofudzguFvBiM55QA?pwdllye 提取码&#xff1a;llye

单元测试该怎么写

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

rust闭包

一、闭包是什么 &#xff08;一&#xff09;闭包是什么 我们先来看看javascript中的闭包。 在函数外部无法读取函数内的局部变量。但是我们有时候需要得到函数内的局部变量&#xff0c;那么如何从外部读取局部变量&#xff1f;那就是在函数的内部&#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…

2034. 股票价格波动

给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。 不巧的是&#xff0c;由于股票市场内在的波动性&#xff0c;股票价格记录可能不是按时间顺序到来的。某些情况下&#xff0c;有的记录可能是错的。如果两个有相同时间戳的记录出现…

大数据架构设计(四十五)

大数据架构有Lambda架构和Kappa架构。 大数据可以解决的问题? 处理非结构化和半结构化数据。大数据复杂性、不确定性特征描述和刻画方法以及大数据系统建模。数据易构性 与 决策易购性的关系。&#xff08;数据易构性主要是不同的数据库种类&#xff09; 大数据处理系统系统特…

系统架构设计:5 论软件的可靠性设计

目录 一 可靠性设计 1 可靠性 2 影响可靠性的因素 3可靠性设计技术 (1)避错技术

设备搭建(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…