Как лучше всего найти открытое пространство на уровне?


7

Я работаю над 2D-игрой, в которой вы используете краску для добавления плиток к уровню, и сейчас я работаю над добавлением плиток деформации. Он настроен таким образом, чтобы определенные ориентированные на направление краски использовали две точки (начало и конец), чтобы определить, в каком направлении будут указывать плитки (влево, вправо, вверх, вниз.) У плиток основы есть эти точки, но они будут добавлен в два других списка (начало и конец деформации). Способ деформации работает так: если игрок нажмет одну плитку, он будет телепортирован в соответствующую плитку основы. Теперь, если я собираюсь заставить это работать должным образом, мне нужно сделать так, чтобы игрок не мог быть телепортирован в стену или с карты. Поэтому мне нужно переместить точку на открытую плитку ровно на одно расстояние от любых стен.

Каков был бы лучший способ сделать это?


Вы заранее настраиваете эти точки деформации или они как-то генерируются автоматически?
Ричард Марскелл - Дракир

Смотрите мой ответ и описание проблемы с упаковкой
Инженер

@Drackir Краска - это просто след частиц, который не исчезает и не движется, и у каждой частицы есть своя точка для отображения своего положения. Поэтому я создал цикл for, который проверяет положение каждой частицы, определяет, открыт ли этот тайл, соответствующим образом изменяет карту столкновений и затем удаляет частицу. Графика плиток рисуется в соответствии с картой столкновений.
IronGiraffe

Я невероятно запутался. Возможно, изображение поможет людям увидеть, что вы пытаетесь сделать, и даст вам твердые ответы.
Ричард Марскелл - Дракир

@Drackir Вот видео игры на данный момент. Каждый раз, когда вы кладете плитки, вы меняете значения в этом месте на карте столкновений (массив int). С плитками основы мне нужно 9 плиток открытого пространства (все 9 плиток равны 0), а плитки основы созданный в конечных точках фиолетовой линии (где флаги появляются в 1:32.) Мне нужен способ использовать алгоритм поиска, чтобы осмотреть старую точку и найти новую точку, которая соответствует моим рекомендациям (8 пустых плиток вокруг новая точка, которая также пуста.) Пример.
IronGiraffe

Ответы:


3

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

Вы можете установить его в (вложенный) цикл или просто создать для него операторы if. Итак, в псевдокоде:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Редактировать на основе комментария

Есть два способа справиться с ситуацией:

  1. (Самый простой) Вы можете просто воспроизвести звук и указать, что выбранная ими позиция недействительна, и им нужно выбрать другой вариант.
  2. Используйте алгоритм поиска, чтобы найти открытую плитку. Тем не менее, я думаю, должны быть ограничения на то, как вы используете это. Возьмем, к примеру, ситуацию, когда они нажимают на левую сторону карты, а единственное открытое место находится далеко на правой стороне. Ваш алгоритм поиска находит это открытое место и помещает туда другую основу. Это не кажется очень интуитивным и может расстраивать. Мое предложение в этом случае (при условии, что вы не хотите делать № 1, что является моим основным предложением), - это искать только плитки вокруг текущей плитки (возможно, в радиусе n-плитки). Таким образом, ворота варпа не появятся слишком далеко от того места, где вы щелкнули. Чтобы выполнить такой поиск (при условии радиуса в 1 плитку), вам просто нужно вызвать вышеуказанную функцию на восьми плитках вокруг текущей (при условии, что текущая не была доступна). Вы можете сделать это в цикле или, опять же, с помощью операторов if.

Я знаю, как это сделать, но я не уверен, как я могу использовать алгоритм поиска, чтобы найти новую точку, когда старая точка не открыта. Я читал о поиске пути, и кажется, что я мог бы сделать что-то похожее на это, где я использовал бы алгоритм Дейкстры или алгоритм *, чтобы найти ближайшее открытое пространство. Я просто не уверен, как я мог это сделать, потому что я никогда не программировал ничего подобного раньше. Извините за беспокойство, я немного новичок в программировании, так что я пока не очень много знаю.
IronGiraffe

@IronGiraffe - О, я понимаю, что ты имеешь в виду. Хорошо, я обновлю свой ответ.
Ричард Марскелл - Дракир

@IronGiraffe - Обновлено.
Ричард Марскелл - Дракир

Лучше сделать это «посмотреть, открыт ли тайл» во время загрузки или генерации уровня, и сохранить результат. В любом случае вам обычно приходится проходить через все плитки (по крайней мере, все загруженные / видимые плитки, если вы выполняете ленивую оценку) на этом этапе, эта небольшая дополнительная работа не имеет значения, и дополнительные биты памяти не должны иметь значения на большинстве платформ. или.
Мартин Сойка

@Martin - насколько я понимаю, уровень меняется во время игры. Смотрите видео. И я все еще рекомендую вариант 1 выше, но если они должны сделать второй вариант, он только по щелчку, поэтому вряд ли это приведет к заметному снижению производительности.
Ричард Марскелл - Дракир

0

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

Есть похожий вопрос по stackoverflow. Нажмите, чтобы увидеть .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.