Наклоны под углом 45 ° в плиточном 2D платформере

12

Я хочу, чтобы в моем платформенном платформенном механизме были простые наклоны под углом 45 °, однако я просто не могу понять алгоритм. Пожалуйста, посмотрите на код и видео, может быть, я упускаю очевидное?

//collisionRectangle is the collision rectangle of the player with 
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{        
    //Test bottom center point
    var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
    //Get the collision rectangle of the tile, origin is top-left
    Rectangle cellRect =
        _tileMap.CellWorldRectangle(
            _tileMap.GetCellByPixel(calculationPoint));
    //Calculate the new Y coordinate depending on if its a left or right slope
    //CellSize = 8
    float newY = _leftSlope
                            ? (calculationPoint.X % CellSize) + cellRect.Y
                            : (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
    //reset variables so we dont jump in here next frame
    _leftSlope = false;
    _rightSlope = false;
    //now change the players Y according to the difference of our calculation
    wantedPosition.Y += newY - calculationPoint.Y;
}

Видео о том, как это выглядит: http://youtu.be/EKOWgD2muoc

xNidhogg
источник
1
Разве Векторы не удивительны? : D
Густаво Масиэль

Ответы:

10

Из того, что я понимаю, читая ваш вопрос, вы хотите рассчитать правильную Yпозицию, учитывая Xпозицию игрока. Это довольно тривиально. Посмотрите на это изображение:

скат

Предполагая, что ваша наклонная плитка находится в заданной позиции x,y(начало координат слева внизу, как на изображении). У вас есть положение игрока, x1ширина и высота наклонной плитки ( u, v). x, yи x1являются мировыми координатами.

Учитывая эти параметры, Y-position ваших игроков y1будет:

y1 = y + (x1 - x) * (v / u)

Если вы имеете дело только с углами 45 градусов, то это становится еще проще:

y1 = y + (x1 - x)

Если уклон наоборот, это:

y1 = y + (v - (x1 - x))
bummzack
источник
после применения исправления @SkimFlux плюс ваша новая формула плюс некоторые глупые вещи, которые я пропустил, это сработало. Благодарю.
xNidhogg
Не могли бы вы использовать y = mx + b для более простого расчета?
ashes999
@ ashes999 Я не думаю, что это становится намного проще, чем то, что я написал. Каковы mи bв вашем расчете?
bummzack
@bummzack m - это ваш наклон (1 для наклона под углом 45 градусов вниз, -1 для вверх), а b - это точка пересечения по оси x. 9 класс алгебры. Просто говорю'.
ashes999
@ ashes999 Да, это было давно. Не стесняйтесь опубликовать это уравнение в качестве ответа.
bummzack
8

Хотя на этот вопрос уже дан ответ, позвольте мне предложить другое уравнение: y = mx + bгде y - вычисленная координата, m - наклон (-1 для падения под 45 градусами, 1 для подъема под 45 градусами), а b - перехват y - - координата y, где x = 0.

Это позволяет вам немного больше гибкости; Вы можете изменить m, чтобы вычислить другой наклон, отличный от 45 градусов. Например, м пи / 3 дает вам наклон 30 градусов.

ashes999
источник
4

Вы можете найти много полезного на этом сайте: http://info.sonicretro.org/Sonic_Physics_Guide

Специально для того, что вы ищете, ознакомьтесь с разделом Solid Tiles: Slopes and Curves. Это в основном показывает вам, как считается, что это было достигнуто в ранних играх Sonic.

SpartanDonut
источник
интересно читать, но слишком сложно. Этот вид склона - единственный, который я хочу, поэтому должен упростить решение. Карта высот / датчик / система сканера была бы излишней для этого. Спасибо, что выкопали ссылку, хотя.
xNidhogg
2

Возможно, вы захотите взглянуть на The Seperate Axis Theorm, она решит вашу проблему наклона, но для этого нужно немало математики, а сама теория требует времени, чтобы разобраться. Я связал вас с учебником и книгой, которая объясняет это лучше

metanetsoftware Tutorial

В режиме реального времени обнаружения столкновения

dbomb101
источник
это слишком много, имо. Это очень упрощенный случай, и нет необходимости в других применениях SAT. Спасибо, что нашли время, чтобы подтянуть ссылки, хотя.
xNidhogg
2

Я думаю, что у вас либо ошибка пошаговая где-то еще, либо вы не устанавливаете флаги _leftSlope / _rightSlope в нужное время. Этот код вообще не касается движения X, но это, похоже, ваша проблема в видео.

Вы должны проверить, срабатывают ли эти флаги вообще. Затем проверьте обнаружение горизонтального столкновения: вы не хотите, чтобы оно срабатывало на склоне.

SkimFlux
источник
о боже верно. Я на самом деле не хочу ни горизонтального, ни вертикального обнаружения столкновений, когда это происходит. Я полностью забыл отключить это. Выглядит как-то лучше сейчас, но еще не сделано. Благодарю.
xNidhogg