当前位置: 首页 > article >正文

Godot游戏练习01-第10节-组件化,玩家受伤,YSort,和一点思考

今天将伤害与受伤功能组件化, 并且在玩家身上实现受伤机制, 同时也能体会组件化的好处, 最后实现了Player与Enemy之间的YSort效果本次实现的内容主要体现在组件化与复用, 可观察的内容并不多看看效果之前的实现中, 无论Player与Enemy处于什么样的相对位置, 都是Enemy覆盖在上面, 看起来没有层次感, YSort实现Enemy和Player的动态排序显示YSort效果: 观察Player走在Enemy上方和走在Enemy下方时的显示层次并且实现了Player的受伤, 生命值耗尽后的死亡机制, 目前仅打印日志 (Player碰到Enemy受伤多次后提示Died)实现过程伤害与受伤的组件化在之前的课程中, 通过在Bullet和Enemy场景上添加Area2D, 实现伤害和受伤的功能但这两个功能具有很强的复用性子弹只具有伤害功能敌人具有伤害(玩家)功能, 还具有受伤(来自子弹)功能玩家只具有受伤(来自敌人)功能其中, 受伤功能与健康组件(HealthComponent)是依赖关系, 具备HealthComponent才可以受伤之前已经实现了HealthComponent, 可以按照相同方式实现HurtboxComponent(受伤组件)和HitboxComponent(伤害组件)这两个组件都是一个Area2D节点, 没有默认的CollisionShape2D组件, 因为各场景的碰撞形状不同, 需要单独定义, 没有必要复用HurtboxComponent源码class_name HurtboxComponent extends Area2D export var health_component: HealthComponent func _ready() - void: if is_multiplayer_authority(): area_entered.connect(_on_area_entered) else: process_mode Node.PROCESS_MODE_DISABLED func take_damage(damage: int) - void: health_component.take_damage(damage) func _on_area_entered(area: Area2D) - void: if not area is HitboxComponent: return var hitbox : area as HitboxComponent take_damage(hitbox.damage) hitbox.register_hit(self)该组件处理受伤事件, 将伤害传递给外部的HealthComponent组件, 并反向通知HitboxComponent击中事件, 仅在服务端进行物理判断和逻辑处理HitboxComponent源码如下class_name HitboxComponent extends Area2D signal hit(hurtbox: HurtboxComponent) var damage: int 1 func _ready() - void: if not is_multiplayer_authority(): process_mode Node.PROCESS_MODE_DISABLED func register_hit(hurtbox: HurtboxComponent) - void: hit.emit(hurtbox)处理击中事件, 并向外传递信号组件化的哲学组件化将一个个单独的功能拆分开来, 这符合Godot的思想哲学, 组件化具有以下优点每个组件的源码都不多,仅完成一件事, 职责单一简单复杂场景需要什么功能, 不需要什么功能可以方便定制, 只需要添加/删除对应功能的组件即可比如Player需要添加血量/死亡, 以及受伤功能, 在上述组件构建之后, 直接添加一个HealthComponent与HurtboxComponent组件即可再稍微调整下层级配置, 处理生命值耗尽的信号(目前仅打印died日志)就行了防止复杂场景的脚本膨胀, 逻辑爆炸从Player新增血量和受伤功能也能看出, Player新增功能基本没有新增很多源码, 因为对应逻辑都分散在对应组件中了, 主场景脚本处理一下信号就行通过信号交互,逻辑解耦比如HitboxComponent, 对外提供一个hit(hurtbox: HurtboxComponent)信号, 表示已经伤害另一个实体, 但是这个信号是谁来处理, 有没有人处理, 本组件都不关心, 我只是通知一下, 后面都不用管了对于子弹(Bullet)场景, 它需要关心这件事, 因为子弹击中敌人后, 自身需要销毁, 因此它需要监听该信号做处理对于敌人(Enemy)场景, 它不关心这件事, 伤害玩家后它不需要额外的逻辑处理, 因此它不用管这个信号YSortYSort的效果: 当Player的位置y值大于Enemy的位置y值, 则显示在Enemy上方; 若位置y值小于Enemy的位置y值, 则显示在Enemy下方YSort的开启: 当某个节点开启YSortEnabled之后, 其所有直接子节点在同一个Y-Sort空间中进行Y排序渲染也就是说, 节点的YSortEnabled开关, 影响的是直接子节点, 而不是影响自身, 要牢记这个规则其实完整的Y-Sort规则比较绕, 如果涉及到父子节点同时开启Y-Sort很难理解, 但是当前的理解已经够完成开发内容,以后要使用再继续深究一点思考以前的我想写程序或者想做游戏时, 总觉得要先看一个完整详细的系统教程, 要了解所有细节, 准备完全之后再动手开发觉得这样有掌控感, 并且我懂得细节, 才能按照最佳实践去架构去实现但是往往都是过分纠结于细节理论, 耽误太多时间, 而完不成任何内容现在看, 以前的我都是追求完美的心态, 实现都妄想一开始就最好, 但实际上是我能完整跟着一个教程做完, 完整写下一个小项目都很不容易了, 如果碰到一点点不懂的内容就去不断深究, 想弄懂这背后所有的设计与实现细节, 很可能就迷失自我了记得印象最深的一个是以前尝试做一个小demo时, 觉得人物受击之后, 应该有受击动画才比较好看, 就去研究2D受击动画实现, 了解到是用Shader实现, 于是去看了受击动画的Shader源码, 完全没看懂, 觉得这个要啃下来, 做游戏怎么能不懂Shader, 以后还要做特效, 还要代替粒子系统优化性能, 学! 必须学透, 然后, 我不知道自己迷失到哪里去了, Shader学了多少不知道, demo肯定是忘记了要按照以前的思想, 做游戏怎么能不懂美术/物理/粒子/音效/数值/机制设计…, 碰到每一个不了解的细节或者方向, 都妄想掌控, 然后以完美的姿态来继续任务, 不是没有可能, 只是过于依赖自己本就稀缺的意志力, 我忘记了自己只是一个普通人, 不是那种真的能一口气啃完所有内容还能记得回来战斗的完美六边形战士不要高估自己的意志力, 不要给自己的实际行动增加阻力我只能尽量保持手头项目/demo的完成, 如果碰到不懂的, 卡住我的内容, 那就以最简单最快的方式了解必要内容, 获取必要的资源, 之后立即回到任务上, 避免过度扩散, 避免给自己增加行动阻力虽然不了解细节会写出烂代码, 不懂美术会画出抽象作品, 但没关系, 只要我还在保持做游戏, 都会越来越好, 或者找到解决问题的方法代码烂没关系, 等到我后期真的需要500个敌人同屏显示, 卡成PPT的时候再回来找问题做优化美术烂没关系, 我没有那种艺术天赋, 不能做出靠画风吸引人的作品, 但是我可以琢磨机制玩法, 等真的实现了一个不错的Demo时再去找美术资源, 或者在必要的时候学习绘制需要的风格素材保持自己在桌上, 才是最重要的

相关文章:

Godot游戏练习01-第10节-组件化,玩家受伤,YSort,和一点思考

今天将"伤害"与"受伤"功能组件化, 并且在玩家身上实现受伤机制, 同时也能体会组件化的好处, 最后实现了Player与Enemy之间的YSort效果 本次实现的内容主要体现在组件化与复用, 可观察的内容并不多 看看效果 之前的实现中, 无论Player与Enemy处于什么样的相…...

QT使用ui->checkBox->setChecked(true)时,注意事项

QT界面上拖入一个checkBox组件,定义了stateChanged槽函数,即checkBox勾选框状态发生变化的时候,触发stateChanged函数。 如果没有设置勾选框默认状态时,勾选框默认是未勾选的状态,当用代码 ui->checkBox->setChe…...

出海必备跨境电商短视频群控系统怎么选?新手必看方法!

刚起步的出海卖家是不是总卡在这?想铺社媒矩阵做短视频营销,拍一条视频要租场地、找外籍模特,一周出不了10条;投到TikTok、亚马逊、Shopify不同平台,还要手动改格式、调风格,折腾半天还不符合平台规则&…...

从入门到精通Python:零基础可落地的学习指南,解锁2026年编程新机遇

在数字化浪潮席卷全球的今天,Python早已不再是程序员专属的“工具语言”,而是成为跨行业的“通用技能”——从互联网大厂的后端开发、人工智能训练,到职场人的自动化办公、数据分析,再到科研领域的建模仿真,Python以其…...

【论文解读】隐马尔可夫模型:语音识别领域的奠基之作

玄同 765 大语言模型 (LLM) 开发工程师 | 中国传媒大学 数字媒体技术(智能交互与游戏设计) CSDN 个人主页 | GitHub Follow 关于作者 深耕领域:大语言模型开发 / RAG 知识库 / AI Agent 落地 / 模型微调技术栈:Python | R…...

使用Conda和pip创建Python环境

使用Conda和pip创建Python环境添加阿里云镜像源安装环境问题添加阿里云镜像源 conda config --add channels https://mirrors.aliyun.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.aliyun.edu.cn/anaconda/pkgs/main/ conda config --add channel…...

基于Matlab Simulink的4WID-4WIS整车动力学14自由度模型构建与应用指南

4WID-4WIS整车动力学14自由度模型_simulink软件使用:Matlab/Simulink 适用场景:采用模块化建模方法,搭建14自由度四轮驱动-四轮转向整车动力学模型,作为整车平台适用于多种工况场景。 产品simulink源码包含如下模块: →…...

低代码赋能数字化运营:破解管理痛点,激活增长动能

在数字化浪潮席卷各行各业的当下,企业运营早已告别“粗放式管理”的时代,数字化、精细化、全链路成为核心竞争力的关键。对于多数企业而言,如何打破运营壁垒、盘活数据资产、降低管理成本,实现高效增长,成为亟待解决的…...

从手动发推到自动化运营:我用这套方案把Twitter运营效率提升了10倍

作为一个常年跟代码打交道的程序员,去年我开始尝试做海外市场,主阵地在Twitter。本以为写代码都不怕,运营个社交媒体能有多难?结果现实给我上了一课:每天要手动发推文、找热门话题、点赞评论、关注潜在用户、回复私信……...

Windows 11 磁盘空间释放最全攻略

📋 Windows 11 磁盘空间释放速查清单 帮你整理了一套从「快速清理」到「深度释放」的分步操作,以后空间不足时可以直接对照执行👇🔹 第一步:基础快速清理(5分钟搞定) 1. 清理临时文件 路径&…...

国际机票怎么买最便宜日本?资深旅行达人的购票秘籍

樱花季的东京、枫叶季的京都、雪季的北海道,日本始终是中国游客最青睐的出境游目的地之一。但每当打开购票软件,看着那 fluctuating 的价格曲线,很多人都会陷入沉思:国际机票怎么买最便宜日本?这个问题背后&#xff0c…...

Web安全自学路线图:从零到入门,避开这些坑就够了!

很多新手卡在“知道概念,不会动手”的瓶颈,问题不在天赋,而在路径。作为一名安全从业者,我见过太多初学者在浩瀚的知识面前迷失方向。他们学了一堆术语,看了无数教程,但面对一个真实的网站依然无从下手。今…...

边界云自助棋牌室系统怎么样?

随着无人经济的发展,自助棋牌室逐渐成为线下娱乐行业的新模式。通过扫码开门、自动计费和系统管理,一家棋牌室可以实现24小时无人运营,大幅降低人工成本。不过,对于很多准备开店的创业者来说,都会关注一个问题&#xf…...

搞工控的老铁对安川MP7系列肯定不陌生,这货在产线上跑得比双十一快递还勤快。今天咱们扒开它的源码裤衩,看看那些藏在十六进制背后的骚操作

安川7源码 文档 具体见图片先瞅一段运动轨迹规划的C代码片段: void SCurve_Generator(int32_t target_pos) {volatile uint16_t *reg (uint16_t*)0xFFFF8000; //特殊寄存器地址if(*reg & 0x0001) {jerk_ctrl (*reg >> 8) & 0xFF; //从寄存器抠出加…...

Leewow实测:30秒用AI做一件T恤,周边定制一句话搞定

大家好,这里是K姐。 一个帮助你把AI真正用起来的女子。 我最近试了一个神奇的网站——Leewow。 这是一个刚在海外上线不久的 AI 产品创作平台,今年 2 月才在 Product Hunt 发布。它的核心能力是:一句话 → AI设计 → 自动生成商品。 官方介…...

机器人路径规划算法之A*算法详解+MATLAB代码实现

目录 一、A*算法核心原理 1. 算法概述 2. 核心公式 3. 启发函数 h(n) 的性质 4. 常用启发函数 二、A*算法步骤详解 1. 算法流程 2. 与Dijkstra的对比 三、MATLAB实现A*算法 一、A*算法核心原理 1. 算法概述 A*算法是一种启发式搜索算法,结合了Dijkstra的最…...

2026年人事系统多少钱一套?

2026年人事系统多少钱一套?4类方案价格拆解选型攻略,帮你省30%预算做HR的小夏最近找我吐槽:“看了5家人事系统,价格从3000元/年到30万元不等,到底差在哪?难道贵的就一定好?”其实,人…...

Docker + Go 生产级实战:从本地开发到容器化部署的完整指南

Docker + Go 生产级实战:从本地开发到容器化部署的完整指南 摘要:本文从零开始,手把手教你如何将一个 Go Web 项目容器化。涵盖 Dockerfile 编写、多阶段构建、Docker Compose 编排、CI/CD 集成、性能优化等生产级实践。包含完整代码示例,可直接套用到你的项目中。 一、为什…...

Go 分布式事务实战:本地消息表、事务消息、SAGA、TCC 四大方案深度解析与选型指南

Go 分布式事务实战:本地消息表、事务消息、SAGA、TCC 四大方案深度解析与选型指南 摘要:在微服务架构中,分布式事务是无法回避的核心难题。本文深入剖析本地消息表、事务消息、SAGA、TCC 四种主流方案的实现原理,提供完整的 Go 语言代码示例,并结合电商、支付等真实场景给…...

基于单片机的瓦斯监测系统设计

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...

求大佬帮忙解决问题

电脑突然不知道啥原因,安装程序的时候只能选择桌面目录进行安装,但是可以手动输入盘符安装到其他目录...

BNU-25硕信息学奥赛day2

2026.3.13学习笔记 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录2026.3.13学习笔记前言一、变量名和常量1.变量名案例2.规则3.常量名命名规则4.内置数据类型二、赋值与变量自增1.赋值语句2.自增2.1 自增/自减运算…...

DOM Element

DOM Element 引言 在Web开发中,DOM(Document Object Model)是描述HTML和XML文档的标准模型。DOM Element是DOM模型的核心组成部分,它代表了HTML或XML文档中的元素。本文将深入探讨DOM Element的概念、属性、方法以及在实际开发中的应用。 什么是DOM Element? DOM Elem…...

Julia 交互式命令详解

Julia 交互式命令详解 引言 Julia 是一种高性能的编程语言,广泛应用于科学计算、数据分析、机器学习等领域。在 Julia 中,交互式命令行(REPL)是一种非常方便的工具,它允许开发者直接在终端中运行代码并立即看到结果。本文将详细介绍 Julia 的交互式命令,帮助您更好地利…...

ionic 浮动框:实现与优化指南

ionic 浮动框:实现与优化指南 引言 在移动应用开发中,用户界面的设计对于提升用户体验至关重要。Ionic框架,作为一款流行的HTML5移动应用开发框架,提供了丰富的组件和功能,帮助开发者构建高性能、跨平台的应用。其中,浮动框(Floating Action Button,简称FAB)作为一种…...

金舟软件AI对话工具-20260313提问VLAN技术

嗯……用户突然问起了VLAN的定义,看来是想了解网络分段的基础知识。不过从之前的对话来看,ta似乎更关注的是Linux系统运维(CentOS 7命令),刚才又跳到AI年龄判断,跨度有点大啊。用户可能是刚开始学习网络技术…...

Java + OSHI 实战:从零搭建企业级电脑硬件信息检测

作为一名信息处理员,想必都遇到过这类 “重复劳动” 的场景: 经理:“小白,把公司所有电脑的硬件信息统计一下,做个固定资产盘点表。” 如果手动去每台电脑上看「设备管理器」「系统信息」,不仅要反复操作相同步骤,还容易漏记、错记,几百台设备得耗上几天,效率低到离谱…...

Oracle VM VirtualBox 虚拟机安装增强功能及共享粘贴板

在虚拟机设置中设置了剪切板及文件拖拽双向共享但是不起作用, 排查了下原因并记录以作备忘,具体步骤如下:首先,虚拟机关机状态设置共享:选择对应的虚拟机(关机状态)选择“设置” - "常规" - “高…...

科技中介如何优化技术转移服务流程?

观点作者:科易网-AI技术转移与科技创新数智化服务平台一、现状概述:成效与短板 在数智化转型浪潮下,科技成果转化正经历深刻变革。传统科技中介服务模式以线下对接、人工匹配为主,存在信息不对称、响应滞后、转化效率低等问题。尽…...

财务如何使用应收账款管理工具,避免一套数据录入两遍

一、应收账款管理工具的核心价值1. 应收账款管理的定义与重要性应收账款管理是指企业对因销售商品或提供服务而产生的未收回款项进行系统化追踪、记录和催收的过程。它是企业财务管理的重要组成部分,直接影响现金流健康和资金周转效率。数据显示,应收账款…...