Я хочу, чтобы в моем платформенном платформенном механизме были простые наклоны под углом 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
xna
c#
xna-4.0
platformer
xNidhogg
источник
источник
Ответы:
Из того, что я понимаю, читая ваш вопрос, вы хотите рассчитать правильную
Y
позицию, учитываяX
позицию игрока. Это довольно тривиально. Посмотрите на это изображение:Предполагая, что ваша наклонная плитка находится в заданной позиции
x,y
(начало координат слева внизу, как на изображении). У вас есть положение игрока,x1
ширина и высота наклонной плитки (u, v
).x, y
иx1
являются мировыми координатами.Учитывая эти параметры, Y-position ваших игроков
y1
будет:Если вы имеете дело только с углами 45 градусов, то это становится еще проще:
Если уклон наоборот, это:
источник
m
иb
в вашем расчете?Хотя на этот вопрос уже дан ответ, позвольте мне предложить другое уравнение:
y = mx + b
где y - вычисленная координата, m - наклон (-1 для падения под 45 градусами, 1 для подъема под 45 градусами), а b - перехват y - - координата y, где x = 0.Это позволяет вам немного больше гибкости; Вы можете изменить m, чтобы вычислить другой наклон, отличный от 45 градусов. Например, м пи / 3 дает вам наклон 30 градусов.
источник
Вы можете найти много полезного на этом сайте: http://info.sonicretro.org/Sonic_Physics_Guide
Специально для того, что вы ищете, ознакомьтесь с разделом Solid Tiles: Slopes and Curves. Это в основном показывает вам, как считается, что это было достигнуто в ранних играх Sonic.
источник
Возможно, вы захотите взглянуть на The Seperate Axis Theorm, она решит вашу проблему наклона, но для этого нужно немало математики, а сама теория требует времени, чтобы разобраться. Я связал вас с учебником и книгой, которая объясняет это лучше
metanetsoftware Tutorial
В режиме реального времени обнаружения столкновения
источник
Я думаю, что у вас либо ошибка пошаговая где-то еще, либо вы не устанавливаете флаги _leftSlope / _rightSlope в нужное время. Этот код вообще не касается движения X, но это, похоже, ваша проблема в видео.
Вы должны проверить, срабатывают ли эти флаги вообще. Затем проверьте обнаружение горизонтального столкновения: вы не хотите, чтобы оно срабатывало на склоне.
источник