Beispiel #1
0
        bool GetSlidePositionOffDiagonalBlock(TileType tileType, Point2 position, Point2 newPos, ref Point2 result, Point2 tilePos)
        {
            OgreMaths.Point a = new OgreMaths.Point(position);
            OgreMaths.Point b = new OgreMaths.Point(newPos);

            OgreMaths.Point vector = new OgreMaths.Point(b - a);
            float vecLen = vector.Length() * (float) Math.Sqrt(2.0f);

            if (tileType == TileType.WALL_BOTTOM_RIGHT && position.X < tilePos.X + 80 && position.Y < tilePos.Y + 80)
                //)// && m_rotation > Angles.DEG_45 && m_rotation < Angles.DEG_1 * 225)
            {
                if (Math.Abs(vector.x) >= Math.Abs(vector.y))
                {
                    result.X = position.X + (int)(vecLen / 2);
                    result.Y = position.Y - (int)(vecLen / 2);
                }
                else if (Math.Abs(vector.y) > Math.Abs(vector.x))
                {
                    result.X = position.X - (int)(vecLen / 2);
                    result.Y = position.Y + (int)(vecLen / 2);
                }
            }
            else if (tileType == TileType.WALL_TOP_LEFT && position.X > tilePos.X && position.Y > tilePos.Y)
            {
                if (Math.Abs(vector.x) >= Math.Abs(vector.y))
                {
                    result.X = position.X - (int)(vecLen / 2);
                    result.Y = position.Y + (int)(vecLen / 2);
                }
                else if (Math.Abs(vector.y) > Math.Abs(vector.x))
                {
                    result.X = position.X + (int)(vecLen / 2);
                    result.Y = position.Y - (int)(vecLen / 2);
                }
            }
            else if (tileType == TileType.WALL_BOTTOM_LEFT && position.X > tilePos.X && position.Y < tilePos.Y + 80)
            {
              //  if (m_rotation < Angles.DEG_1 * 225 && m_rotation > Angles.DEG_45)
                {
                    if (Math.Abs(vector.x) >= Math.Abs(vector.y))
                    {
                        result.X = position.X - (int)(vecLen / 2);
                        result.Y = position.Y - (int)(vecLen / 2);
                    }
                    else if (Math.Abs(vector.y) > Math.Abs(vector.x))
                    {
                        result.X = position.X + (int)(vecLen / 2);
                        result.Y = position.Y + (int)(vecLen / 2);
                    }
                }

            }
            else if (tileType == TileType.WALL_TOP_RIGHT && position.X < tilePos.X + 80 && position.Y > tilePos.Y)
            {
                if (Math.Abs(vector.x) >= Math.Abs(vector.y))
                {
                    result.X = position.X + (int)(vecLen / 2);
                    result.Y = position.Y + (int)(vecLen / 2);
                }
                else if (Math.Abs(vector.y) > Math.Abs(vector.x))
                {
                    result.X = position.X - (int)(vecLen / 2);
                    result.Y = position.Y - (int)(vecLen / 2);
                }

            }
            else
            {
                return false;
            }

            return true;
        }
Beispiel #2
0
        bool GetSlidePositionOffBlock(Point2 LastPosition, Point2 newPosition, Point2 tileCentre, int tileSize, float radius, ref Point2 slidePosition)
        {
            bool basicMethod = true;
            if (basicMethod)
            {
                    OgreMaths.Point[] positions = new OgreMaths.Point[4];
                Box l_tile = new Box(new OgreMaths.Point(tileCentre), tileSize + radius * 2);

                l_tile.GetLine((int)Box.Corner.TOP_LEFT);

                positions[0] = new OgreMaths.Point(newPosition);
                positions[0].x = Math.Min(newPosition.X, l_tile.corners[(int)Box.Corner.TOP_LEFT].x);

                positions[1] = new OgreMaths.Point(newPosition);
                positions[1].y = Math.Min(newPosition.Y, l_tile.corners[(int)Box.Corner.TOP_LEFT].y);

                positions[2] = new OgreMaths.Point(newPosition);
                positions[2].x = Math.Max(newPosition.X, l_tile.corners[(int)Box.Corner.BOTTOM_RIGHT].x);

                positions[3] = new OgreMaths.Point(newPosition);
                positions[3].y = Math.Max(newPosition.Y, l_tile.corners[(int)Box.Corner.BOTTOM_RIGHT].y);

                int shortestLengthIndex = 0;
                float shortestLength = OgreMaths.Point.DistanceSquared(new OgreMaths.Point(newPosition), positions[0]);
                for (int i = 0; i < 4; i++)
                {
                    float length = OgreMaths.Point.DistanceSquared(new OgreMaths.Point(newPosition), positions[i]);
                    if (length < shortestLength)
                    {
                        shortestLength = length;
                        shortestLengthIndex = i;
                    }
                }

                slidePosition = new Point2(positions[shortestLengthIndex]);
                return true;
            }
            else
            {

                Box l_tile = new Box(new OgreMaths.Point(tileCentre), tileSize);
                Line l_vectorIn =
                    new Line(new OgreMaths.Point(LastPosition),
                    new OgreMaths.Point(newPosition.X, newPosition.Y));

                OgreMaths.Point l_vectorNormalised = l_vectorIn.GetNormalisedVector();
                l_vectorIn.b += l_vectorNormalised.Mult(radius);

                Line lineChosen = new Line();
                OgreMaths.Point intersect = new OgreMaths.Point();
                OgreMaths.Point reflectionPoint = new OgreMaths.Point();

                bool intersectionHappened = Box.CalcReflectVectorWithBox(new OgreMaths.Point(tileCentre), tileSize,
                    l_vectorIn,
                    ref reflectionPoint, ref intersect);

                if (intersectionHappened)
                {
                    OgreMaths.Point reflectVec = reflectionPoint - intersect;
                    reflectVec.Normalise();
                    slidePosition = new Point2(intersect + reflectVec.Mult(radius + 4.5f));
                }
                /*
                if (intersectionHappened)
                {
                    OgreMaths.Point vecDir = l_vectorIn.GetVector();
                    OgreMaths.Point newDirection = lineChosen.GetVector();

                    float temp = newDirection.x;
                    newDirection.x = newDirection.y;
                    newDirection.y = newDirection.x;

                    newDirection.x = Math.Abs(newDirection.x) * vecDir.x / -Math.Abs(vecDir.x);
                    newDirection.y = Math.Abs(newDirection.y) * vecDir.y / -Math.Abs(vecDir.y);
                    OgreMaths.Point directionApplied = intersect + newDirection;

                    slidePosition = new Point2(intersect);//directionApplied);
                    slidePosition = new Point2(directionApplied);
                }
                 */

                return intersectionHappened;
            }
        }