Что я должен сделать, чтобы мои монстры не уходили с платформ?

8

У меня есть вопрос, который сводит меня с ума, потому что я думаю, что будет довольно легко найти учебник по нему. В настоящее время я использую XNA и Farseer, чтобы создать простую платформерную игру. Я собираюсь покончить с этим, но я хочу, чтобы мои монстры были умнее. В данном случае это означает, что я не хочу, чтобы мои монстры падали со скал.

Проще говоря, я хочу что-то, что проверяет область перед моим «монстром», чтобы определить, когда монстр должен изменить направление. Не могли бы вы, ребята, указать мне правильное направление?

Что я должен использовать, должно быть простое решение или простой алгоритм, чтобы проверить это, нет?

Даниэль Фигероа
источник

Ответы:

17

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

gmemario
источник
2
Простой и элегантный, +1
Вальмонд,
Это хорошее решение. Farseer поддерживает « датчики », поэтому используйте их на скалах.
bummzack
Мне очень нравится ваш ответ, поэтому я не хочу оспаривать его. Он также может использовать нижний левый / правый тайл (в зависимости от направления движения) - что является более «очевидным» решением.
Джонатан Дикинсон
1
Основная проблема с таким решением состоит в том, что вы должны поместить препятствие для каждого утеса. Если в игре их мало, то все может быть в порядке, но в противном случае это может занять много времени, и вы можете пропустить некоторые скалы.
AlbeyAmakiir
4
@AlbeyAmakiir Ну, вы также можете поменять это и поместить датчик внизу впереди игрока (который движется вместе с игроком). Как только этот датчик перестает регистрировать столкновения, вы находитесь на обрыве.
Bummzack
7

Один из наивных способов его реализации - использование радиовещания.

Подсчитайте, где ваш монстр будет в какой-то небольшой отрезок времени (вероятно, кадр). Из этой позиции (или, если вы хотите быть более устойчивой, эта позиция +/- ограничивающая область вашего врага) сделайте радиопередачу вниз. Если он не попадает во что-то в пределах соответствующего диапазона (в зависимости от того, где вы начинаете свою лучевую трансляцию по вертикали, от высоты персонажа, от желаемого вами «размера шага» и т. Д.), Вы можете предположить, что там находится утес, где персонаж хочет быть, и решить изменить направление соответствующим образом.

тетрада
источник
1

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

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

ultifinitus
источник
0

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

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

Как только вы знаете это, вы должны найти, в каком направлении Х вы идете (чтобы проверить блоки впереди):

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

Теперь у вас есть нормализованное направление X для работы.

Далее, вы хотите проверить блоки вокруг, чтобы увидеть, если вы должны изменить направление:

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

Вы получите общую идею. Убедитесь, что вы возвращаете TileCollision.Impassable(или что-то еще), если индексы плитки находятся за пределами карты, чтобы предотвратить сбой вашей программы с недопустимым индексом, а также предотвращает выход монстров за пределы карты.

Я думаю, это действительно зависит от того, как вы работаете с плитками, но это решение, которое сработало для меня.

Основано на учебниках с http://www.sgtconker.com/ (хотя сайт не работает, когда я пишу это)

Джесси Эмонд
источник
0

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

Даррен
источник
Я думаю, что это тот же ответ, который дал Гилсон.
Ричард Марскелл - Дракир
ты правильно выглядишь
Даррен