Game Dev: GM:S Заскриптованное движение и его запись

Читай на DevTribe.ru!

» Раздел: Game Maker

Что такое заскриптованное движение?

Начнём с того, что заскриптованным может быть не только движение. Скрипт - это английское слово(script) и переводиться оно как сценарий. Эти самые сценарии хранят информацию о всех событиях, которые поджидают игрока при прохождении игры. Заскриптованное движение - движение по определённому маршруту. В этой статье мы будем реализовать как само чтение этого маршрута, так и его запись во время игры.

Теория

Вспомним уроки информатики. Какие бывают алгоритмы?
» Не помню
  • Линейные
  • Ветвистые
  • Циклические
Только сравнивать скрипты со сценариями из оперы/балета не стоит, а то может образоваться мнение, что все скрипты представляют собой линейные алгоритмы. Скрипт может циклиться и иметь условия. В нашем случае мы будем использовать ветвисто-циклические алгоритмы(кто запретил их комбинировать). Нам понадобится некая таблица. Строками будет координата x, а столбцами y. А в ячейках будет записана информация о движении в этих координатах. Мы будем двигать машинки. Когда они будут в указанных координатах, они возьмут из ячейки направление и будут ему следовать. Поехали!

Практика

Заранее подготовим спрайты машинок и добавим в проект.
Теперь создадим комнату. Мы будем использовать виды. Размеры комнаты и её вида не важны, но я буду использовать стандартные размер вида и в несколько раз увеличенные размеры комнаты.
Теперь можно перейти к объектам. Для начала создадим таблицу. Для неё мы будем использовать отдельный объект. Назовём его md(у меня проблема с названиями :D). Создадим событие создания и засунем туда следующий код:
//Создаём координатную сетку размером с комнату
dir=ds_grid_create(room_width,room_height);

//Устанавливаем всем ячейкам сетки значение false
ds_grid_add_region(dir,0,0,room_width,room_height,false);
Вы наверное офонарели. Какая координатная сетка? Мы разве не таблицу создаём?
-Да. Мы создаём таблицу
Таблица это способ структурирования данных. Она представляет собой систему ячеек, каждая из которых находится на пересечении столбца и строки. Если подумать, то каждая ячейка помимо хранящегося в ней значения имеет ещё две величины. Это столбец и строка на пересечении, которых находиться ячейка. Так вот в нашем случае этими величинами будут x и y.



Сделаем несколько переносов строки(а то я сам запутался) и продолжим. ds_grid(координатная сетка) это тип данных в gms. Это некая сетка разбитая на ячейки, которые находятся между координатами x и y. Её может заменить и двумерный массив, но мы будем использовать именно ds_grid, т.к. она содержит ряд нужных нам функций. А вот их их описание:
» ds_grid_create
Создаёт координатную сетку и записывает её идентификатор в переменную, который понадобится нам для операций с этой сеткой
переменная=ds_grid_create(ширина,высота);
» ds_grid_add_region
Добавляет значение всем ячейкам в прямоугольном регионе. Он задаётся координатами верхней левой и нижней правой точками
ds_grid_add_region(идентификатор сетки(или переменная содержащая его),x 1 точки,y 1 точки,x 2 точки,y 2 точки,значение);
» ds_grid_get
Получает значение в указанных координатах
переменная=ds_grid_get(идентификатор сетки,x,y);
И бонусом переменные room_width и room_height это ширина и высота комнаты.
Теперь как сетка создана и всем ячейкам прописано false, можно приступать к созданию машинок.
У нас будет два состояния машинки:
  • Обучение(Запись)
  • Практика(Воспроизведение)
Создадим объект car_edu. Это обучающее состояние машинки. Я использую чуть ли не самую простую систему перемещения, т.ч. комментировать её не буду. Самое интересное ждёт нас в событии движения. В нём мы напишем:
ds_grid_set_region(md.dir,x-64,y-64,x+64,y+64,direction);
И вы должны были узнать, ds_grid_set_region и думаю без труда поймёте, что он тут делает. А он здесь записывает текущее направление в ячейки региона 128x128 центром которого является машина. Теперь при езде наш ученик записывает в ближайшие ячейки сетки своё направлению. Его будет читать второе состояние и следовать ему. А вот и пришло время создать объект для него. Назовём его car_test.
В Step пишем достаточно простой код(половиной которого являются комментарии):
/*
Если в текущей координате сетки не записан false
меняем направление на то, что там записано
*/
if ds_grid_get(md.dir,x,y)!=false
{
    direction=ds_grid_get(md.dir,x,y)
}
Теперь машинка меняет своё направление на значение записанное в ячейке с текущими координатами.
И конечно не забываем поставить ей скорость:
speed=15;
Для смены состояния будем использовать instance_change
instance_change(car_edu,true);
Второй параметр, это сохраняет ли объект переменные.
Последний штрих, это поставить объект с обучающим состоянием машинки в комнату, закрепить за машинкой вид и поставить какой нибудь фон, какую нибудь дорогу. Рекомендую скачать исходники и ознакомиться с системой движения и сменой объектов. Это был мой первый опыт в написании статей. Не судите строго, критикуйте конструктивно. Прошу извинить за возможные пунктуационные ошибки. Всем спасибо за внимание!

Исходник


Просмотров: 483

defixer #1 - 3 месяца назад 0
Я не стал проверять и поэтому спрашиваю: я так понял, что машинка_воспроизведение считывает значения из сетки с помощью своих же координат в комнате. Может ли случится так, что из-за лага машинка не попадёт в "триггер"?
Morkoffka #2 - 2 месяца назад (отредактировано ) 0
defixer:
Я не стал проверять и поэтому спрашиваю: я так понял, что машинка_воспроизведение считывает значения из сетки с помощью своих же координат в комнате. Может ли случится так, что из-за лага машинка не попадёт в "триггер"?
Не понимаю, что вы имеете в виду под "попадёт в триггер". Машинка может не попасть в сетку, если её координаты отрицательны(она выехала за края), так как мы создаём сетку в комнате, но не за её пределами. Стоит обрабатывать этот момент, например вовсе не читать сетку, если координаты отрицательны
Morkoffka #3 - 2 месяца назад 0
UPD
Есть два условия для координат, которые находятся в комнате:
  • Координаты не отрицательны
  • И конечно если они не больше размеров комнаты
Это можно проверять условием, типа
if (x>=0 and x<= room_width) and (y>=0 and x<= room_height)
{
//Объект находится в комнате
}
room_width и room_height - это переменные отвечающие за размеры комнаты