news 2026/5/30 0:33:01

从零开发游戏需要学习的c#模块,第三十一章(技能冷却系统 —— 范围爆炸)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零开发游戏需要学习的c#模块,第三十一章(技能冷却系统 —— 范围爆炸)

本节课目标

  1. 鼠标右键释放范围爆炸

  2. 爆炸有冷却时间(5秒)

  3. 屏幕显示冷却进度图标

  4. 爆炸范围内所有敌人受到大量伤害

  5. 爆炸有视觉特效

第一步:给 Player 类加技能

打开Player.cs,添加以下内容:

1. 添加字段:

csharp

// 技能系统 private float skillCooldown = 5f; private float skillTimer = 0f; private bool skillReady = true;

2. 添加方法:

csharp

// 尝试释放技能,返回是否成功 public bool TryUseSkill(float deltaTime) { if (!skillReady) { skillTimer -= deltaTime; if (skillTimer <= 0) { skillReady = true; skillTimer = 0; } return false; } return true; } public void UseSkill() { skillReady = false; skillTimer = skillCooldown; } // 技能冷却百分比(0 到 1,0=冷却好了) public float GetSkillCooldownPercent() { if (skillReady) return 0; return skillTimer / skillCooldown; }

第二步:创建爆炸特效类

右键项目 →添加,文件名Explosion.cs

using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; namespace MY_FIRST_GAME { public class Explosion { public Vector2 Position; public float Radius; public float MaxRadius; public float Duration; public float Timer; public bool IsAlive => Timer < Duration; public int Damage; public Explosion(Vector2 position, float radius, float duration, int damage) { Position = position; Radius = 0; MaxRadius = radius; Duration = duration; Damage = damage; Timer = 0; } public void Update(float deltaTime) { Timer += deltaTime; float progress = Timer / Duration; Radius = MaxRadius * progress; // 半径逐渐扩大 // 伤害在爆炸瞬间判定(progress < 0.1 时) } public void Draw(SpriteBatch spriteBatch, GraphicsDevice graphicsDevice) { float alpha = 1f - (Timer / Duration); // 逐渐透明 // 画扩散圆环 int segments = 32; float angleStep = MathF.PI * 2 / segments; for (int i = 0; i < segments; i++) { float angle1 = i * angleStep; float angle2 = (i + 1) * angleStep; float x1 = Position.X + MathF.Cos(angle1) * Radius; float y1 = Position.Y + MathF.Sin(angle1) * Radius; float x2 = Position.X + MathF.Cos(angle2) * Radius; float y2 = Position.Y + MathF.Sin(angle2) * Radius; // 简单的线段绘制(用 1x1 像素) DrawLine(spriteBatch, graphicsDevice, new Vector2(x1, y1), new Vector2(x2, y2), Color.Orange * alpha, 3); } } private void DrawLine(SpriteBatch spriteBatch, GraphicsDevice device, Vector2 start, Vector2 end, Color color, int thickness) { Texture2D pixel = new Texture2D(device, 1, 1); pixel.SetData(new[] { Color.White }); float distance = Vector2.Distance(start, end); float angle = MathF.Atan2(end.Y - start.Y, end.X - start.X); spriteBatch.Draw(pixel, start, null, color, angle, Vector2.Zero, new Vector2(distance, thickness), SpriteEffects.None, 0); } public bool Intersects(Vector2 target, float targetRadius) { float dist = Vector2.Distance(Position, target); return dist < Radius + targetRadius; } } }

第三步:改造Game1.cs

以下是需要改动的地方:

1. 添加字段:

csharp

private List<Explosion> explosions = default!;

2. 在InitializeGame里初始化:

csharp

explosions = new List<Explosion>();

3. 在Update的 Game 状态里添加技能触发和爆炸更新:

在子弹发射的代码后面加:

csharp

// ★ 右键释放技能 if (currentMouse.RightButton == ButtonState.Pressed && previousMouse.RightButton == ButtonState.Released) { if (player.TryUseSkill(deltaTime)) { player.UseSkill(); Vector2 mouseWorld = camera.ScreenToWorld( new Vector2(currentMouse.X, currentMouse.Y)); explosions.Add(new Explosion(mouseWorld, 120f, 0.5f, 60)); try { shootSound?.Play(); } catch { } // 可换成爆炸音效 } }

在粒子更新后面加:

csharp

// 更新爆炸 foreach (Explosion exp in explosions) exp.Update(deltaTime); // ★ 爆炸伤害判定 for (int i = explosions.Count - 1; i >= 0; i--) { if (explosions[i].Timer < 0.1f) // 只在爆炸初期判定一次 { for (int j = enemies.Count - 1; j >= 0; j--) { if (explosions[i].Intersects(enemies[j].Position, 20)) { enemies[j].Hp -= explosions[i].Damage; if (enemies[j].Hp <= 0) { enemies[j].IsAlive = false; score += enemies[j].ScoreValue; enemiesDefeatedThisGame++; particleSystem.EmitHitParticles(enemies[j].Position); // 加经验和掉落判定... } } } } } explosions.RemoveAll(e => !e.IsAlive);

4. 在DrawGameWorld里画爆炸:

csharp

foreach (Explosion exp in explosions) exp.Draw(_spriteBatch, GraphicsDevice);

5. 替换DrawGameUI里添加技能冷却图标:
在 UI 最后加:

csharp

// ★ 技能冷却图标 DrawSkillCooldown(_spriteBatch, 700, 500, 40);

6. 添加冷却图标绘制方法:

csharp

private void DrawSkillCooldown(SpriteBatch spriteBatch, int x, int y, int size) { Texture2D pixel = new Texture2D(GraphicsDevice, 1, 1); pixel.SetData(new[] { Color.White }); // 背景 spriteBatch.Draw(pixel, new Rectangle(x, y, size, size), Color.DarkSlateGray); spriteBatch.Draw(pixel, new Rectangle(x + 2, y + 2, size - 4, size - 4), Color.Black); // 冷却覆盖(从下往上) float cooldownPercent = player.GetSkillCooldownPercent(); if (cooldownPercent > 0) { int coverHeight = (int)((size - 4) * cooldownPercent); spriteBatch.Draw(pixel, new Rectangle(x + 2, y + 2, size - 4, coverHeight), Color.DarkBlue * 0.7f); } // 图标文字 _spriteBatch.DrawString(font, "⚡", new Vector2(x + 8, y + 6), Color.Gold); _spriteBatch.DrawString(font, "右键", new Vector2(x - 15, y + size + 5), Color.LightGray); }

好了,本节课学习就此结束,我叫魔法阵维护师,关注我,下期更精彩!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 0:30:28

基于框架的Token Curated Registries:构建去中心化策展系统的开发指南

1. 项目概述&#xff1a;当框架遇上策展在区块链和去中心化应用的世界里&#xff0c;我们经常听到“策展”这个词。它听起来有点艺术范儿&#xff0c;但在代码世界里&#xff0c;策展的核心是“筛选”和“认证”。想象一下&#xff0c;你是一个大型开源社区的维护者&#xff0c…

作者头像 李华
网站建设 2026/5/30 0:28:41

建议收藏|2026年必不可少的专业降AI率平台

2026年论文降AI率工具已从“基础改写”升级为多维度智能优化系统&#xff0c;核心评价维度涵盖AIGC识别精准度、文本自然度、学术合规性、查重适配能力、长文本逻辑性和多语种支持。本次测评覆盖6款主流工具&#xff0c;测试场景包括中文与英文论文、全流程处理与专项优化、免费…

作者头像 李华
网站建设 2026/5/30 0:26:08

Win11 WSL2 + Ubuntu 18.04:手把手教你配置ROS开发环境并跑通第一个rviz

Win11 WSL2 Ubuntu 18.04&#xff1a;从零搭建ROS开发环境的完整实践指南 在Windows系统上进行机器人操作系统&#xff08;ROS&#xff09;开发一直是个令人头疼的问题。传统方案要么依赖性能损耗严重的虚拟机&#xff0c;要么需要复杂的双系统切换。而Windows Subsystem for…

作者头像 李华
网站建设 2026/5/30 0:26:04

Arm CCI-550/CCI-500地址通道带宽异常分析与优化

1. CCI-550/CCI-500地址通道带宽异常问题解析最近在调试基于Arm CoreLink CCI-550/CCI-500缓存一致性互连的设计时&#xff0c;发现一个有趣的现象&#xff1a;当AXI/ACE接口连续收到单拍(1-beat)非共享(non-shareable)事务时&#xff0c;地址通道的实际带宽只有理论值的一半。…

作者头像 李华
网站建设 2026/5/30 0:23:12

抖音视频批量采集助手:5分钟搞定多用户视频高效下载

抖音视频批量采集助手&#xff1a;5分钟搞定多用户视频高效下载 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动下载抖音视频而烦恼吗&#xff1f;想象一下&#xff0c;你需要收集多个创作者的视…

作者头像 李华
网站建设 2026/5/30 0:22:50

多模块自组织神经网络设计及其在污水检测中的应用方案【附数据】

✨ 长期致力于多模块神经网络、动态集成、结构自组织、污水处理过程、智能检测系统研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于神经元尖峰传递…

作者头像 李华