Example #1
0
        /// <summary> Создать триггер. </summary>
        /// <param name="tt"> Тип триггера. </param>
        /// <param name="points"> Точки триггера. </param>
        public Trigger(Collision.GeometryType tt, params Vector2[] points)
        {
            SetID();

            if (points == null || points.Length == 0)
                throw new Exception("[ctor] Trigger: points is null or empty.");

            this.points = points;
            type = tt;

            switch (tt)
            {
            case Collision.GeometryType.Point:
                if (points.Length != 1)
                    throw new Exception("Trigger типа Point должен иметь только 1 точку.");
                break;

            case Collision.GeometryType.Line:
                if (points.Length != 2)
                    throw new Exception("Trigger типа Line должен иметь только 2 точки.");
                break;

            case Collision.GeometryType.Rect:
                if (points.Length != 2)
                    throw new Exception("Trigger типа Rect должен иметь только 2 точки.");
                break;

            case Collision.GeometryType.Polygon:
                if (points.Length < 3)
                    throw new Exception("Trigger типа Polygon должен иметь не менее 3'х точек.");
                break;

            case Collision.GeometryType.Circle:
                if (points.Length != 2)
                    throw new Exception("Trigger типа Circle должен иметь только 2 точки (центр и радиус).");
                break;

            default:
                throw new Exception("Collision.GeometryType: " + tt + " не реализован.");
            }
        }
Example #2
0
        /// <summary> Метод, который вызывается при колизии. Если колизия была, то вызывает событие OnCollisionEvent. </summary>
        /// <param name="id"> Индекс актера из списка, с которым было столкновение. </param>
        /// <param name="gt"> Тип геометрии колизии. </param>
        public virtual void OnCollision(uint id, Collision.GeometryType gt)
        {
            if (AlwaysCollision)
            {
                OnCollisionEvent?.Invoke(id, gt);
            }
            else if (CollStatus == Collision.CollisionStatus.NoCollision)
            {
                // проверить что столкновение с данным ID не был
                bool newColl = true;
                int i;
                for (i = 0; i < collId.Length; i++)
                {
                    if (collId[i].HasValue && collId[i] == id)
                    {
                        newColl = false;
                        break;
                    }
                }

                if (newColl)
                    OnCollisionEvent?.Invoke(id, gt);
                else
                    for (i = 0; i < collId.Length; i++)
                        if (!collId[i].HasValue)
                            collId[i] = id;
            }

            CollStatus = Collision.CollisionStatus.IsCollision;
        }
Example #3
0
 public virtual void OnCollision(uint id, Collision.GeometryType gt) { }