Пример #1
0
        public virtual CCPhysicsBody AddBodyOrDelay(CCPhysicsBody body)
        {
            CCPhysicsBody removeBodyIter = DelayRemoveBodies.Find(b => b == body);

            if (removeBodyIter != null)
            {
                DelayRemoveBodies.Remove(removeBodyIter);
                return(null);
            }

            if (Info.IsLocked())
            {
                if (DelayAddBodies.Exists(b => b == body))
                {
                    DelayAddBodies.Add(body);
                    DelayDirty = true;
                }
            }
            else
            {
                DoAddBody(body);
            }

            return(body);
        }
Пример #2
0
        public virtual void UpdateBodies()
        {
            if (Info.IsLocked())
            {
                return;
            }

            // Fixed: netonjm >  issue #4944, contact callback will be invoked when add/remove body, _delayAddBodies maybe changed, so we need make a copy.

            CCPhysicsBody[] addCopy = new CCPhysicsBody[DelayAddBodies.Count];
            DelayAddBodies.CopyTo(addCopy);
            DelayAddBodies.Clear();

            foreach (var body in addCopy)
            {
                DoAddBody(body);
            }

            CCPhysicsBody[] removeCopy = new CCPhysicsBody[DelayRemoveBodies.Count];
            DelayRemoveBodies.CopyTo(removeCopy);

            DelayRemoveBodies.Clear();

            foreach (var body in removeCopy)
            {
                DoRemoveBody(body);
            }
        }
Пример #3
0
        public virtual void RemoveBodyOrDelay(CCPhysicsBody body)
        {
            if (DelayAddBodies.Exists(b => b == body))
            {
                DelayAddBodies.Remove(body);
                return;
            }

            if (Info.IsLocked())
            {
                if (DelayRemoveBodies.Exists(b => b == body))
                {
                    DelayRemoveBodies.Add(body);
                    DelayDirty = true;
                }
            }
            else
            {
                DoRemoveBody(body);
            }
        }