/// <summary> /// Add a new ticker with a given delay / interval /// </summary> /// <param name="del">Delegate to fire after the delay</param> /// <param name="delay">Delay until next fire; 0 means "next frame"</param> public static void AddTicker(FTickerDelegate del, float delay = 0) { if (del == null || del.Method == null) { return; } if (!FThreading.IsInGameThread()) { FThreading.RunOnGameThread(delegate { AddTicker(del, delay); }); return; } FTicker existingTicker; if (handlersReverse.TryGetValue(del.Method, out existingTicker)) { RemoveTicker(del); } FTicker ticker = new FTicker(); ticker.del = del; Native_FTicker.Reg_CoreTicker(IntPtr.Zero, ticker.callback, ref ticker.handle, true, delay); handlers[ticker] = del.Method; handlersReverse[del.Method] = ticker; }
// @inDelegae the function will be fired // @inDelay delay before fire // @handle can be used later to find this delegate public int AddTicker(FTickerDelegate inDelegate, float inDelay) { var e = new FElement(currentTime + inDelay, inDelay, inDelegate); elements.AddFirst(e); return(e.GetHashCode()); }
public void RemoveTicker(FTickerDelegate inDelegate) { foreach (var el in elements) { if (el.Equals(inDelegate)) { el.Terminate(); } } }
public static void Init(IntPtr addTickerAddr, IntPtr isInGameThreadAddr, FSimpleDelegate onRuntimeChanged) { isInGameThread = (Del_IsInGameThread)Marshal.GetDelegateForFunctionPointer(isInGameThreadAddr, typeof(Del_IsInGameThread)); Debug.Assert(IsInGameThread(), "USharp should only be loaded from the game thread"); addStaticTicker = (Del_AddStaticTicker)Marshal.GetDelegateForFunctionPointer(addTickerAddr, typeof(Del_AddStaticTicker)); ticker = Tick; addStaticTicker(ticker, 0.0f); OnRuntimeChanged = onRuntimeChanged; }
// Invoke the delegate if possible public bool Tick(float deltaTime) { if (theDelegate == null) { return(false); } if (theDelegate(deltaTime)) { return(true); } theDelegate = null; // terminate return(false); }
/// <summary> /// Removes a previously added ticker delegate.<para/> /// /// Note: will remove ALL tickers that use this handle, as there's no way to uniquely identify which one you are trying to remove. /// </summary> /// <param name="del">The ticker to remove.</param> public static void RemoveTicker(FTickerDelegate del) { if (del == null || del.Method == null) { return; } if (!FThreading.IsInGameThread()) { FThreading.RunOnGameThread(delegate { RemoveTicker(del); }); return; } FTicker ticker; if (handlersReverse.TryGetValue(del.Method, out ticker)) { handlers.Remove(ticker); handlersReverse.Remove(del.Method); Native_FTicker.Reg_CoreTicker(IntPtr.Zero, ticker.callback, ref ticker.handle, false, 0); } }
public void Terminate() { theDelegate = null; }
public bool Equals(FTickerDelegate inDelegate) { return(theDelegate == inDelegate); }
// This is the ctor that the code will generally use. public FElement(double inFireTime, float inDelayTime, FTickerDelegate inDelegate, object inDelegateHandle = null) { delayTime = inDelayTime; fireTime = inDelayTime; theDelegate = inDelegate; }