从零开发游戏需要学习的c#模块,第二十八章(血条显示 —— 敌人与玩家生命可视化)
本节课学习内容敌人头顶显示红色血条屏幕左上角显示玩家图形化血条血条长度和宽度随血量变化史莱姆、骷髅、蝙蝠各有不同颜色血条完整代码需要改动两个文件Enemy.cs和Game1.cs。第一步给Enemy.cs添加绘制血条的方法在Enemy类的末尾添加以下方法csharp// ★ 绘制敌人血条 public virtual void DrawHealthBar(SpriteBatch spriteBatch) { if (!IsAlive) return; int barWidth 30; int barHeight 4; int barY (int)(Position.Y - texture.Height / 2 - 10); // 背景黑色 Rectangle bgRect new Rectangle( (int)Position.X - barWidth / 2, barY, barWidth, barHeight ); // 血量根据剩余比例计算宽度 float healthPercent (float)Hp / MaxHp; int currentBarWidth (int)(barWidth * healthPercent); Rectangle healthRect new Rectangle( (int)Position.X - barWidth / 2, barY, currentBarWidth, barHeight ); // 创建临时纹理简单方法 Texture2D pixel new Texture2D(spriteBatch.GraphicsDevice, 1, 1); pixel.SetData(new[] { Color.White }); spriteBatch.Draw(pixel, bgRect, Color.Black); spriteBatch.Draw(pixel, healthRect, color); // 使用敌人自身颜色 }第二步改造Game1.cs的血量显示把Game1.cs里的 UI 部分从文字血条改成图形血条。以下是完整的Game1.cs为了节省篇幅这里只贴改动过的部分。用这些方法替换你现有文件中的对应方法。1. 添加绘制血条的方法// ★ 画玩家图形血条 private void DrawPlayerHealthBar(SpriteBatch spriteBatch, int x, int y, int width, int height) { float healthPercent (float)player.Hp / player.MaxHp; // 背景 Texture2D pixel new Texture2D(GraphicsDevice, 1, 1); pixel.SetData(new[] { Color.White }); spriteBatch.Draw(pixel, new Rectangle(x, y, width, height), Color.DarkGray); // 血量颜色绿 → 黄 → 红 Color barColor; if (healthPercent 0.5f) barColor Color.LimeGreen; else if (healthPercent 0.25f) barColor Color.Yellow; else barColor Color.Red; // 当前血量 int currentWidth (int)(width * healthPercent); spriteBatch.Draw(pixel, new Rectangle(x, y, currentWidth, height), barColor); // 边框 spriteBatch.Draw(pixel, new Rectangle(x, y, width, 1), Color.White); spriteBatch.Draw(pixel, new Rectangle(x, y height - 1, width, 1), Color.White); spriteBatch.Draw(pixel, new Rectangle(x, y, 1, height), Color.White); spriteBatch.Draw(pixel, new Rectangle(x width - 1, y, 1, height), Color.White); }2. 替换DrawGameUI方法private void DrawGameUI() { // 分数文字 _spriteBatch.DrawString(font, $分数{score}, new Vector2(10, 10), Color.White); _spriteBatch.DrawString(font, $最高分{saveData.HighScore}, new Vector2(10, 35), Color.Gold); // ★ 图形血条 DrawPlayerHealthBar(_spriteBatch, 10, 65, 200, 20); _spriteBatch.DrawString(font, ${player.Hp}/{player.MaxHp}, new Vector2(220, 63), Color.White); _spriteBatch.DrawString(font, $敌人{enemies.Count} | 子弹{bullets.Count}, new Vector2(10, 95), Color.Yellow); _spriteBatch.DrawString(font, WASD移动 | 鼠标瞄准左键射击 | M静音, new Vector2(10, 570), Color.LightGray); }3. 在DrawGameWorld里给敌人画血条在DrawGameWorld方法中敌人绘制那一行后面加上血条private void DrawGameWorld() { tileMap.Draw(_spriteBatch); foreach (Vector2 coinPos in coins) _spriteBatch.Draw(coinTexture, coinPos, null, Color.White, 0f, new Vector2(12, 12), 1f, SpriteEffects.None, 0f); foreach (Enemy enemy in enemies) { enemy.Draw(_spriteBatch); enemy.DrawHealthBar(_spriteBatch); // ★ 画血条 } foreach (Bullet bullet in bullets) bullet.Draw(_spriteBatch); particleSystem.Draw(_spriteBatch); player.Draw(_spriteBatch); }本节课学习到此结束我是魔法阵维护师关注我下期更精彩