本节课学习内容
-
敌人头顶显示红色血条
-
屏幕左上角显示玩家图形化血条
-
血条长度和宽度随血量变化
-
史莱姆、骷髅、蝙蝠各有不同颜色血条
完整代码
需要改动两个文件: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. 添加绘制血条的方法:
cs
// ★ 画玩家图形血条
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 方法:
cs
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 方法中,敌人绘制那一行后面加上血条:
cs
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);
}
本节课学习到此结束,我是魔法阵维护师,关注我,下期更精彩!