public void AdjustXLocation(Box2 location, Vector2 displacement, List <Collision> collisions) { var xstart = (int)(location.MinX / CELL_SIZE); var xstop = (int)(location.MaxX / CELL_SIZE); var ystart = (int)(location.MinY / CELL_SIZE); var ystop = (int)(location.MaxY / CELL_SIZE); for (int y = ystart; y <= ystop; y++) { for (int x = xstart; x <= xstop; x++) { var cell = GetCellAtIndex(x, y); if (cell != null) { if (displacement.X > 0) { if (cell.LeftEdge.NX == 1 && cell.LeftEdge.Y0 < location.MaxY && cell.LeftEdge.Y1 > location.MinY && cell.LeftEdge.X > location.MinX && cell.LeftEdge.X < location.MaxX) { var d = new Vector2(cell.LeftEdge.X - location.MaxX, 0); collisions.Add(new Collision() { Displacement = d, Material = cell.Material, Normal = new Vector2(1, 0), AjustedLocation = location.Translate(d) }); } } else if (displacement.X < 0) { if (cell.RightEdge.NX == -1 && cell.RightEdge.Y0 < location.MaxY && cell.RightEdge.Y1 > location.MinY && cell.RightEdge.X > location.MinX && cell.RightEdge.X < location.MaxX) { var d = new Vector2(cell.RightEdge.X - location.MinX, 0); collisions.Add(new Collision() { Displacement = d, Material = cell.Material, Normal = new Vector2(-1, 0), AjustedLocation = location.Translate(d) }); } } } } } }
private void AdjustYLocation(Box2 location, Vector2 displacement, List <Collision> collisions) { var xstart = (int)(location.MinX / CELL_SIZE); var xstop = (int)(location.MaxX / CELL_SIZE); var ystart = (int)(location.MinY / CELL_SIZE); var ystop = (int)(location.MaxY / CELL_SIZE); for (int y = ystart; y <= ystop; y++) { for (int x = xstart; x <= xstop; x++) { var cell = GetCellAtIndex(x, y); if (cell != null) { if (displacement.Y > 0) { if (cell.BottomEdge.NY == -1 && cell.BottomEdge.X0 < location.MaxX && cell.BottomEdge.X1 > location.MinX && cell.BottomEdge.Y > location.MinY && cell.BottomEdge.Y < location.MaxY) { var d = new Vector2(0, cell.BottomEdge.Y - location.MaxY); collisions.Add(new Collision() { Displacement = d, Material = cell.Material, Normal = new Vector2(0, -1), AjustedLocation = location.Translate(d) }); } } else if (displacement.Y < 0) { if (cell.TopEdge.NY == 1 && cell.TopEdge.X0 < location.MaxX && cell.TopEdge.X1 > location.MinX && cell.TopEdge.Y > location.MinY && cell.TopEdge.Y < location.MaxY) { var d = new Vector2(0, cell.TopEdge.Y - location.MinY); collisions.Add(new Collision() { Displacement = d, Material = cell.Material, Normal = new Vector2(0, 1), AjustedLocation = location.Translate(d) }); } } } } } }