protected override bool IsColliding(IGridCollider collider, out Collision collision) => throw new NotImplementedException();
static public bool IsShapeCollidingGrid <TShape>(CollisionDelegate <TShape, TopLeftRectangle> rectangleCollisionDelegate, ICollider <TShape> shapeCollider, IGridCollider gridCollider, out Collision collision) where TShape : IShape { IEnumerable <int[]> shapeGridBox = gridCollider.Grid.IndexIntersection( (x, y) => rectangleCollisionDelegate(y, x, out _), shapeCollider.Shape, (i, j) => gridCollider.IsCollidableCase(shapeCollider, i, j)); foreach (int[] indexes in shapeGridBox) { int i = indexes[0]; int j = indexes[1]; var rectangle = new TopLeftRectangle(gridCollider.Grid.ToWorldPoint(i, j), gridCollider.Grid.Delta); bool colliding = false; for (int x = -1; x <= 1 && !colliding; x++) { for (int y = -1; y <= 1 && !colliding; y++) { if ((x + y) % 2 == 0) { continue; } if (!gridCollider.Grid.ContainsPoint(i + y, j + x) || !gridCollider.IsCollidableCase(shapeCollider, i + y, j + x)) { continue; } var otherCase = new TopLeftRectangle(gridCollider.Grid.ToWorldPoint(i + y, j + x), gridCollider.Grid.Delta); if (!rectangleCollisionDelegate(shapeCollider.Shape, otherCase, out _)) { continue; } rectangle = new TopLeftRectangle { Position = (gridCollider.Grid.ToWorldPoint(i, j) + gridCollider.Grid.ToWorldPoint(i + y, j + x)) * 0.5f, Size = gridCollider.Grid.Delta + gridCollider.Grid.Delta.Multiply(System.Math.Abs(x), System.Math.Abs(y)) }; colliding = true; } } if (!rectangleCollisionDelegate(shapeCollider.Shape, rectangle, out Vector2 correction)) { continue; } collision = new Collision { Sender = shapeCollider, OtherCollider = gridCollider, Correction = correction }; return(true); } collision = new Collision(); return(false); }
protected override bool IsColliding(IGridCollider collider, out Collision collision) { return(CollisionUtils.IsShapeCollidingGrid(IntersectionUtils.Collides, this, collider, out collision)); }
protected abstract bool IsColliding(IGridCollider collider, out Collision collision);