Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        // @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());
        }
Esempio n. 3
0
 public void RemoveTicker(FTickerDelegate inDelegate)
 {
     foreach (var el in elements)
     {
         if (el.Equals(inDelegate))
         {
             el.Terminate();
         }
     }
 }
Esempio n. 4
0
        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;
        }
Esempio n. 5
0
 // 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);
 }
Esempio n. 6
0
        /// <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);
            }
        }
Esempio n. 7
0
 public void Terminate()
 {
     theDelegate = null;
 }
Esempio n. 8
0
 public bool Equals(FTickerDelegate inDelegate)
 {
     return(theDelegate == inDelegate);
 }
Esempio n. 9
0
 // 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;
 }