Навигация по сайту
Случайная игра

Вступай!!!
Облако тегов
GML: motion

• Пример для: Game Maker
• Направленность: физика
• Язык: Game Maker Language
GML: motion

В скриптовом языке GML (Game Maker Language) есть две такие функции: motion_set() и motion_add(). Это две мощные функции. Они позволяют установить движение для объекта и добавить его векторно. Давайте разберемся с ними подробно.
Функция motion_set(dir,speed) устанавливает движение для объекта. Где dir – направление, а speed – скорость. Например, автомобиль должен ехать вправо со скоростью 3. Пишем в событии Create объекта: motion_set(0,3). Видите, как все просто? Функция motion_add(dir,speed) добавляет векторно движение к объекту. Например, нам нужно, чтобы наш автомобиль ускорялся при нажатии какой-нибудь кнопки. Пишем в событии нажатия кнопки: motion_add(0,0.2). Или наоборот, нужно чтобы машина при нажатии тормозила, а потом и давала задний ход. Пишем в событии нажатия кнопки: motion_add(180,0.2). Тут может появиться закономерный вопрос: ведь в событии создания была задана скорость 3, а тут всего лишь 0.2, как же тогда машина остановится? Представим, что обе функции – тягачи, которые эту машину тащат. В самом начале мощный тягач A начинает тянуть машину вправо со скоростью 3. При нажатии кнопки, появляется маленький тягач Б и тянет машину влево со скоростью 0.2. Так как силы действуют в противоположные стороны, они вычитаются, и получается, что машина двигается вправо со скоростью 2.8. Однако, если кнопка зажата, маленькие тягачи Б появляются каждый шаг. Получается, что автомобиль остановится, когда обе силы (тягача A и тягачей Б) будут равны, и поедет назад, когда сумма сил маленьких тягачей будет больше, чем сила тягача А. Вот так вот. Впрочем, это все теория. Перейдем к практике.

С помощью этих функций можно делать довольно любопытные вещи. Попробуем сделать шар, пружинящий на резинке. Создаем три объекта: o_main,o_ball,o_ctrl. Объектам o_main,o_ball установим спрайты шаров – o_main’у желательно побольше.
В событии draw объекта o_ctrl:
draw_set_color(c_lime)
draw_line(o_hero.x,o_hero.y,o_ball.x,o_ball.y) ///// этим мы рисуем «резинку»
В событии End Step объекта o_main:
x=mouse_x
y=mouse_y
Тут думаю, все понятно. Это были приготовления. Теперь будем использовать motion_add(). В Step o_ball’а пишем следующий код:
motion_add(point_direction(x,y,o_main.x,o_main.y),5)
Итак, что делает этот код? Он заставляет шар постоянно стремиться к объекту main. Стремясь к нему, шар набирает большую скорость и «проскакивает» o_main, но начинает стремиться к нему обратно, имитируя растяжение нашей «резинки».
Помещаем эти три объекта в комнату и запускаем. Уже кое-что есть...Но есть еще куча недоработок: шар вращается бесконечно, не замедляя своего движения, ускоряется слишком сильно и т.д. Это можно исправить, используя friction (трение). Также у нас в примере сила притяжения к o_main’у не зависит от расстояния (ведь в реальной жизни чем больше растяжение резинки, тем быстрее она сжимается обратно). Это мы можем исправить, используя point_distance(). Однако для создания реалистичности придется перебрать кучу вариантов... К статье прилагается пример, в котором вы можете посмотреть, в каком направлении можно двигаться... Попробуйте поколдовать сначала сами, а потом поглядите пример. Вполне возможно, вы найдете намного лучший вариант. Кстати: подобный «шар на резинке» был в игре Xwing (сделано также на GM), автор – небезызвестный cactus. Даже на основе этой маленькой наработки можно построить множество игр. Так что не ленитесь, творите!

P.S. На основе этих функций можно сделать очень много интересного, хотя бы из области физики: динамическое притяжение, различные вариации «резинки», всевозможные реалистичные взрывы и т.д.

Автор: Likantrop
Журнал: TOF



Вернуться
  • Комментарий: 0
  • Просмотров: 1873

Комментарии:

Оставить комментарий