【问题标题】:Using a class property to enable/disable timer使用类属性启用/禁用计时器
【发布时间】:2023-03-29 14:45:02
【问题描述】:

好的,希望我没有让这件事变得过于复杂。我知道我可以使用 timer.Enabled = false 或 timer.Stop() 来停止计时器,但我想将一个属性合并到我的主播放器类中来控制计时器。例如,如果我的玩家有一个布尔属性“healing”,我希望玩家的属性设置为healing == true,计时器开始,以及player.healing 属性更改为healing = = false,计时器停止。这样做的原因是我希望我的主游戏循环继续运行,而我的玩家继续玩游戏并进行治疗,并且当在游戏中采取行动时,或者当玩家达到完全健康时,计时器停下来。

目前我有一个运行每个计时器滴答的函数,并评估玩家是否完全健康,如果是,则停止计时器。但是,我只是认为能够将 bool 属性从 false 翻转为 true,反之亦然,会更有用。非常感谢任何帮助/想法/建议!

【问题讨论】:

  • 什么时候为玩家的健康设置 bool 属性?设置 bool 时运行的计时器。

标签: c#


【解决方案1】:

属性设置器只是一个函数,所以非常简单:

private bool healing = false;
public bool Healing
{
     get { return healing; }
     set
     {
         healing = value;
         if (healing)
            timer.Start();
         else
            timer.Stop();
     }
}

您要小心属性设置器中的副作用,因为如果您实际上不希望每次设置值时运行逻辑,您需要通过一个单独的函数:

public bool Healing { get; set; }

public void SetHealingWithTimer(bool status)
{
     Healing = status;
     if (Healing)
         timer.Start();
     else
         timer.Stop();
}

【讨论】:

  • 谢谢!我认为这会很好地工作,我不知道你可以使用这样的属性。 :) 与仅使用 timer.Enabled == true/false 并让 timer.Elapsed 方法评估是否停止计时器相比,这种方法有什么真正的优势吗?只是好奇。
  • @parrotsnest 我不确定你的意思。至于timer.Enabled,我认为Start/Stop 更符合地道。但这并不重要。你在问timer.Elapsed 的问题是什么?
  • @BradleyDotNET 我想我正在寻找类似 objectinstance.heal == true 来启动计时器和 objectinstance.heal == false 来停止计时器。事后看来,我认为你是对的,我只是想让这个过程过于复杂,当 timer.Enabled == true/false 会工作得很好。由于我是该站点的新手,我需要做些什么来关闭它并表明我找到了解决方案吗?谢谢!祝大家欢呼。 :)
【解决方案2】:

你不能这样做吗:

private Timer timer;

public bool Healing
{
    get
    {
        return timer.Enabled;
    }
    set
    {
        timer.Enabled=value;
    }
}

【讨论】:

  • 为您修复了格式。我会小心,计时器启用状态是否真的表示玩家是否正在治疗?
  • 谢谢你 :) 我也猜到了。
【解决方案3】:

在玩家完全健康后运行计时器并没有错。只是限制最大健康,即

if(health < maxHealth)
{
    healing = true;
    health += healthModifier;
}
else
{       
    healing = false;        
}

//fix health meter, if above maximum
if(health > maxHealth)
{
    health = maxHealth;
}

这也更加灵活,因为您可以稍后提供临时的最大生命值提升,这将取决于另一个计时器(例如)。

【讨论】:

  • 没错,但你可能有理由进入“治疗”状态(如果你必须激活技能,或者如果敌人可以阻止它)。
  • @BradleyDotNET:现在更有意义了吗?
  • 是的,你真的不需要改变任何东西,它实际上只是一个评论:)。我赞成您和 Pheonix 的答案作为解决此问题的有效替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多