C#如何用单个定时器通知其他类?

C# How to notify other classes with a single timer?

我正在尝试制作一个全局计时器,在经过一定时间后需要通知所有内容。

例如,在游戏中,会有增益和攻击冷却计时器以及物品冷却等等。

单独管理它们很好,但我如何让它们在同一个计时器上全部达到 运行?

我曾尝试使用 SortedList,将浮点数作为键,将委托作为值,以便在时间到了时简单地调用它,但我似乎无法管理它。尝试使用通用参数进行委托,但我无法将其放入排序列表中。

谁能指出我正确的方向?

我可以指出两个选项:

  1. 创建一个类似 TimerControlled 的接口(所有名称都可以更改)使用方法 TimerTick(whatever arguments you need)(以及其他需要的方法),它实现了 class 的计时器滴答逻辑。在使用依赖于计时器的机制的每个 class 上实现接口。最后在你的基础上(逻辑)class 将你所有的 TimerControlled 对象添加到一个数组(TimerControlled),这将允许你循环遍历该数组并调用这些对象的 TimerTick 方法2行代码。

接口:

interface TimerControlled
{
   void TimerTick();
}

在您的每个 classes 中实现它:

public class YourClass: TimerControlled{
   ....
   public void TimerTick(){
      advanceCooldown();
      advanceBuffTimers();
   }
}

最终将您的 class 添加到 TimerControlled 的列表中:

class YourLogicClass{
   List<YourClass> characters= new List<YourClass>();
   private timer;
   List<TimerControlled> timerControlledObjects = new List<TimerControlled>();
   ...
   public void Initialize(){
      ... //your code, character creation and such
      foreach(YourClass character in characters){ //do the same with all objects that have TimerControlled interface implemented
         timerControlledObjects.add(character);
      }
      timer = new Timer();
      timer.Tick += new EventHandler(timerTick)
      timer.Start();

   } 

   public void timerTick(Object sender, EventArgs e){
      foreach(TimerControlled timerControlledObject in timerControlObjects){
         timerControlledObject.TimerTick();
      }
   }

}
  1. (在长 运行 中不是一个很好的选择)静态 class 中的静态计时器,如 Global.timer,这意味着该计时器仅存在 1 个实例。然后将事件处理程序从每个相关 class 附加到计时器以处理计时器滴答。

代码:

public static class Global{
//I usually create such class for global settings
   public static Timer timer= new Timer();
}



class YourLogicClass{
   public void Initialize(){
       ... 
       Global.timer.Start();
   }
}

class YourClass{

   public YourClass(){
      Global.timer.tick += new EventHandler(timerTick);
   }


   private void timerTick(Object sender,EventArgs e){
      advanceCooldowns();
      advanceBuffTimers();
   }
}

请记住,我是凭空写下代码的,因此可能存在一些语法错误,但逻辑是正确的。

如果您对答案还有其他问题,请提出。