示例#1
0
        /// <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));
                }
            }
        }
示例#2
0
        /// <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
                }
            }
        }