/// <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 + " не реализован."); } }
/// <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; }
public virtual void OnCollision(uint id, Collision.GeometryType gt) { }