作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很自然地为一个小游戏编写代码,我有很多变量,只要它们发生变化,它们就会做不同的事情。我的问题是,是否可以告诉我的代码在每次变量更改时运行某些代码行,以避免一遍又一遍地重复输入相同的行?
例子:
Hero1.Health = 10;
Hero1.MaxHealth = 12;
ProgressBarHeroHealth1.Max = Hero1.MaxHealth;
ProgressBarHeroHealth1.Value = Hero1.Health;
如果我改变了英雄的生命值,我希望进度条值自动随之改变,而不必在每次改变时都写下来。
我不知道这是否完全可能,或者我只是希望太多,所以我来找你寻求答案。任何信息将不胜感激。
最佳答案
您可以为控件编写一个扩展方法,例如
static class ExtensionMethods
{
static public void SetHealth(this ProgressBar control, Hero hero)
{
control.Max = hero.MaxHealth;
control.Value = hero.Health;
}
}
然后这样调用它:
ProgressBarHeroHealth1.SetHealth(Hero1);
现在扩展方法很酷,但这是最愚蠢的使用方法。如果控件类不是密封的,更好的设计是编写一个合适的方法:
public class HealthBar : ProgressBar
{
public void SetHealth(Hero hero)
{
this.Max = hero.MaxHealth;
this.Value = hero.Health;
}
}
并以同样的方式调用它:
HealthBarHeroHealth1.SetHealth(Hero1);
(为了使其工作,您必须在您使用的任何 UI 平台中使用 HealthBar 而不是 ProgressBar)。
但是你知道什么才是真正酷的吗?一个 self 更新的进度条。嗯……也许如果它监听了某种事件……
class HeroHealthBar : ProgressBar
{
protected readonly Hero _hero;
public HeroHealthBar(Hero hero) : base()
{
_hero = hero;
hero.HealthChanged += this.Hero_HealthChanged;
}
public void Hero_HealthChanged(object sender, EventArgs e)
{
this.Max = _hero.MaxHealth;
this.Value = _hero.Health;
}
}
当然,您需要一个引发事件的 Hero 类....
class Hero
{
public event EventHandler HealthChanged;
public void SetHealth(int current, int max)
{
_health = current;
_maxHealth = max;
OnHealthChanged();
}
protected void OnHealthChanged()
{
if (HealthChanged != null) HealthChanged(this, EventArgs.Empty);
}
}
一旦完成所有这些设置,当你想设置健康时,你所要做的就是写
_hero.SetHealth(current,max);
...这会将其设置在英雄上并自动通知进度条也进行 self 更新。
关于c# - 如何让代码块在变量更改时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49080419/
我是一名优秀的程序员,十分优秀!