pygame开发课程系列(5): 游戏逻辑
第五章 游戏逻辑
在本章中,我们将探讨游戏开发中的核心逻辑,包括碰撞检测、分数系统和游戏状态管理。这些元素不仅是游戏功能的关键,还能显著提升游戏的趣味性和挑战性。
5.1 碰撞检测
碰撞检测是游戏开发中的一个重要方面,它用于确定游戏对象是否相互接触。这对于处理角色与物体之间的互动、游戏元素的相互作用以及游戏的反馈机制至关重要。
5.1.1 使用 pygame.Rect
对象进行碰撞检测
在 Pygame 中,可以使用 pygame.Rect
对象来简化碰撞检测。pygame.Rect
是一个矩形对象,它具有位置和尺寸属性,并提供了用于碰撞检测的多种方法。
以下示例展示了如何使用 pygame.Rect
进行简单的碰撞检测:
import pygame
import sys# 初始化 Pygame
pygame.init()# 设置窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("碰撞检测示例")# 颜色定义
白色 = (255, 255, 255)
蓝色 = (0, 0, 255)
红色 = (255, 0, 0)# 创建矩形
rect1 = pygame.Rect(100, 100, 50, 50)
rect2 = pygame.Rect(300, 300, 50, 50)
rect_speed = 1# 主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 处理键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:rect1.x -= rect_speedif keys[pygame.K_RIGHT]:rect1.x += rect_speedif keys[pygame.K_UP]:rect1.y -= rect_speedif keys[pygame.K_DOWN]:rect1.y += rect_speed# 检测碰撞if rect1.colliderect(rect2):color1 = 红色else:color1 = 蓝色# 清屏screen.fill(白色)# 绘制矩形pygame.draw.rect(screen, color1, rect1)pygame.draw.rect(screen, 蓝色, rect2)# 更新显示pygame.display.flip()
在这个示例中,当 rect1
和 rect2
碰撞时,rect1
的颜色会变成红色。
5.2 分数系统
分数系统用于记录和显示玩家在游戏中的表现。它不仅可以让玩家了解他们的进展,还能增强游戏的竞争性。
5.2.1 显示和更新分数
为了显示和更新分数,你需要在游戏中使用文本绘制功能。Pygame 提供了 pygame.font
模块来处理文本的显示。
以下示例展示了如何实现一个简单的分数系统:
import pygame
import sys# 初始化 Pygame
pygame.init()# 设置窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("分数系统示例")# 颜色定义
白色 = (255, 255, 255)
绿色 = (0, 255, 0)# 创建字体对象
font = pygame.font.SysFont(None, 55)# 初始化分数
score = 0# 主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:score += 10 # 按空格键增加分数# 清屏screen.fill(白色)# 创建分数字符串score_text = font.render(f"分数: {score}", True, 绿色)# 绘制分数screen.blit(score_text, (10, 10))# 更新显示pygame.display.flip()
在这个示例中,按下空格键会增加分数,并在屏幕上显示出来。
5.3 游戏状态管理
游戏状态管理用于处理游戏的不同阶段,例如开始、进行和结束状态。管理游戏状态可以帮助你组织游戏逻辑,并根据不同的状态执行特定的操作。
5.3.1 管理游戏状态
在 Pygame 中,可以使用一个简单的状态机来管理游戏的不同状态。以下示例展示了如何实现一个基本的游戏状态管理:
import pygame
import sys# 初始化 Pygame
pygame.init()# 设置窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("游戏状态管理示例")# 颜色定义
白色 = (255, 255, 255)
绿色 = (0, 255, 0)
红色 = (255, 0, 0)# 游戏状态
状态_开始 = 0
状态_进行 = 1
状态_结束 = 2
状态 = 状态_开始# 创建字体对象
font = pygame.font.SysFont(None, 55)# 主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:if 状态 == 状态_开始:状态 = 状态_进行elif 状态 == 状态_进行:状态 = 状态_结束elif 状态 == 状态_结束:状态 = 状态_开始# 清屏screen.fill(白色)# 根据状态显示不同的内容if 状态 == 状态_开始:text = font.render("按 Enter 开始游戏", True, 绿色)elif 状态 == 状态_进行:text = font.render("游戏进行中", True, 绿色)elif 状态 == 状态_结束:text = font.render("游戏结束", True, 红色)# 绘制文本screen.blit(text, (200, 250))# 更新显示pygame.display.flip()
在这个示例中,按下 Enter 键会在“开始”、“进行”和“结束”状态之间切换,并显示相应的文本。
如何解决中文字体乱码问题:https://blog.csdn.net/mez_Blog/article/details/119697279
小结
本章介绍了游戏逻辑的核心部分,包括碰撞检测、分数系统和游戏状态管理。这些功能不仅是游戏开发的基础,还能显著提升游戏的互动性和挑战性。掌握这些逻辑后,你将能够创建更加丰富和复杂的游戏体验。在接下来的章节中,我们将讨论游戏优化与发布,帮助你提升游戏的性能并进行发布。
相关文章:

pygame开发课程系列(5): 游戏逻辑
第五章 游戏逻辑 在本章中,我们将探讨游戏开发中的核心逻辑,包括碰撞检测、分数系统和游戏状态管理。这些元素不仅是游戏功能的关键,还能显著提升游戏的趣味性和挑战性。 5.1 碰撞检测 碰撞检测是游戏开发中的一个重要方面,它用…...

嵌入式系统实时任务调度算法优化与实现
嵌入式系统实时任务调度算法优化与实现 目录 嵌入式系统实时任务调度算法优化与实现 引言 1.1 嵌入式系统的重要性 1.2 实时任务调度的重要性 实时任务的定义与分类 2.1 实时任务的定义 2.2 实时任务的分类 2.3 实时任务的其他分类方法 硬实时与软实时系统 3.1 硬实…...
Java:枚举转换
在Java中,你可以使用Enum.valueOf()方法将字符串转换为枚举常量。但是,如果你想要将枚举转换为其他类型,你需要自定义转换方法。以下是一个简单的例子,演示如何将枚举转换为整数: public enum Color {RED(1), GREEN(2…...
Vue、react父子组件生命周期
Vue 的父子组件生命周期 以下分为三部分,加载渲染阶段——更新阶段——销毁阶段,我们来一一介绍: 1、加载渲染阶段 在加载渲染阶段,一定得等子组件挂载完毕后,父组件才能挂载完毕,所以父组件的 mounted 在…...
HTML 基础要素解析
目录 HTML 初步认识 纯文本文件介绍 纯文本文件与其它文件的区别 Html介绍 HTML 骨架 文档类型(!DOCTYPE)声明 介绍 常用的 DOCTYPE 声明 meta标签 字符集 关键字和页面描述 HTML 初步认识 纯文本文件介绍 纯文本文件指的是仅包含文本内容&am…...

开源的向量数据库Milvus
Milvus是一款开源的向量数据库,专为处理向量搜索任务而设计,尤其擅长处理大规模向量数据的相似度检索。 官网地址:https://milvus.io/ 以下是关于Milvus的详细介绍: 一、基本概念 向量数据库:Milvus是一款云原生向量…...
设计模式-工厂方法
“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract Factory…...
Flask SQLALchemy 的使用
Flask SQLALchemy 的使用 安装 Flask-SQLAlchemy配置 Flask-SQLAlchemy定义模型创建数据库和表插入和查询数据更新和删除数据迁移数据库总结Flask-SQLAlchemy 是一个 Flask 扩展,它简化了 Flask 应用中 SQLAlchemy 的使用。SQLAlchemy 是一个强大的 SQL 工具包和对象关系映射(…...
Metasploit漏洞利用系列(一):MSF完美升级及目录结构深度解读
在信息安全领域,MetasploitFramework(MSF)是一个无处不在的工具,它集合了大量的渗透测试和漏洞利用模块,帮助安全专家识别和利用系统中的弱点。本文将深入探讨如何对Metasploit进行完美升级,以及对其核心目…...
C/C++|经典代码题(动态资源的双重释放与「按值传递、按引用传递、智能指针的使用」)
以下代码中你能看出其存在什么问题?如何修复,能给出几种方法?分别在什么场景下用哪种方法。 #include <iostream>class Buffer {public:Buffer() { std::cout << "Buffer created" << std::endl; }~Buffer() { s…...
西北乱跑娃 -- linux使用笔记
1.后台运行每天一个日志文件 nohup python3.8 manage.py >> $(date %Y-%m-%d).log 2>&1 &2.目录操作: ls:列出目录内容。cd:改变当前工作目录。pwd:显示当前工作目录的路径。mkdir:创建新目录。rmd…...

Kubectl基础命令使用
一.Kubectl 基础命令 格式: kubectl [command] [TYPE] [NAME] [FLAGS] kubectl 是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。以下是一些常用的 kubectl 命令及其选项: 常用命令 获取资源 列出所有资源类型(Pods、De…...

推荐编译器插件:Fitten Code 更快更好的AI助手
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

ArcGIS Pro基础:状态栏显示栏的比例尺设置和经纬度位置
上图所示,界面下方最左侧是显示的比例尺,可以进行选择设置,也可以进行自定义设置 上图所示,可以手动录入比例尺,同时也可以对比例尺设置别名,比如【实验1】作为特定比例尺的标记 如上图所示,可以…...
微前端架构入门
什么是微前端? 定义 微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 微前端是一种架构风格,它允许将一个复杂的大前端应用拆分成多个可以独立开发、部署的小型前端应用。这些小型前端应用通常被称为“子应用”或者“微前端应用…...

[LitCTF 2023]导弹迷踪
页面源码底部有多个js,查看浏览 查看ksrc/game.js发现flag...
win10安装wsl2(ubuntu20.04)并安装 TensorRT-8.6.1.6、cuda_11.6、cudnn
参考博客: 1. CUDA】如何在 windows 上安装 Ollama 3 open webui (docker WSL 2 ubuntu nvidia-container):https://blog.csdn.net/smileyan9/article/details/140391667 2. 在 Windows 10 上 安装 W…...

信息搜集--敏感文件Banner
免责声明:本文仅做分享参考... 目录 git安装: git目录结构: 敏感目录泄露 1-git泄露 (1)常规git泄露 scrabble工具 (2)git回滚 (3)git分支 GitHacker工具 (4)git泄露的其他利用 .git重定向问题 2-SVN泄露 dvcs-ripper工具 3-小结 dirsearch目录扫描工具 敏感备…...

Qt 学习第六天:页面布局
如何设计页面? 有个类似沙盒模式的玩法,Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局: 四种布局 (一)水平布局horizontalLayout:QHBoxLayout H 是 hori…...

利用队列收集单双击和长按按键
利用队列收集单双击和长按按键 引言 当我们仅仅通过在while循环里面进行判断按键类型的标志位, 然后进行操作的时候, 我们的最小例程很小, 所以能够实时的检测到按键,从而触发实验现象. 假如我们此时进入了一个事件处理函数呢 ? 并且这个这个函数的操作是不可被打断的, 如果此…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
Python_day48随机函数与广播机制
在继续讲解模块消融前,先补充几个之前没提的基础概念 尤其需要搞懂张量的维度、以及计算后的维度,这对于你未来理解复杂的网络至关重要 一、 随机张量的生成 在深度学习中经常需要随机生成一些张量,比如权重的初始化,或者计算输入…...
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值,可通过以下步骤实现: 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置: xml 复制 下载 运行 <insert id"insertUser" para…...
leetcode sql50题
在中文站没找到对应的集合,想来自己动手拷贝过来,方便大家面试复习用,对应英文站点: https://leetcode.com/studyplan/top-sql-50/ Select #1757. 可回收且低脂的产品 链接: https://leetcode.cn/problems/recyclable-and-low-fa…...