public void Remove(ICircleCollider collider) { var wrapper = _wrapperDictionary[collider]; wrapper.SetRemove(); _wrapperDictionary.Remove(collider); }
public static CircleCollisionInfo CircleCheck_Rectangle(Rectangle rect, ICircleCollider collider) { var info = Distance2D.RectangleToPoint(rect, collider.GetColliderCenter()); info.Distance -= collider.GetColliderRadius(); return(new CircleCollisionInfo(collider, info)); }
public void Add(ICircleCollider collider) { var wrapper = new ColliderWrapper(collider); Data.Add(wrapper); _wrapperDictionary.Add(collider, wrapper); }
public CircleCollisionInfo(ICircleCollider collider, DistanceInfo2D distanceInfo) { Collider = collider; HitPosition = CalcHitPosition(distanceInfo); UpdateDistance(distanceInfo.Distance); UpdateAngle(distanceInfo.Angle); }
public static bool IsCollidingWith(this ICircleCollider circle1, ICircleCollider circle2) { var diff = circle2.Center - circle1.Center; var radiiSq = (circle2.Radius + circle1.Radius) * (circle2.Radius + circle1.Radius); var distanceSq = diff.LengthSquared(); return(distanceSq < (radiiSq)); }
public static int GetZOrder(ICircleCollider collider, CircleCollisionSetting setting) { Rectangle rect = setting.GetAreaRectangle(); int zorder = 0; for (int i = 0; i < setting.Depth; i++) { bool isCircleBigger = rect.Width <= collider.GetColliderRadius() * 2; bool isDepthMax = i == setting.Depth - 1; if (isCircleBigger || isDepthMax) { break; } Vector2 toCircle = collider.GetColliderCenter() - rect.Position; Vector2 nextCenter = rect.Position - rect.Size / 4; zorder *= 4; zorder += 1; if (toCircle.x >= 0) { zorder += 1; nextCenter.x += rect.Width / 2; } if (toCircle.y >= 0) { zorder += 2; nextCenter.y += rect.Height / 2; } rect.Position = nextCenter; rect.Size /= 2; } return(zorder); }
public abstract CircleCollisionInfo CircleCollision_ColliderCheck(ICircleCollider circleCollider);
public void RemoveCollider(ICircleCollider collider) { Data.Remove(collider); }
public void AddCollider(ICircleCollider collider) { Data.Add(collider); }
public override CircleCollisionInfo CircleCollision_ColliderCheck(ICircleCollider circleCollider) { if (DontCheckCollision == true) { return(new CircleCollisionInfo(circleCollider, new DistanceInfo2D(float.PositiveInfinity, 0))); } var rect = Rectangle; var size = Rectangle.Size; var center = circleCollider.GetColliderCenter(); var radius = circleCollider.GetColliderRadius(); int arrayWidth = EnableArray.GetLength(1); int arrayHeight = EnableArray.GetLength(0); var info = new BreakoutBlockCollisionInfo(circleCollider); float sinr = Mathf.Sin(rect.Rotation); float cosr = Mathf.Cos(rect.Rotation); var cx = center.x - rect.Position.x + (cosr * rect.Size.x - sinr * rect.Size.y) * 0.5f; var cy = center.y - rect.Position.y + (sinr * rect.Size.x + cosr * rect.Size.y) * 0.5f; var scalex = arrayWidth / size.x; var scaley = arrayHeight / size.y; var tx = (cosr * cx + sinr * cy) * scalex; var ty = (-sinr * cx + cosr * cy) * scaley; var radx = radius * scalex; var rady = radius * scaley; int stx = Mathf.Max(0, (int)Mathf.Floor(tx - radx)); int sty = Mathf.Max(0, (int)Mathf.Floor(ty - rady)); int enx = Mathf.Min(arrayWidth, (int)Mathf.Ceil(tx + radx)); int eny = Mathf.Min(arrayHeight, (int)Mathf.Ceil(ty + rady)); for (int i = sty; i < eny; i++) { for (int j = stx; j < enx; j++) { if (EnableArray[i, j] == false) { continue; } float dx = tx - j; float dy = ty - i; float distx = (dx <= 0 ? -dx : dx - 1) / scalex; float disty = (dy <= 0 ? -dy : dy - 1) / scaley; bool rev = distx < 0 && disty < 0; if (rev) { if (distx < disty) { distx = 0; } else { disty = 0; } } else { distx = Mathf.Max(0, distx); disty = Mathf.Max(0, disty); } float distance = Mathf.Sqrt(distx * distx + disty * disty) * (rev ? -1 : 1); float angle = Mathf.Atan2( -disty * Mathf.Sign(dy - 0.5f) * Mathf.Sign(distance), -distx * Mathf.Sign(dx - 0.5f) * Mathf.Sign(distance)); info.MergeInfo(new DistanceInfo2D(distance - radius, angle), j, i); } } return(info); }
public ColliderWrapper(ICircleCollider collider) { Collider = collider; }
public GridInfo(ICircleCollider collider, DistanceInfo2D distanceInfo, int arrayX, int arrayY) { Collision = new CircleCollisionInfo(collider, distanceInfo); ArrayX = arrayX; ArrayY = arrayY; }
public BreakoutBlockCollisionInfo(ICircleCollider collider) : base(collider, new DistanceInfo2D(float.PositiveInfinity, 0)) { GridData = new List <GridInfo>(); }