рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВ 1: рд╡рд┐рд▓рдВрдмрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рдлрд╝рдВрдХреНрдЯрд░ рдкреНрд░рдмрдВрдзрдХ)

рдЧреЗрдо рдмрдирд╛рддреЗ рд╕рдордп, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ - рдХрд┐рд╕ рдШрдЯрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рдмрд╛рджред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЕрдкрдирд╛ рдЖрдВрддрд░рд┐рдХ рдЯрд╛рдЗрдорд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рджреЗрд░реА рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЬреЛрдбрд╝рдХрд░)ред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рд╕реНрдердЧрд┐рдд рдкрджреНрдзрддрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдкрдирд╛ рдЯрд╛рдЗрдорд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЦрд┐рдбрд╝рдХреА, рд░реЗрдЦрд╛ рдЫрд┐рдкрд╛рдПрдВ, рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдПрдХ рдЖрдЗрдХрди рдпрд╛ рдкреНрд░рднрд╛рд╡ рджрд┐рдЦрд╛рдПрдВ, рдХреБрдЫ рдФрд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рджреЗрд░реА рдХреЗ рд╕рд╛рдеред рдПрдХ рдмрд╛рд░ рдпрд╛ рдХрдИ рдмрд╛рд░ред

рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХреА, рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдлрд╝рдиреНрдЯрд░ рдореИрдиреЗрдЬрд░ рдХрд╣рд╛ (рд╢рд╛рдпрдж рдРрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдЕрдиреНрдп рд╢рдмреНрдж рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рд╡реЗ рдореБрдЭреЗ рдмрддрд╛рдПрдВрдЧреЗ)ред

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХреЛрдб C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C # рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ C # рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреВрдВрдЧрд╛ред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб (C #)ред



functor



рдПрдХ рдлрд╝рдирдХрд╛рд░ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╣реИ рдЬреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред

рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
рдЧрд╛рдЗрдб - рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬреЛ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдмрдирд╛рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдлрд╝рдирдХрд╛рд░ рдХреЛ рд╣рдЯрд╛ рд╕рдХреЗрдВред
_deltaTime рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЯрд╛рдЗрдорд░ рд╣реИред рдпрд╣ рдЙрд╕ рд╕рдордп рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
_func - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдЯрд╛рдЗрдорд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдХрд┐рд╕ рдЕрд╡рдзрд┐ (рд╕реЗрдХрдВрдб рдореЗрдВ) рдХреЗ рдмрд╛рдж рдлрд╝рдирдХрд╛рд░ рдХреЛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рджреЛрд╣рд░рд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди 0.0f рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ рдкреАрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред
_funcArg рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд╣реИред рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд╝рдирдХрд╛рд░ рдХреЛрдб рд╕рд░рд▓ рд╣реИ - рдЦреЗрддреЛрдВ рдореЗрдВ рднрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛, рдФрд░ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдзрд┐ рдЬреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рд╡рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рд╣реИред рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЯрд┐рдХреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рдкрд╕реА рдорд╛рди рдЯрд╛рдЗрдорд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

рдлреИрди рдХреЛрдб:
public delegate float Func(object funcArg); public class HOFunctor { float _deltaTime = 0; Func _func = null; object _funcArg = null; Guid _id = Guid.Empty; public HOFunctor(float deltaTime, Func func, object funcArg) { _id = Guid.NewGuid(); _deltaTime = deltaTime; _func = func; _funcArg = funcArg; } public HOFunctor(float deltaTime, Func func) : this(deltaTime, func, null) { } public bool Process(float deltaTime) { if (_func != null) { _deltaTime -= deltaTime; if (_deltaTime <= 0) { _deltaTime = _func(_funcArg); } } return _deltaTime > 0; } public Guid ID { get { return _id; } } } 


рдлрд╝рдирдХрд╛рд░ рдкреНрд░рдмрдВрдзрдХ



рдПрдХ рдлрд╝рдирдХрд╛рд░ рдкреНрд░рдмрдВрдзрдХ рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 2 рд╕реВрдЪрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬреЛ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╣реИрдВ)ред

рддреЛ, рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ 2 рд╕реВрдЪрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕ рд╕рдордп рд╕рдХреНрд░рд┐рдп рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдирдП рдЬреЛрдбрд╝реЗ рдЧрдП рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╕реЗ рднрд░рд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕рдХреНрд░рд┐рдп рд╕реВрдЪреА рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рдПрдХ рдЪрд░ _currentIndex рднреА рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕реА рд╕реВрдЪреА рд╕рдХреНрд░рд┐рдп рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдзрд┐рдпрд╛рдВ рднреА рд╕рд╣рдЬ рд╣реИрдВ (AddFunctor (...) - рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНтАНрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, RemoveFunctor () - рд╕реВрдЪреА рд╕реЗ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ)ред рдХреЗрд╡рд▓ рд╕рдордЭрд╛рдиреЗ рдпреЛрдЧреНрдп рдореВрд▓реНрдп ProcessFunctors (рдлреНрд▓реЛрдЯ рдбреЗрд▓реНрдЯрд╛) рд╡рд┐рдзрд┐ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рдХреЛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рд╕рдордп рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рдП рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдлрд╝рдирдХрд╛рд░ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА рд╡рд╣ рд╕рдордп рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рдЗрд╕реЗ рдирдИ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╕рдХреНрд░рд┐рдп рд╕реВрдЪреА рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдкреНрд░рдмрдВрдзрдХ рдХреЛрдб:
 public class HOFunctorMgr { #region Private fields private static HOFunctorMgr _instance = null; protected Dictionary<Guid, HOFunctor>[] _functors = { new Dictionary<Guid, HOFunctor>(), new Dictionary<Guid, HOFunctor>() }; int _currentIndex = 0; private HOFunctorMgr() { } #endregion public static HOFunctorMgr Instance { get { if (_instance == null) { _instance = new HOFunctorMgr(); } return _instance; } } #region Public methods public Guid AddFunctor(float deltaTime, Func func, object funcArg) { return AddFunctor(new HOFunctor(deltaTime, func, funcArg)); } public Guid AddFunctor(float deltaTime, Func func) { return AddFunctor(new HOFunctor(deltaTime, func, null)); } public Guid AddFunctor(HOFunctor functor) { if (functor != null && !_functors[_currentIndex].ContainsKey(functor.ID)) { _functors[_currentIndex].Add(functor.ID, functor); return functor.ID; } return Guid.Empty; } public void ProcessFunctors(float delta) { int indexToProcess = _currentIndex; _currentIndex ^= 1; foreach (HOFunctor f in _functors[indexToProcess].Values) { if (f.Process(delta)) { AddFunctor(f); } } _functors[indexToProcess].Clear(); } public void RemoveFunctor(Guid id) { if (_functors[0].ContainsKey(id)) { _functors[0].Remove(id); } if (_functors[1].ContainsKey(id)) { _functors[1].Remove(id); } } #endregion } 


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХреАрдХрд░рдг 1 рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЪреБрдиреМрддреА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ

HOFunctorMgr.Instance.ProcessFunctors (рдбреЗрд▓реНрдЯрд╛);

рдЧреЗрдо рд▓реВрдк рдореЗрдВ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░рдмрдВрдзрдХ рдлрд╝рдВрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ (NeoAxis рдЗрдВрдЬрди) рдпрд╣ рдЧреЗрдо рд╡рд┐рдВрдбреЛ рдХрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб void OnTick (рдлреНрд▓реЛрдЯ рдбреЗрд▓реНрдЯрд╛) рд╡рд┐рдзрд┐ рд╣реИред

рдбреЗрд▓реНрдЯрд╛ рд╕рдордп рд╣реИ, рд╕реЗрдХрдВрдб рдореЗрдВ, рдкрд┐рдЫрд▓реА рдХреЙрд▓ рд╕реЗ рд╕рдорд╛рдкреНрддред

рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг



рдПрдХрд▓ рдХреЙрд▓:

 GameEntities.HOFunctorMgr.Instance.AddFunctor(2.0f, arg => { HidePuzzleWindow(); return 0.0f; }, null ); 


2 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, HidePuzzleWindow () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╣реЗрд▓реА рд╡рд┐рдВрдбреЛ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдПрдХрд╛рдзрд┐рдХ рдХреЙрд▓:

 ... int k = 5; HOFunctorMgr.Instance.AddFunctor(5, arg => { GameMap.Instance.AddScreenMessage(string.Format("{0}", arg)); if (k-- >= 0) { return 5; } return 0; }, "test"); 


рд╣рд░ рдмрд╛рд░ 5 рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде, рд╢рдмреНрдж рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЛ 5 рдмрд╛рд░ рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд░рд╛рд▓, рд╡реИрд╕реЗ, рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУ:
 static float MyMethod(object arg) { if (arg != null) { ... } return 0; } HOFunctorMgr.Instance.AddFunctor(10, MyMethod, someObject); 


10 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, рд╕реНрдерд┐рд░ MyMethod рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ



рдЖрдк рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдЧреИрд░-рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдФрд░ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рджреЛрдиреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ / рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреВрд░реНрдг рд╡рд░реНрдЧ рдХреЛрдб



NeoAxis рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдХреЛрдб, рдиреЗрдорд╕реНрдкреЗрд╕ рддреЗрдЬ рдХрд┐рдпрд╛ред

 using System; using System.Collections.Generic; using System.Text; namespace GameEntities { public delegate float Func(object funcArg); public class HOFunctor { float _deltaTime = 0; Func _func = null; object _funcArg = null; Guid _id = Guid.Empty; public HOFunctor(float deltaTime, Func func, object funcArg) { _id = Guid.NewGuid(); _deltaTime = deltaTime; _func = func; _funcArg = funcArg; } public HOFunctor(float deltaTime, Func func) : this(deltaTime, func, null) { } public bool Process(float deltaTime) { if (_func != null) { _deltaTime -= deltaTime; if (_deltaTime <= 0) { _deltaTime = _func(_funcArg); } } return _deltaTime > 0; } public Guid ID { get { return _id; } } } public class HOFunctorMgr { #region Private fields private static HOFunctorMgr _instance = null; protected Dictionary<Guid, HOFunctor>[] _functors = { new Dictionary<Guid, HOFunctor>(), new Dictionary<Guid, HOFunctor>() }; int _currentIndex = 0; private HOFunctorMgr() { } #endregion public static HOFunctorMgr Instance { get { if (_instance == null) { _instance = new HOFunctorMgr(); } return _instance; } } #region Public methods public Guid AddFunctor(float deltaTime, Func func, object funcArg) { return AddFunctor(new HOFunctor(deltaTime, func, funcArg)); } public Guid AddFunctor(float deltaTime, Func func) { return AddFunctor(new HOFunctor(deltaTime, func, null)); } public Guid AddFunctor(HOFunctor functor) { if (functor != null && !_functors[_currentIndex].ContainsKey(functor.ID)) { _functors[_currentIndex].Add(functor.ID, functor); return functor.ID; } return Guid.Empty; } public void ProcessFunctors(float delta) { int indexToProcess = _currentIndex; _currentIndex ^= 1; foreach (HOFunctor f in _functors[indexToProcess].Values) { if (f.Process(delta)) { AddFunctor(f); } } _functors[indexToProcess].Clear(); } public void RemoveFunctor(Guid id) { if (_functors[0].ContainsKey(id)) { _functors[0].Remove(id); } if (_functors[1].ContainsKey(id)) { _functors[1].Remove(id); } } #endregion } } 


Source: https://habr.com/ru/post/In121244/


All Articles