当变量发生改变时,我该如何运行一个代码块?

3

我正在编写一个小游戏的代码,自然而然地,我有很多变量,每当它们变化时都会执行不同的操作。我的问题是,是否可能告诉我的代码在每次变量更改时运行某些特定的代码行,以避免反复输入相同的代码行?

例子:

    Hero1.Health = 10;
    Hero1.MaxHealth = 12;
    ProgressBarHeroHealth1.Max = Hero1.MaxHealth;
    ProgressBarHeroHealth1.Value = Hero1.Health;

如果我改变英雄的生命值,我希望进度条的值能够自动随之更改,而不必每次手动记录。我不知道这是否可能,或者我是否期望过高,所以我来向您寻求答案。任何信息都将不胜感激。

3
你可以在 Health 属性的设置器中实现这个操作。 - Michael Roy
1
你可能想要了解一下事件驱动编程(https://en.wikipedia.org/wiki/Event-driven_programming)。 - rafaelc
有一个名为 SetHealthValues(int health, int maxHealth) 的方法会更合理,你可以在其中设置属性和进度条。这样你只需要调用一个方法,它就能为你处理一切。 - maccettura
或者更好的方法是创建一个 HealthController 类,并将所有辅助方法放在其中。 - jdmdevdotnet
2个回答

3

初学者

你可以为控件编写扩展方法,例如:

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。

高级

但你知道什么会真正酷吗?一个可以自动更新的进度条。嗯...也许它可以监听某种事件....

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);

...这将把它设置在英雄上,并自动通知进度条更新自己。


1

这是可能的。假设您有一个名为Hero的类,当生命值增加或减少时,您想要更改进度条的颜色,则可以:

Class Hero
{

Public String Name{get; set;}
Public Double health;
Public Double Health
{
    get
    {
        return health;

    }
    set
    {
       //Here you can place a function which can easily check the value of health and work accordingly.

       ProgressBarColorChange(value+health);

       health = value;
    } 
 } 
 Public void ProgressBarColorChange(double health)
 {
   //Color Change Fuction Implementation
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接