Я не до конца понимаю ваш код, потому что так, как он написан, позиция вашего игрока. 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 соответственно в зависимости от наклона и соответственно смещают символ.