コード例 #1
0
        /// <summary>
        ///  Executes collision between two bodies
        /// </summary>
        /// <param name="body1"></param>
        /// <param name="body2"></param>
        /// <param name="removePair"></param>
        /// <returns></returns>
        protected bool Test(ICollisionBody body1, ICollisionBody body2, bool removePair = true)
        {
            var result = new CollisionResult();
            var paired = FindCollisionPair(body1, body2, removePair);

            if (TestCollisionShapes(body1.CollisionShape, body2.CollisionShape, ref result))
            {
                result.Type = paired ? CollisionType.Stay : CollisionType.Enter;
                CacheCollisionPair(body1, body2);
                body2.OnCollision(result, body1);
                result.Normal *= -1;
                result.First   = true;
                body1.OnCollision(result, body2);
                return(true);
            }
            else
            {
                if (paired)
                {
                    result.Type = CollisionType.Exit;
                    body2.OnCollision(result, body1);
                    result.Normal *= -1;
                    result.First   = true;
                    body1.OnCollision(result, body2);
                    return(true);
                }
            }
            return(false);
        }
コード例 #2
0
 public virtual void OnCollision(CollisionResult result, ICollisionBody other)
 {
     _gizmoColor = result.Type == ECollisionEvent.Exit ? Color.green : Color.red;
     if (isDebug && result.Type == ECollisionEvent.Enter)
     {
         Debug.LogError("Enter Collision");
     }
 }
コード例 #3
0
        //public abstract bool LineOfSight(LVector3 start, LVector3 end);

        public virtual int AddBody(ICollisionBody body, AABB2D *ptr, LVector2 pos, LVector2 extents)
        {
            var refId = _uniqueIndex++;

            *ptr = new AABB2D(refId, pos, extents);
            _id2Ptr[refId]  = (long)ptr;
            _id2Body[refId] = body;
            _shapePtrs.Add((long)ptr);
            return(refId);
        }
コード例 #4
0
 /// <summary>
 /// Adds a body to the CollisionSystem
 /// </summary>
 /// <param name="body"></param>
 /// <returns></returns>
 public virtual bool AddBody(ICollisionBody body)
 {
     if (!bodyList.Contains(body) && bodyList.Count < MaxCollisionBodies)
     {
         body.RefId = _uniqueIndex;
         _uniqueIndex++;
         bodyList.Add(body);
         return(true);
     }
     return(false);
 }
コード例 #5
0
        private bool FindCollisionPair(ICollisionBody a, ICollisionBody b, bool remove = true)
        {
            var idx = a.RefId * (MaxCollisionBodies + 1) + b.RefId;

            if (remove)
            {
                return(_pairs.Remove(idx));
            }
            else
            {
                return(_pairs.Contains(idx));
            }
        }
コード例 #6
0
    public void OnCollision(CollisionResult result, ICollisionBody other)
    {
        switch (result.Type)
        {
        case CollisionType.Enter:
            _gizmoColor = Color.blue;

            break;

        case CollisionType.Exit:
            _gizmoColor = Color.red;
            break;
        }
    }
コード例 #7
0
 public static void MarkDirty(ICollisionBody body)
 {
     dirtyBodys.Add(body);
 }
コード例 #8
0
 /// Removes a body from the CollisionSystem
 public virtual bool RemoveBody(ICollisionBody body)
 {
     _id2Body.Remove(body.RefId);
     _id2Ptr.Remove(body.RefId);
     return(true); //bodyList.Remove(body);
 }
コード例 #9
0
 /// <summary>
 /// Removes a body from the CollisionSystem
 /// </summary>
 /// <param name="body"></param>
 /// <returns></returns>
 public virtual bool RemoveBody(ICollisionBody body)
 {
     return(bodyList.Remove(body));
 }
コード例 #10
0
        private void CacheCollisionPair(ICollisionBody a, ICollisionBody b)
        {
            var idx = a.RefId * (MaxCollisionBodies + 1) + b.RefId;

            _pairCache.Add(idx);
        }
コード例 #11
0
 public void OnCollision(CollisionResult result, ICollisionBody other)
 {
     _gizmoColor = result.Type == CollisionType.Exit ? Color.green : Color.red;
 }
コード例 #12
0
            private void BodyShapeExited(int bodyId, Godot.Node body, int bodyShapeId, int localShape)
            {
                ICollisionBody collision = body as ICollisionBody;

                ClassOwner.BodyShapeExited?.Invoke(bodyId, collision.Reference, bodyShapeId, localShape);
            }
コード例 #13
0
            private void BodyExited(Godot.Node body)
            {
                ICollisionBody collision = body as ICollisionBody;

                ClassOwner.BodyExited?.Invoke(collision.Reference);
            }
コード例 #14
0
            private void BodyShapeExited(int areaId, Godot.Node body, int bodyShapeId, int selfShapeId)
            {
                ICollisionBody collision = body as ICollisionBody;

                ClassOwner.BodyShapeExited?.Invoke(areaId, collision.Reference, bodyShapeId, selfShapeId);
            }