예제 #1
0
        public void _clear()
        {
            if (null == firstNode)
            {
                return;
            }

            SignalNode <T> t = firstNode;
            SignalNode <T> n;

            while (t != null)
            {
                t.action = null;
                if (NodePool.Count > MAX)
                {
                    break;
                }
                n = t.next;

                t.action = null;
                t.pre    = t.next = null;
                NodePool.Push(t);

                t = n;
            }

            maping    = null;
            firstNode = lastNode = null;
            len       = 0;
        }
예제 #2
0
        public void _clear()
        {
            if (null == firstNode)
            {
                return;
            }

            SignalNode t = firstNode;

            while (t != null)
            {
                t.data = null;
                if (nodePool.Count < MAX)
                {
                    nodePool.Push(t);
                }
                else
                {
                    break;
                }
                t = t.next;
            }

            maping    = null;
            firstNode = lastNode = null;
            len       = 0;
        }
예제 #3
0
        public void render(float deltaTime)
        {
            if (len < 1)
            {
                TickManager.Remove(render);
                return;
            }
            float now = Time.realtimeSinceStartup;
            float dis = now - pre;

            if (dis < delayTime - 0.016f)
            {
                return;
            }
            pre = now;

            dispatching = true;
            SignalNode <float> t = firstNode;

            List <SignalNode <float> > temp = GetSignalNodeList();

            while (t != null)
            {
                if (t.active == NodeActiveState.Runing)
                {
                    float delta = delayTime;
                    if (t.data != -1)
                    {
                        delta = t.data - pre;
                        if (delta < 0)
                        {
                            ___removeHandle(t.action);
                        }
                    }
                    t.action(delta);
                }
                temp.Add(t);
                t = t.next;
            }
            dispatching = false;

            int l = temp.Count;

            for (int i = 0; i < l; i++)
            {
                SignalNode <float> item = temp[i];
                if (item.active == NodeActiveState.ToDoDelete)
                {
                    _remove(item, item.action);
                }
                else if (item.active == NodeActiveState.ToDoAdd)
                {
                    item.active = NodeActiveState.Runing;
                }
            }
            Recycle(temp);
        }
예제 #4
0
        public bool ___addHandle(Action <T> value, T data, bool forceData = false)
        {
            if (maping == null)
            {
                maping = new Dictionary <Action <T>, SignalNode <T> >();
            }
            SignalNode <T> t = null;

            if (maping.TryGetValue(value, out t))
            {
                if (t.active == NodeActiveState.ToDoDelete)
                {
                    if (dispatching)
                    {
                        t.active = NodeActiveState.ToDoAdd;
                    }
                    else
                    {
                        t.active = NodeActiveState.Runing;
                    }
                    t.data = data;
                    return(true);
                }
                if (forceData)
                {
                    t.data = data;
                }
                return(false);
            }

            t        = getSignalNode();
            t.action = value;
            t.data   = data;
            maping.Add(value, t);

            if (dispatching)
            {
                t.active = NodeActiveState.ToDoAdd;
            }

            if (lastNode != null)
            {
                lastNode.next = t;
                t.pre         = lastNode;
                lastNode      = t;
            }
            else
            {
                firstNode = lastNode = t;
            }

            len++;

            return(true);
        }
예제 #5
0
        internal bool invokeEvent(EventX e)
        {
            if (mEventListeners == null)
            {
                return(false);
            }

            Signal signal;

            if (mEventListeners.TryGetValue(e.type, out signal) == false)
            {
                return(false);
            }

            SignalNode <EventX> t = signal.firstNode;

            if (t == null)
            {
                return(false);
            }

            List <Action <EventX> > temp = SimpleListPool <Action <EventX> > .Get();

            int i = 0;

            while (t != null)
            {
                temp.Add(t.action);
                t = t.next;
                i++;
            }

            e.setCurrentTarget(mTarget);

            Action <EventX> listener;

            for (int j = 0; j < i; j++)
            {
                listener = temp[j];

                listener(e);

                if (e.stopsImmediatePropagation)
                {
                    return(true);
                }
            }

            SimpleListPool <Action <EventX> > .Release(temp);

            return(e.stopsPropagation);
        }
예제 #6
0
        protected bool addHandle(Action <EventX> value)
        {
            if (maping == null)
            {
                maping = new Dictionary <Action <EventX>, SignalNode>();
            }
            SignalNode t = null;

            if (maping.TryGetValue(value, out t))
            {
                if (t.active == 0)
                {
                    if (dispatching)
                    {
                        t.active = 2;
                    }
                    else
                    {
                        t.active = 1;
                    }
                    return(true);
                }
                return(false);
            }

            t      = getSignalNode();
            t.data = value;
            maping.Add(value, t);

            if (dispatching)
            {
                t.active = 2;
            }

            if (lastNode != null)
            {
                lastNode.next = t;
                t.pre         = lastNode;
                lastNode      = t;
            }
            else
            {
                firstNode = lastNode = t;
            }

            len++;

            return(true);
        }
예제 #7
0
        protected SignalNode <T> getSignalNode()
        {
            SignalNode <T> t;

            if (NodePool.Count > 0)
            {
                t        = NodePool.Pop();
                t.active = NodeActiveState.Runing;
            }
            else
            {
                t = new SignalNode <T>();
            }
            return(t);
        }
예제 #8
0
        protected SignalNode getSignalNode()
        {
            SignalNode t;

            if (nodePool.Count > 0)
            {
                t        = nodePool.Pop();
                t.next   = t.pre = null;
                t.active = 1;
            }
            else
            {
                t = new SignalNode();
            }
            return(t);
        }
예제 #9
0
        protected bool _remove(SignalNode <T> t, Action <T> value)
        {
            if (t == null)
            {
                DebugX.LogError("queueHandle error nil");
            }

            SignalNode <T> pre  = t.pre;
            SignalNode <T> next = t.next;

            if (pre != null)
            {
                pre.next = next;
            }
            else
            {
                firstNode = next;
            }

            if (next != null)
            {
                next.pre = pre;
            }
            else
            {
                lastNode = pre;
            }
            t.active = NodeActiveState.ToDoDelete;

            maping.Remove(value);

            if (NodePool.Count < MAX)
            {
                t.action = null;
                t.pre    = t.next = null;
                NodePool.Push(t);
            }
            len--;

            if (len < 0)
            {
                DebugX.LogError("QueueHandle lenError:" + len);
            }

            return(true);
        }
예제 #10
0
        protected bool _remove(SignalNode t, Action <EventX> value)
        {
            if (t == null)
            {
                DebugX.Log("d");
            }

            SignalNode pre  = t.pre;
            SignalNode next = t.next;

            if (pre != null)
            {
                pre.next = next;
            }
            else
            {
                firstNode = next;
            }



            if (next != null)
            {
                next.pre = pre;
            }
            else
            {
                lastNode = pre;
            }
            t.active = 0;

            maping.Remove(value);

            if (nodePool.Count < MAX)
            {
                t.data = null;
                nodePool.Push(t);
            }
            len--;

            return(true);
        }
예제 #11
0
        protected bool removeHandle(Action <EventX> value)
        {
            if (lastNode == null || maping == null)
            {
                return(false);
            }

            SignalNode t = null;

            if (maping.TryGetValue(value, out t) == false || t.active == 0)
            {
                return(false);
            }

            if (dispatching)
            {
                t.active = 0;
                return(true);
            }

            return(_remove(t, value));
        }
예제 #12
0
        public void dispatch(T e)
        {
            if (len > 0)
            {
                dispatching = true;
                SignalNode <T> t = firstNode;

                List <SignalNode <T> > temp = GetSignalNodeList();

                while (t != null)
                {
                    if (t.active == NodeActiveState.Runing)
                    {
                        t.action(e);
                    }
                    temp.Add(t);
                    t = t.next;
                }
                dispatching = false;

                int l = temp.Count;
                for (int i = 0; i < l; i++)
                {
                    SignalNode <T> item = temp[i];

                    if (item.active == NodeActiveState.ToDoDelete)
                    {
                        _remove(item, item.action);
                    }
                    else if (item.active == NodeActiveState.ToDoAdd)
                    {
                        item.active = NodeActiveState.Runing;
                    }
                }


                Recycle(temp);
            }
        }
예제 #13
0
        public bool ___removeHandle(Action <T> value)
        {
            if (lastNode == null || maping == null)
            {
                return(false);
            }

            SignalNode <T> t = null;

            if (maping.TryGetValue(value, out t) == false || t.active == NodeActiveState.ToDoDelete)
            {
                return(false);
            }

            if (dispatching)
            {
                t.active = NodeActiveState.ToDoDelete;
                return(true);
            }

            return(_remove(t, value));
        }
예제 #14
0
        public void dispatch(EventX e)
        {
            if (len > 0)
            {
                dispatching = true;
                SignalNode t = firstNode;

                List <SignalNode> temp = getSignalNodeList();

                while (t != null)
                {
                    if (t.active == 1)
                    {
                        t.data(e);
                    }
                    temp.Add(t);
                    t = t.next;
                }
                dispatching = false;

                foreach (SignalNode item in temp)
                {
                    if (item.active == 0)
                    {
                        _remove(item, item.data);
                    }
                    else if (item.active == 2)
                    {
                        item.active = 1;
                    }
                }


                recycle(temp);
            }
        }
예제 #15
0
        public bool add(Action <EventX> value, int priority = 0)
        {
            if (maping == null)
            {
                maping = new Dictionary <Action <EventX>, SignalNode <EventX> >();
            }

            SignalNode <EventX> t = null;

            if (maping.TryGetValue(value, out t))
            {
                //如果已被删除过程中又被添加(好神奇的逻辑,但必然会有这种情况,不是可能);
                if (t.active == NodeActiveState.ToDoDelete)
                {
                    if (dispatching)
                    {
                        t.active = NodeActiveState.ToDoAdd;
                    }
                    else
                    {
                        t.active = NodeActiveState.Runing;
                    }
                    return(true);
                }
                return(false);
            }

            SignalNode <EventX> newNode = getSignalNode();

            newNode.action   = value;
            newNode.priority = priority;

            maping[value] = newNode;

            if (dispatching)
            {
                newNode.active = NodeActiveState.ToDoAdd;
            }

            if (firstNode == null)
            {
                len      = 1;
                lastNode = firstNode = newNode;
                return(true);
            }

            SignalNode <EventX> findNode = null;

            if (priority > lastNode.priority)
            {
                t = firstNode;
                SignalNode <EventX> pre;
                //var next:SignalNode;
                while (null != t)
                {
                    if (priority > t.priority)
                    {
                        pre = t.pre;
                        //next=t.next;
                        newNode.next = t;
                        t.pre        = newNode;

                        if (null != pre)
                        {
                            pre.next    = newNode;
                            newNode.pre = pre;
                        }
                        else
                        {
                            firstNode = newNode;
                        }

                        findNode = t;

                        break;
                    }
                    t = t.next;
                }
            }

            if (null == findNode)
            {
                lastNode.next = newNode;
                newNode.pre   = lastNode;
                lastNode      = newNode;
            }
            len++;
            return(true);
        }