/// <summary> /// gets a list of all the tiles intersecting bounds. The returned list is ordered for collision detection based on the /// direction passed in so they can be processed in order. /// </summary> /// <returns>The colliding tiles.</returns> /// <param name="bounds">Bounds.</param> /// <param name="direction">Direction.</param> void populateCollidingTiles(Rectangle bounds, Edge direction) { _collidingTiles.Clear(); var isHorizontal = direction.isHorizontal(); var primaryAxis = isHorizontal ? Axis.X : Axis.Y; var oppositeAxis = primaryAxis == Axis.X ? Axis.Y : Axis.X; // if we are going up or left we subtract 1 from our opposite edge so that it doesnt get the column/row of tiles when we are against them var oppositeDirection = direction.oppositeEdge(); var minSidePad = direction.isMin() ? -1 : 0; var firstPrimary = worldToTilePosition(bounds.getSide(oppositeDirection) + minSidePad, primaryAxis); var lastPrimary = worldToTilePosition(bounds.getSide(direction), primaryAxis); var primaryIncr = direction.isMax() ? 1 : -1; var min = worldToTilePosition(isHorizontal ? bounds.Top : bounds.Left, oppositeAxis); var mid = worldToTilePosition(isHorizontal ? bounds.getCenter().Y : bounds.getCenter().X, oppositeAxis); // same as above here. we subtract 1 to not grab an extra column/row of tiles which will mess up collisions var max = worldToTilePosition(isHorizontal ? bounds.Bottom - 1 : bounds.Right - 1, oppositeAxis); var isPositive = mid - min < max - mid; var secondaryIncr = isPositive ? 1 : -1; var firstSecondary = isPositive ? min : max; var lastSecondary = !isPositive ? min : max; for (var primary = firstPrimary; primary != lastPrimary + primaryIncr; primary += primaryIncr) { for (var secondary = firstSecondary; secondary != lastSecondary + secondaryIncr; secondary += secondaryIncr) { var col = isHorizontal ? primary : secondary; var row = !isHorizontal ? primary : secondary; _collidingTiles.Add(_collisionLayer.getTile(col, row)); } } }
/// <summary> /// gets a list of all the tiles intersecting bounds. The returned list is ordered for collision detection based on the /// direction passed in so they can be processed in order. /// </summary> /// <returns>The colliding tiles.</returns> /// <param name="bounds">Bounds.</param> /// <param name="direction">Direction.</param> void populateCollidingTiles(Rectangle bounds, Edge direction) { _collidingTiles.Clear(); var isHorizontal = direction.isHorizontal(); var primaryAxis = isHorizontal ? Axis.X : Axis.Y; var oppositeAxis = primaryAxis == Axis.X ? Axis.Y : Axis.X; var oppositeDirection = direction.oppositeEdge(); var firstPrimary = worldToTilePosition(bounds.getSide(oppositeDirection), primaryAxis); var lastPrimary = worldToTilePosition(bounds.getSide(direction), primaryAxis); var primaryIncr = direction.isMax() ? 1 : -1; var min = worldToTilePosition(isHorizontal ? bounds.Top : bounds.Left, oppositeAxis); var mid = worldToTilePosition(isHorizontal ? bounds.getCenter().Y : bounds.getCenter().X, oppositeAxis); var max = worldToTilePosition(isHorizontal ? bounds.Bottom : bounds.Right, oppositeAxis); var isPositive = mid - min < max - mid; var secondaryIncr = isPositive ? 1 : -1; var firstSecondary = isPositive ? min : max; var lastSecondary = !isPositive ? min : max; for (var primary = firstPrimary; primary != lastPrimary + primaryIncr; primary += primaryIncr) { for (var secondary = firstSecondary; secondary != lastSecondary + secondaryIncr; secondary += secondaryIncr) { var col = isHorizontal ? primary : secondary; var row = !isHorizontal ? primary : secondary; _collidingTiles.Add(collisionLayer.getTile(col, row)); #if DEBUG_MOVER if (direction.isHorizontal()) { var pos = tiledMap.tileToWorldPosition(new Point(col, row)); _debugTiles.Add(new Rectangle((int)pos.X, (int)pos.Y, 16, 16)); } #endif } } }