Рух RPG вгору вниз / виправлення?


27

Я сподіваюся, що ми всі зіграли в Zelda: Посилання на минуле, будь ласка, виправте мене, якщо я помиляюся, але я хочу наслідувати такий вид двовимірного руху символів зверху вниз з відтінком корекції. Це було зроблено в інших іграх, але я вважаю, що це посилання було б найлегше пов'язати. Більш конкретно, про тип руху та виправлення, про які я говорю, це:

  • Плаваючий рух не обмежується рухом на основі плитки, як Покемон та інші ігри, де одним натисканням на килимок для переміщення рухає вас на один квадрат у цьому кардинальному напрямку. Цей плаваючий рух повинен бути в змозі досягти діагонального руху.
  • Якщо ви йдете на Захід і підходите до стіни, яка є діагональною в напрямку Північний Схід / Південний Захід, ви перетворюєтесь на рух Південний Захід, навіть якщо ви продовжуєте утримувати ліворуч (Захід) на контролері. Це має працювати для корекції обох діагоналей в обох напрямках.
  • Якщо у вас кілька пікселів від прямого заходу в двері або передпокій, ви переходите через зал або в передпокій, тобто нахил у кут змушує вас штовхнути в передпокій / двері.

Я полював на ефективні способи досягти цього і не пощастив. Щоб було зрозуміло, я говорю про рух людського персонажа, а не про рух NPC. Чи доступні їх ресурси для такого руху? Рівняння чи алгоритми пояснюються на вікі чи щось таке?

Я використовую рамку XNA, чи є в ній щось, щоб допомогти у цьому?

Відповіді:


23

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

По-друге, найбільш прямим підходом було б взяти (нормалізований) вектор руху гравця і додати його до нормального вектора стіни, а потім перенормувати. Знак компонентів результуючого вектора вказуватиме на те, як стіна стосується руху гравця, а сам вектор вказує, в якому напрямку гравець може зараз рухатися.

По третій момент, якщо припустити, що у вас є прямокутники зіткнення як для стіни, так і для гравця, ви повинні мати можливість визначити, яка частина прямокутника зіткнення гравця контактує з прямокутником зіткнення стіни. Наприклад, якщо гравець рухається праворуч і вдаряється про вертикальну стіну, ви порівнюєте подовжувачі осі Y прямокутників зіткнення - якщо розмір гравця перевищує ступінь стіни на деякий поріг, скажімо, 75% Y гравця розмір осі, тоді ви "обманюєте" гравця до дверей.

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


Так, плавати персонажа навколо не було проблемою. Просто переконавшись, що люди бачили, що це вимога. Ви мені дали ключову відповідь: Плитки, що мають вектори! Я не можу повірити, що не думав про це. Дякую.
Корі Огберн

У zelda був лише один кут, на який вони могли бути, тому немає необхідності в обчисленні нормальних векторів, це був лише особливий випадок у коді.
BlueRaja - Danny Pflughoeft

Я не розумію, як ти даєш плитці вектор. Як би це виглядало?
тест

У плитці, імовірно, вже є такі дані, як її графічні зображення, прохідність чи ні. Це просто інше поле. Наприклад: структурна плитка {vector2 normal; ...} Значення нормального повинно походити з даними, що визначають плитку
Джош

@JoshPetrie Відзначаючи це. Чи не повинна плитка, з якою можна зіткнутися в декількох напрямках, мати кілька векторів? Я не впевнений, що розумію, як плитка може мати один вектор.
тест

4

Як можливу відповідь на другий момент - спроектувати вектор руху гравця вздовж настінного вектора за допомогою крапкового добутку (ab * нормалізований (b)). Потім ви отримуєте вектор, який говорить вам про те, як далеко рухати гравця в напрямку стіни, і якщо ви переміщуєте програвача за цим вектором, ви отримуєте «слайд» по стіні. Добре працював для мене в попередньому ігровому проекті.


3

Чудова відповідь для Джоша, але я додам кілька пропозицій: - Для отримання додаткової інформації про ковзання до стін, ознайомтеся з моїм запитанням - з цієї відповіді мені вдалося зробити це дуже добре. - Якщо я не помиляюсь, під час руху по екрану Посилання легко вирівняється до найближчого цілого горизонтального сітчастого квадрата. Таким чином, потрапляючи до дверей, ви, швидше за все, будете правильно вишиковані (можливо, не так). - Щоб вам було легко пройти через двері, переконайтесь, що коробка зіткнення вашого персонажа набагато менша за ширину дверей.


Або, можливо, коробка зіткнення може бути колом?
Оскар Дювеборн

2

Для виправлення вхідних дверей ви можете зробити об'єкт зіткнення дверей трохи більшим, ніж зображення дверей. Це призведе до того ж ефекту, який запропонував Джош, але без необхідності обчислювати близькість до прямокутника зіткнення стіни.

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