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


1
Хіба вектори не приголомшливі? : D
Густаво Масель

Відповіді:


10

З того, що я розумію, читаючи ваше запитання, ви хочете обчислити правильну Yпозицію з урахуванням Xпозиції гравця. Це досить банально. Подивіться на це зображення:

схил

Якщо припустити, що плитка нахилу знаходиться в заданому положенні x,y(початок зображення ліворуч, як на зображенні). Ви маєте позицію гравця, x1ширину та висоту нахиленої плитки ( u, v). x, yі x1є світовими координатами.

З огляду на ці параметри, Y-позиція ваших гравців ( y1) буде:

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

Якщо ви маєте справу лише з кутами 45 градусів, то це стає ще простішим:

y1 = y + (x1 - x)

Якщо схил навпаки, це:

y1 = y + (v - (x1 - x))

після застосування @SkimFlux fix плюс вашої нової форми плюс деякі дурні речі, я помітив, що це спрацювало. Дякую.
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 - переріз у - - координата у, де x = 0.

Це дозволяє трохи більше гнучкості; ви можете змінити m, щоб обчислити інший нахил, крім 45 градусів. Наприклад, m pi / 3 дає вам нахил 30 градусів.


4

Ви можете знайти багато цінності на цьому веб-сайті: http://info.sonicretro.org/Sonic_Physics_Guide

Спеціально для того, що ви шукаєте, перегляньте розділ "Суцільна плитка: укоси та криві". Це в основному показує, як вважають, що це було досягнуто в ранніх іграх Sonic.


цікаво читати, але занадто складно. Такий ухил є єдиним, якого я хочу, тому повинен спростити рішення. Система карти висоти / сенсор / сканер для цього буде надмірною. Дякуємо, що перекопали посилання.
xNidhogg

2

Ви можете заглянути в окрему теорію осі, це вирішить вашу проблему нахилу, але для цього потрібно зовсім небагато математики, і сама теорія потребує певного часу, щоб обійти голову. Я пов’язав вас із підручником і книгою, яка пояснює це краще

Навчальний посібник з метанетсофт

Виявлення зіткнення в реальному часі


це занадто багато, imo. Це дуже спрощений випадок, і не буде потреби в інших використання SAT. Дякуємо, що знайшли час, щоб підняти посилання.
xNidhogg

2

Я думаю, у вас або є помилка «за одним» десь в іншому місці, або ви не встановлюєте прапор _leftSlope / _rightSlope в потрібний час. Цей код взагалі не торкається руху X, але, здається, це проблема у відео.

Ви повинні перевірити, чи спрацьовують ці прапори взагалі. Потім перевірте своє горизонтальне виявлення зіткнення: ви не хочете, щоб воно спрацьовувало на схилі.


о боже прав. Я насправді не хочу ні горизонтального, ні вертикального виявлення зіткнень, коли це відбувається. Я зовсім забув відключити це. Зараз виглядає якось краще, але ще не зроблено. Дякую.
xNidhogg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.