Движение РПГ сверху вниз с коррекцией?

27

Я надеюсь, что мы все сыграли Zelda: A Link to the Past, пожалуйста, поправьте меня, если я ошибаюсь, но я хочу подражать такому 2D-движению персонажа сверху вниз с оттенком коррекции. Это было сделано в других играх, но я чувствую, что эта ссылка будет легче всего относиться. Более конкретно, вид движения и коррекции, о которых я говорю:

  • Плавающее движение, не ограниченное движением, основанным на тайлах, например, Покемон и другие игры, в которых одним касанием панели движения вы перемещаетесь на одну клетку в этом кардинальном направлении. Это плавающее движение должно быть в состоянии достичь диагонального движения.
  • Если вы идете на запад и подходите к стене, которая имеет диагональную форму в направлении северо-восток / юго-запад, вы попадаете в движение по юго-западу, даже если продолжаете удерживать левую (запад) на контроллере. Это должно работать для обеих диагоналей, корректирующих в обоих направлениях.
  • Если вы находитесь в нескольких пикселях от того, чтобы идти прямо в дверь или коридор, вас корректируют в том, чтобы идти по коридору или по коридору, то есть столкновение с углом заставляет вас толкаться в коридор / дверь.

Я охотился за эффективными способами добиться этого и мне не повезло. Чтобы было ясно, я говорю о движении человеческого персонажа, а не о движении NPC. Доступны ли их ресурсы для такого рода движений? Уравнения или алгоритмы, объясненные в вики или что-то?

Я использую XNA Framework, есть ли что-нибудь, чтобы помочь с этим?

Кори Огберн
источник

Ответы:

23

Ну, первый пункт пули легко. Вы просто сохраняете и манипулируете позицией персонажа в мировых или пиксельных координатах вместо основанных на плитке координат. Если у вас возникла проблема с этим, это может быть связано с запутанным выбором представления для вашего мира и пространства листов, поэтому, возможно, вам следует опубликовать более подробную информацию об этом / задать отдельный, конкретный вопрос.

Что касается второго пункта, наиболее прямым подходом было бы взять (нормализованный) вектор движения игрока и добавить его к нормальному вектору стены, а затем перенормировать. Знак компонентов результирующего вектора будет указывать, как стена связана с движением игрока, а сам вектор указывает, в каком направлении игрок может теперь двигаться.

Что касается третьего пункта, предполагая, что у вас есть прямоугольники столкновений как для стены, так и для игрока, вы должны быть в состоянии определить, какая часть прямоугольника столкновения игрока соприкасается с прямоугольником столкновения стены. Например, если игрок движется вправо и сталкивается с вертикальной стеной, вы сравниваете экстенты оси Y прямоугольников столкновения - если, если протяженность игрока превышает экстент стены на некоторый порог, скажем, 75% от Y игрока по оси, тогда вы «обманываете» игрока в направлении двери.

Я сделал немало предположений о том, как ваша объектная модель выглядит в вашем коде и какие методы вы выбрали - в основном из-за универсальности вашего вопроса. Я попытался предложить подходы, которые просты (хотя, возможно, не оптимальны) по той же причине. Если вы можете предоставить более конкретную информацию, либо в этом вопросе, либо в новом, я могу попытаться предоставить более подробную информацию или лучшую идею.

мистифицировать
источник
Да, плавать вокруг персонажа не было проблемой. Просто чтобы люди видели, что это требование. Вы дали мне ключевой ответ: плитки с векторами! Я не могу поверить, что я не думал об этом. Спасибо.
Кори Огберн
В Zelda был только один угол, под которым они могли находиться, поэтому не было необходимости вычислять векторы нормалей, это был просто особый случай в коде.
BlueRaja - Дэнни Пфлюгофт
Я не понимаю, как вы даете плитке вектор. Как это будет выглядеть?
тест
Предположительно, у тайла уже есть данные, такие как графика, проходимо или нет, и т. Д. Например: struct Tile {vector2 normal; ...} Значение нормали должно идти с данными, которые определяют плитку
Джош
@JoshPetrie Пересматривая это. Разве у плитки, с которой можно столкнуться в нескольких направлениях, не должно быть нескольких векторов? Я не уверен, что понимаю, как у плитки может быть один вектор.
тест
4

В качестве возможного ответа для второго пункта можно спроецировать вектор движения игрока вдоль вектора стены, используя скалярное произведение (ab * normalized (b)). Затем вы получаете вектор, который говорит вам, как далеко игрок должен двигаться в направлении стены, и если вы перемещаете игрока по этому вектору, вы получаете «слайд» вдоль стены. У меня хорошо получалось в предыдущем игровом проекте.

Джеймс
источник
3

Отличный ответ для Джоша, но я добавлю несколько предложений: - Для получения дополнительной информации о скольжении по стенам, проверьте мой вопрос - из этого ответа мне удалось заставить его работать очень хорошо. - Если я не ошибаюсь, при ходьбе по экрану Link будет легко выровняться по ближайшему целому горизонтальному квадрату сетки. Таким образом, когда вы доберетесь до дверей, вы, скорее всего, будете правильно выстроены в линию (может быть, это неправильно). - Чтобы было легче пройти через двери, убедитесь, что коробка столкновения вашего персонажа намного меньше ширины двери.

Iain
источник
Или коробка столкновения может быть кругом?
Оскар Дюверборн
2

Для исправления входных дверей, вы можете сделать объект столкновения для двери немного больше, чем изображение двери. Это приведет к тому же эффекту, предложенному Джошем, но без необходимости расчета близости к прямоугольнику столкновения стены.

RavensKrag
источник