gpt4 book ai didi

c# - 如何让代码块在变量更改时运行?

转载 作者:行者123 更新时间:2023-11-30 15:16:35 26 4
gpt4 key购买 nike

我很自然地为一个小游戏编写代码,我有很多变量,只要它们发生变化,它们就会做不同的事情。我的问题是,是否可以告诉我的代码在每次变量更改时运行某些代码行,以避免一遍又一遍地重复输入相同的行?

例子:

    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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com