Exemplo n.º 1
0
        private void ResolveCollisionsWithTiles(List <IPhysicalEntity> collisionGroup, List <Vector2> collisionPositions)
        {
            for (int i = 0; i < collisionGroup.Count; i++)
            {
                IPhysicalEntity physicalEntity = collisionGroup[i];
                Vector2         origPos        = physicalEntity.Position;
                physicalEntity.Position = collisionPositions[i];
                var collidesWithTile = m_collisionChecker.CollidesWithTile(physicalEntity);
                physicalEntity.Position = origPos;

                if (collidesWithTile)
                {
                    ResolveTileCollision((IForwardMovablePhysicalEntity)physicalEntity);
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Search for position close to obstacle in given direction. Must be on stable position when starting search.
        /// </summary>
        /// <param name="physicalEntity"></param>
        /// <param name="initialSpeed"></param>
        /// <param name="direction"></param>
        private void TileFreePositionBinarySearch(IForwardMovablePhysicalEntity physicalEntity, float initialSpeed, float direction)
        {
            float speed = initialSpeed;

            Vector2 lastNotColliding = physicalEntity.Position;

            bool goForward = true;

            for (int i = 0; i < BINARY_SEARCH_ITERATIONS; i++)
            {
                if (goForward)
                {
                    m_movementPhysics.Shift(physicalEntity, speed, direction);
                }
                else
                {
                    m_movementPhysics.Shift(physicalEntity, -speed, direction);
                }
                bool colliding = m_collisionChecker.CollidesWithTile(physicalEntity);
                if (!colliding)
                {
                    lastNotColliding = physicalEntity.Position;
                }
                speed     = speed / 2;
                goForward = !colliding;
            }

            physicalEntity.Position = lastNotColliding;
        }