Заставить объект двигаться вверх / вниз по наклону 315 градусов на основе рабочего кода с наклоном 45 градусов - PullRequest
0 голосов
/ 30 сентября 2011

Хорошо, поэтому мне нужно знать, как переместить объект вверх / вниз по наклону 315 градусов, основываясь на коде, который у меня есть для перемещения указанного объекта вверх / вниз по наклону 45 градусов.В настоящее время объект движется вверх / вниз по склону 315 градусов, как будто он составляет 45 градусов, что является неправильным путем (подниматься вверх и вправо, когда он должен идти вниз и вправо).

Вот код:

//you're in a double for loop going through every tile in the map, the int's being used are x, and y

//check if the tile is a slope
if (lv.type[lv.tile[x, y]] == Tiles.SLOPE)
{
    //create a rectangle collision box
    Rectangle tileCol = new Rectangle(x * lv.tileSize, (y * lv.tileSize), lv.tileSize, lv.tileSize + 1);

    //if player collision "col" collides with "tileCol" and you haven't done this before this itteration (only happens once per full double loop)
    if (col.Intersects(tileCol) && !onSlope)
    {   
        //get the angle of the tile
        float angle = lv.angle[lv.tile[x, y]];

        //get the x distance of how far away the player's right is inside the tile
        float dist = (col.X + col.Width) - tileCol.X;


        //constructs the opposite of a right triangle
        float opposite = (float)(Math.Tan(MathHelper.ToRadians(angle)) * (dist));

        if (angle < 90)
        {
            //if player's right is less then or equal to tile's right
            if (col.X + col.Width <= tileCol.X + tileCol.Width)
            {
                //place player on slope. this works properly
                pos.Y = tileCol.Y - opposite;
                //tell the program we don't wanna go through this again until the next full loop starts.
                onSlope = true;
            }
        }

        else if (angle > 90)
        {   
            if (col.X >= tileCol.X)
            {
                //this is where the error is.
                pos.Y = tileCol.Y + lv.tileSize + (dist * -1);
                onSlope = true;
            }
        }
    }
}

1 Ответ

1 голос
/ 01 октября 2011

Я не до конца понимаю ваш код, потому что так, как он написан, позиция вашего игрока. Y в «работающем» цикле if уменьшается с вершины тайла, эффективно помещая его ближе к вершине прямоугольника, когда он должен подниматься со дна склона. Но - исходя из приведенного выше кода, следующее должно работать для всех углов:

// Check if the tile is a slope
if (lv.type[lv.tile[x, y]] == Tiles.SLOPE)
{
    // Create rectangle collision that is the same size as the tile
    Rectangle tileCol = new Rectangle(x * lv.tileSize, y * lv.tileSize, lv.tileSize, lv.tileSize + 1);

    // If player collision "col" standing on "tileCol"
    if (col.Intersects(tileCol) && !onSlope)
    {   
        // Get the angle of the tile
        float angle = lv.angle[lv.tile[x, y]];

        // Get the x distance of how far away the player's right is inside the tile
        float dist = col.Right - tileCol.X;

        // Figure out how far to offset the player 
        float offset = (float)(Math.Tan(MathHelper.ToRadians(angle)) * (dist));

        // If player's right is less then or equal to tile's right
        if (col.Right <= tileCol.Right)
        {
            if (angle % 180 < 90)
            {
                pos.Y = tileCol.Bottom + offset;
                onSlope = true;
            }
            else if (angle % 180 > 90)
            {
                pos.Y = tileCol.Top + offset;
                onSlope = true;
            }
        }
    }

45 градусов = 1/8 Пи. 315 градусов = 7/8 Пи. Функции тангенса дают вам 1 и -1 соответственно в зависимости от наклона и соответственно смещают символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...