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); }
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); } }
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); } }