GM:S Заскриптованное движение и его запись
Что такое заскриптованное движение?
Начнём с того, что заскриптованным может быть не только движение. Скрипт - это английское слово(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_add_region(идентификатор сетки(или переменная содержащая его),x 1 точки,y 1 точки,x 2 точки,y 2 точки,значение);
Получает значение в указанных координатах
переменная=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);
Второй параметр, это сохраняет ли объект переменные.
Последний штрих, это поставить объект с обучающим состоянием машинки в комнату, закрепить за машинкой вид и поставить какой нибудь фон, какую нибудь дорогу. Рекомендую скачать исходники и ознакомиться с системой движения и сменой объектов. Это был мой первый опыт в написании статей. Не судите строго, критикуйте конструктивно. Прошу извинить за возможные пунктуационные ошибки. Всем спасибо за внимание!
Исходник
DropBox
Google Drive
Яндекс. Диск
Смотрите также:
Комментарии
Здесь еще никто не оставил комментарий
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]