Основы GML. Движение
Привет! Наверняка прошлый урок вызвал головную боль, если вы его полностью прочли, так как он громоздкий и сложный для усвоения новичками. Если что-то непонятно - это ничего страшного. Аппетит приходит во время еды.
Сегодня мы рассмотрим важный аспект при разработке игры - движение объектов.
Движение объекта
О, наконец-то практика! Но сначала все-таки узнаем, что движение тела, не что иное, как изменение его координат. Разумеется, в 2D играх, а значит и в GM, используется Декартова прямоугольная система координат. К сожалению (или к счастью), в GM ось ординат Y направлена вниз, а не вверх (ось абсцисс, как принято, направлена вправо). Вот картинка:
Изменяем *х* и *у* - двигаем объект! Элементарно, Ватсон! Достаточно в step событии объекта разместить код:
x+=2;
И, о да! Результат налицо, наш подопытный кролик потопал направо. Также можно и изменять координату *у*. Ради эксперимента, поиграйте со значениями.
А если движение на протяжении всей игры почти не изменятся? Как, например, движение платформы в платформере (влево-вправо, вверх-вниз). Для этого у каждого объекта есть свойства _hspeed_ (от англ. horizontal speed), _vspeed_ (vertical speed) и направление движения - direction (измеряется в градусах, от 0 до 360). В GM направления опять же немного отличаются от привычных, а именно:
А теперь - лабораторная работа. Что все я да я вам свой опыт передаю, пора бы и свой опыт получить! Ход работы:
- Создать объект, поместить его в комнату.
- В событии create объекта сначала попробовать изменять координаты (х-=2, у+=1, например). Какой можно сделать вывод?
- Теперь вместо изменения координат задайте hspeed и/или vspeed (например, hspeed=3) Понаблюдайте за эффектом.
- Ну и почти последний шаг: задайте переменную speed (скорость, она является результатом сложения hspeed и vspeed) и direction, заодно.
- Порадуйтесь своему успеху!
Теперь мы научились двигать объект. А вообще, что такое объект? Это совокупность свойств и действий. Так вот, чем наш экземпляр хуже? Мы можем вызвать в нём функции по перемещению:
motion_set(dir,speed) - Заставляет текущий экземпляр объекта двигаться в направлении dir со скоростью speed.
motion_add(dir,speed) - "Векторно" добавляет движение со скоростью speed и направлением dir к текущему движению экземпляра объекта.
В результате работы кода
motion_set(270,2);
наш объект полетит вниз со скоростью 2 пикселей/шаг. Побалуйтесь со значениями, весело же =)
Кроме *x* и *y*, у нас есть ещё свойства, относящиеся к передвижению. Вот их список:
*xprevious* Отражает координату экземпляра объекта по оси X в предыдущем шаге.
*yprevious* Отражает координату экземпляра объекта по оси Y в предыдущем шаге.
*xstart* Отражает координату по оси X в текущей комнате при старте.
*ystart* Отражает координату по оси Y в текущей комнате при старте.
*friction* Отражает текущее трение экземпляра объекта (пикселей за шаг).
*gravity* Отражает силу гравитации для текущего экземпляра объекта (пикселей за шаг).
Стоит отметить, что это не скорость, с которой полетит объект в заданном gravity_direction направлении, а ускорение, которое получает объект и измеряется в пикселях за шаг в шаге (или шаг в квадрате). Примечание Uber//gravity_direction Отражает направление гравитации в градусах для текущего экземпляра объекта (270 - вниз).
Трение более единицы лучше не ставить, так как объект попросту не сдвинется с места. Но более подробно все эти дела мы рассмотрим в следующий раз. Прогноз таков:
- Сделаем управления для своего собственного платформера.
- (Для желающих) Разберем, как описать движения объекта по сложным траекториям, таким как синусоида или парабола.
Урок получился довольно коротким, "разгрузочным", так сказать. Могу посоветовать от себя, если что-то то не поняли - не бойтесь экспериментировать. Подставьте ту или иную переменную в разные события, посмотрите, что происходит если к ней прибавить значение и т.д. Не будьте ограничены какими-то рамками и прямому следованию урока, проявите инициативу, и тогда все получиться! Удачи!
Смотрите также:
Комментарии
бедная статейка )
вообще лучше так не делать, а писать паттерн движения. Иначе потом будет очень сложно изменять передвижение объектов. Я когда еще баловался плюхаме гейммейкером писал скрипт "mov(additional_params)." Ибо намного удобнее.
Вообще свои скрипта это как фреймворк которые таскаются из одного проекта в другой и позволяют существенно упростить разработку. К примеру мой любимый скрипт
val(color,alpha) { draw_set_color(argument0); draw_set_alpha(argument1); }
вроде такой простой скрипт, а сколько времени экономит )
тогда кстати еще можно было не указывать аргументы, сейчас скорее всего в последних версиях у скриптом может быть только фиксированное кол-во аргументов.
Hellcore, согласен с тобой. Но все же - статья-то для новичков, и рассчитана она не перелопатить всю тему перемещения, а просто познакомить с движением объектов, чтобы иметь общее представление. Потом уже будут вещи и посложнее (если руки у меня дойдут)) Скрипты - мощная штука, если пользоваться ими - можно действительно сэкономить кучу времени, согласен)
вообще лучше так не делать, а писать паттерн движения. Иначе потом будет очень сложно изменять передвижение объектов.
Хм? Лично я пользуюсь lengthdir_x() и lengthdir_y() для перемещения чаще, чем, скажем, функциями motion_set(dir,speed). А ещё чаще изменяю просто speed и direction. Даже gravity пользуюсь, довольно удобно и никакого лишнего кода.
Вообще свои скрипта это как фреймворк которые таскаются из одного проекта в другой и позволяют существенно упростить разработку.
Неистово киваю, мои библиотеки кочуют из одной игру в другую, большинство из них - нужны просто чтобы упростить и укоротить код. Среди них и мой любимый скрипт:
instance_delete(obj) { with(argument0.id) {instance_destroy()} }
К примеру мой любимый скрипт
А где закрывающий скрипт? :О
valend() { draw_set_color(c_black); draw_set_alpha(1); }
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]