Четверг, 21 Ноября 2024, 15:17

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [147]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [132]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Какую графическую систему API вы используете?
Всего ответов: 10249
Главная » Статьи » Создание игр

Game Maker Studio. Физика. Урок 3: Силы
Из прошлых уроков вы узнали об основах физических тел и основах соединений (Joints) в Game Maker Studio. На основе этих уроков уже можно создать сцену, расставив в ней различные объекты, после запуска которой они начнут падать, качаться, катиться, ударяться и переворачиваться под действием сил гравитации, трения и т.д. Я надеюсь вы уже вдоволь наигрались с этим. Но все это происходит пассивно, без участия самого игрока. Т.е. это еще не игра. Хотя при должной сообразительности уже зная только это можно построить какой-никакой геймплей. Но сейчас не об этом. Пришло время поговорить о силах (Forces) в GMS, которые мы будем ПРИНУДИТЕЛЬНО прикладывать к объектам.
В рамках данного урока я поговорю лишь о паре функций (на самом деле их там не так уж и много), но поверьте-с помощью них можно уже сдалать очень многое.
Итак начнем с первой. physics_apply_torque(torque), где отрицательное значение torque-это вращение против часовой стрелки, положительное-по часовой соответственно. А величина-сила вращения.
Что это за функция (сила)? Я назову ее "вращательная сила", чтобы было понятнее. Из названия уже думаю понятно, что именно она делает и где может пригодиться. Но давайте традиционно разберем на примере. Я буду пользоваться наработками первых уроков, так что многое из объяснения основ буду упускать, так как надеюсь, что вы уже изучили и поняли все о чем я в них рассказывал.
Создадим круглый объект. Я для него использовал спрайт колобка размером 48 на 48 пикселей. Кстати, небольшое отступление. Вы не задумывались, почему я всегда указываю размер спрайта, который использую для объекта. Тут все очень просто. Когда мы задаем маску столкновения объекта, то чем больше/меньше объект, тем соответсвенно больше/меньше его объем. Отсюда он либо тяжелее, либо легче и соответственно к нему нужно прилагать различные по величине силы, чтобы привести его в движение. Так что те данные, что вы видите в моих уроках будут работать "правильно" только с телом соответствующего размера. Продолжим.
Назначаем объекту маску столкновения и физические сво-ва.

Обратите внимание, что я увеличил силу трения до 0.8. Это для того, чтобы колобок сильно не скользил по полу. Так же вы видите, что я уже указал, чтобы он сталкивался с объектом земли. Ну и конечно же вы не упустили из внимания то, что я прописал события нажатия клавиш Влево (Left), Вправо (Right) и Вверх (Up). Т.е. сейчас мы сделаем так, чтобы при нажатии стрелок Влево и Вправо он катился в соответствующую сторону, а при нажатии Вверх-он подпрыгивал.
В событии клавиши Влево пишем код:
physics_apply_torque(-1)
Как вы уже поняли из описания выше, минус означает вращение против часовой стрелки, а число 1 - это сила вращения. Можно ее сделать больше, можно меньше 0.5 к примеру. Но я подобрал ее равной единице именно для своего колобка, чтобы он катился на средней скорости.
В событии клавиши Вправо пишем код:
physics_apply_torque(1)
Тут по аналогии величина единица, чтобы скорость вращения была одинаковой и значение положительное,т.е. вращение будет происходить по часовой стрелке.
В событии нажатия клавиши Вверх пишем код:
physics_apply_impulse(x,y,0,-2.5)
И это вторая сила, о которой я хотел поговорить. Но о ней чуть позже. Расставим объекты по комнате и запустим игру.

Как вы смогли заметить, мы допустили весьма распространенную ошибку. При нажатии клавиши Вверх колобок подпрыгивает даже находясь в воздухе. Нужно чуть-чуть изменить код, а именно добавить проверку находится ли колобок в момент нажатия клавиши на земле. Для этого перепишем код в такой:
if position_meeting(x,y+26,Wall) {physics_apply_impulse(x,y,0,-2.5)}
Подробнее распишу его первую часть.
Функция position_meeting (x,y,obj) проверяет есть ли объект с именем obj в координатах x и y. Итак, мы проверяем именно объект стены Wall. А вот почему в координатах x и y+26? Тут все просто.

Спрайт колобка 48 на 48. Его x и y находятся прямо в центре шара. Т.е. до нижнего края шара 24 пикселя. Берем 26 с небольшим запасом. Т.е. проверяем нахождение стены в месте, помеченном синей точкой под шаром. Запускаем игру. Теперь все работает. Шар подпрыгивает только тогда, когда находиться на земле.
Тут важно сделать одно замечание. Функция position_meeting проверяет нахождение объекта в координатах, используя не физические маски столкновения (или правильнее будет называть их Fixtures, чтобы вы знали), а встроенные в GMS маски по спрайтам объектов. Чтобы не появлялись возможные баги нужно обязательно включить точную проверку (галочки, обведенные синим на скриншоте). Можно, конечно все сделать и другим способом. Я вам описал самый простой.
Как видите колобок катается. Теперь вы можете тот же самый код включить в объект колеса машины из прошлого урока. И машина у вас начнет ездить.
Теперь давайте подробнее остановимся на второй функции, которую мы использовали для прыжка, а именно physics_apply_impulse(xpos, ypos, ximpulse, yimpulse).
Вообще-то я буду рассказывать вам о другой функции, которая более чаще будет применяться, это physics_apply_force(xpos, ypos, xforce, yforce).
Как видите они похожи по написанию, так же они практически похожи и по применению. Только действие первой можно описать одним словом, как "пинок" (импульс), а вторая это скорее "постоянное толкание". Итак разберем поподробнее.
physics_apply_force(xpos, ypos, xforce, yforce)
xpos и ypos - это координаты точки к которой нужно приложить силу (чаще всего это центр объекта)
xforce и yforce - это x и y составляющая вектора силы. Давайте на этом еще подробнее остановимся. Смотрим схему ниже.

У нас есть физическое тело (черный прямоугольник). Его центр отмечен синей точкой (это и есть xpos и ypos). К примеру мы хотим "потянуть" тело вправо. Коричневая стрелка-это и есть вектор (ну думаю вы в школе изучали вектора).Т.е. xforce будет равно 12 (так как он движется по коорденате вправо, то число положительное, а величина этого числа-это сила с которой мы тащим). А вот yforce будет равно нулю, т.к. мы тащим тело строго направо. Не смещая его ни вверх, ни вниз. По аналогии смотрим движение в другие стороны, помня,что влево по x и вверх по y - это отрицательные значения.
Теперь мы можем лучше понять код прыжка: physics_apply_impulse(x,y,0,-2.5)
Т.е. импульс прикладывается к центру тела и по x-координате не двигает его, а по y поднимает вверх на силу -2.5 (вверх,т.к. значение отрицательное).Сила будет зависеть от плотности тела, чем оно тяжелее, тем силу нужно большую приложить. А при движении вверх, как в данном случае, нужно еще учитывать, что на тело действует сила гравитации, которая постоянно тянет вниз, т.е. нам нужно еще и ее преодолеть. Так же как и при движении по поверхности, действует сила трения, которую нужно преодолеть. Надеюсь разжевал понятно.

Но как вы заметили в примере с колобком. События нажатия клавиш отличаются. Событие кнопок Влево и Вправо - это постоянное событие, можно так сказать. Т.е. пока кнопка зажата, действие (код в ней) будет выполняться постоянно. Событие же клавиши Вверх. Это событие именно "нажатия". Т.е. код, прописанный там выполняется лишь раз, в момент нажатия. И продолжительное держание клавиши ни к чему не приведет. Но это уже основы самого GMS. Я думаю вы должны это знать.

Ну и что же мы можем сделать с функцией physics_apply_force ? Все очень просто. Можно с помощью нее уже создать обычный платформер. Создаем анимированный спрайт бегущего персонажа. Создаем объект с физическими свойствами. Присваеваем прямоугольную маску столкновения (обводим ей персонажа). В событиях нажатия клавиш Влево и Вправо прикладываем к центру этого персонажа силу. Т.е. xpos и ypos будут равны x и y, yforce в обоих случаях нулю. А xforce в одном случае 5 (движение вправо), к примеру, в другом -5 (движение влево). Как сделать прыжок вы уже знаете.

Кстати, давайте еще раз вернемся к примеру с колобком. Если им остановиться, и нажать прыжок из состояния покоя, и тут же в воздухе попробовать нажать клавишу Влево,к примеру, то вы увидете, что шар просто начнет вращаться в воздухе против часовой стрелки. Но его не будет тянуть влево. Так как к нему прикладывается только сила вращения, а зацепиться-то не за что. Давайте немного изменим код и приложим к нему еще одну силу, которая позволит нам двигать колобка и находясь в воздухе.
Для нажатия клавиши Влево, допишем еще одну строку:
physics_apply_torque(-1)
physics_apply_force(x,y,-1,0)
Для клавиши вправо, соответственно такую же но xforce уже равную 1.
Теперь при прыжке с места и нажатии стрелок влево или вправо шар даже в воздухе начинает двигаться,т.к. на него действует сила physics_apply_force.

Вот пожалуй и все, что я хотел рассказать. В этом уроке получилось больше текста и он вышел немного объемнее. Но расписывал все так подробно, чтобы даже начинающему было понятно. Главное начинайте все познавать с первых моих уроков. Так лучше будет понятен принцип. И еще одна просьба, если уроки вам понравились, то комментируйте их, оценивайте или задавайте в них вопросы. Так я буду знать, что кому-то они полезны и возможно напишу еще несколько. Удачи в изучении!
Категория: Создание игр | Добавил: Raven84 (08 Января 2015) | Автор: Лучин Владимир Николаевич
Просмотров: 14356 | Комментарии: 29 | Рейтинг: 4.5/12 |
Теги: gamemaker, конструктор игр, GMS, силы, Forces, GML, GM, физика, Game Maker Studio, Урок
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Game Maker Studio. Физика. Урок 3: Силы», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 29
+0-
28 Wadim-Letun   (02 Июля 2018 11:23) [Материал]
Хотел сделать простенький платформер как вы писали, но объект просто крутиться как бочка, а не идёт. Что делать?

+0-
29 Raven84   (05 Июля 2018 11:29) [Материал]
Raven84Если все сделал один в один как в уроке, то должен катиться. ) Значит где-то в коде допустил ошибку. К сожалению не смогу помочь и что-то подсказать, так как тут может быть уйма причин, почему он не катится.

+0-
14 bovalex   (06 Февраля 2016 14:35) [Материал]
bovalexПросто замечательные уроки!
Но, у меня возникли проблемы с physics_apply_local_force. Дело в том, что применяя данную функцию, объект начинает просто быстро крутится! С physics_apply_force такой проблемы не возникает. Помогало лишь одно - phy_fixed_rotation. Но в моей игре это довольно не удобно. Был бы очень благодарен за помощь. cry

+0-
15 Raven84   (06 Февраля 2016 20:12) [Материал]
Raven84А что мешает использовать physics_apply_force?
Вообще на ваш вопрос довольно сложно ответить,т.к. очень мало данных. Нужно хотя бы понять, что вы хотите сделать, отрывок кода может быть посмотреть и т.д.

+0-
16 bovalex   (15 Февраля 2016 20:41) [Материал]
bovalexДело в том, что у меня гравитация не направлена вниз, а я ее постоянно меняю(я создал фейковою гравитацию при помощи physics_apply_force а глобальную выставил на 0)

+0-
17 bovalex   (15 Февраля 2016 21:11) [Материал]
bovalexНу ничего себе, проблема решена! Дело в том, что я предполагал, что в locax_x, local_y будет правильно записать x & y соответственно. Просто маленькая глупость. А уроки хорошие, спасибо!

+0-
18 Raven84   (16 Февраля 2016 04:16) [Материал]
Raven84Рад, что удалось решить проблему!)) Как я понял по нулям просто поставил? Интересно что за игра.)
И спасибо на добром слове. Скоро ухожу в отпуск и будет время на написание новых уроков. Но пока нет мыслей про что именно написать.

+0-
19 bovalex   (09 Марта 2016 22:20) [Материал]
bovalexНапишите про fixtures. Мне бы очень хотелось почитать и узнать, как их использовать.

+0-
20 Raven84   (13 Марта 2016 09:58) [Материал]
Raven84Ну на fixtures боюсь целый урок не наберется. Я даже не представляю, о чем именно там писать? По сути, это просто выйдет перевод со справки. Думаю в данном случае справки достаточно.
Плюс ко всему, fixture же создается автоматически при определении так называемой физической маски объекта, указания плотности, трения и т.д. И это гораздо удобнее и нагляднее, чем создание кодом.
Если честно, то мне за все время работы в GMS только раз пришлось писать код, связанный с fixtures и то для этого мне хватило справки. Даже на английском легко понять, если знать основы.
Пока тему для урока так и не придумал. Да и времени пока не так много. Но как только найду для себя тему или подскажут интересную, то обязательно напишу. Рад, что до сих пор кто-то их читает.

+0-
21 bovalex   (13 Марта 2016 12:04) [Материал]
bovalexЯ просто читал где - то, что при их помощи можно начертить нормальную форму столкновения. Например для кривой дороги. Это очень важно, думаю для многих.

+0-
22 Raven84   (13 Марта 2016 12:33) [Материал]
Raven84Не совсем понял, что значит "начертить нормальную форму столкновения". Формы для fixrures кодом создаются точно такие же как и кнопками при создании объекта: квадрат, круг и многоугольник.
Что касается дороги, то её можно создать и не используя в коде fixtures, а к примеру просто создав один прямоугольник, а потом с помощью кода просто создать из этих многоугольников цепочку, сделав их разной длины и повернув под разными углами. Получится дорога, но она будет угловатой.
Так же вместо кода можно вручную в комнате расставлять эти прямоугольники, вытягивая их и наклоняя, делая тем самым дорогу. Но во всех этих случаях дорога выйдет угловатой.
А вы хотите сделать нечто подобное как в игре Hill Climb Racing наверное? Т.е. кривую плавную дорогу, а не угловатую?

+0-
23 Raven84   (13 Марта 2016 14:29) [Материал]
Raven84Сейчас покопался в справке GMS по Fixtures. Давно этого не делал. А надо бы, т.к. с обновлениями могут добавляться все новые операторы. Так была добавлена физика мягких тел не так давно.
Что касается fixtures, то тут заметил новую функцию physics_fixture_set_chain_shape. Это как раз то, что нужно для создания дороги. По сути создает цепочку вершин, если можно так сказать. Тебе нужно копать в этом направлении. В справке даже пример есть, который рандомно создает высоты на всю ширину экрана. Правда я еще не пробовал ни сам пример ни эту функцию. Еще сложность возникнет с отрисовкой пути. Нужно будет какой-то скрипт придумывать. В общем задачка посложнее. smile

+0-
24 Raven84   (13 Марта 2016 15:13) [Материал]
Raven84
Т.е. по идее дорога делается так: из коротких отрезков идущих друг за другом по цепочке и чем короче эти отрезки, тем менее угловатой получится дорога. Вертикальные линии я нарисовал, чтобы разграничить отрезки визуально.
На самом деле сделать генератор такой трассы не так уж и просто, но можно. Плюс ко всему пройденные участки нужно удалять (выгружать из памяти), иначе большая нагрузка будет.

+0-
25 bovalex   (14 Марта 2016 12:26) [Материал]
bovalexОтлично! В общем, я делаю немного другую игру. Известно, что в Бокс2Д нельзя придавать физ. объекту так званую не конвексную форму (convex) это когда есть углубления. И я подумал, что эти fixtures послужат мне хорошим заменителем стандартной формы. Ведь мы тут можем сделать ее точной...

+0-
26 Raven84   (14 Марта 2016 12:42) [Материал]
Raven84Опять не совсем понял, что значит "сделать её точной". До меня тяжело доходит. Наверное я бы лучше понял если бы увидел наглядно, что именно ты хочешь сделать. smile
А вообще, правда, что в физике gms т.к. она построена на box2d, нельзя использовать в фигурах углубления. Но например когда я работал ещё на gm8 и использовал стороннюю библиотеку extreme physics, то там я вогнутые фигуры создавал из различных выпуклых фигурок скрепляя их вместе. Думаю в gms тоже можно сделать такое. Теоретически, если на один объект привязать несколько fixtures то можно создать и вогнутую фигуру.Вот тут как раз и может понадобиться создание fixture кодом,чтобы создать несколько на один об'ект. Но если такое можно было сделать в extreme physics, то в gms я ещё не пробовал такое. Может это тут и не возможно. И придётся их связывать уже при помощи joints чтобы добиться такого же эффекта. Запутанной все написал, но надеюсь ты поймешь. Но если тебе нужна именно дорога, то это все конечно тут ни к чему. smile

+0-
27 bovalex   (14 Марта 2016 12:59) [Материал]
bovalexВот, именно об этом я и говорю. Просто, у меня довольно большой мир, мне кажется, что если скреплять объекты, джоинтами, тем самым создавая углубления и высоты, это будет сильно влиять на фпс

+0-
12 REgorion   (15 Октября 2015 09:47) [Материал]
REgorionА ещё будут? Уроки даже мне понятны! Они очень понятные и содержательные.

+0-
13 Raven84   (28 Октября 2015 14:30) [Материал]
Raven84Рад, что мои уроки до сих пор кто-то читает и учится. Пока времени свободного очень мало. Но как только появится, сразу напишу еще.

+0-
10 hmpr   (30 Апреля 2015 16:24) [Материал]
а как сделать, чтобы вектор силы зависел от угла поворота объекта?

+0-
11 Raven84   (02 Мая 2015 14:53) [Материал]
Raven84Если я правильно тебя понял, то тебе нужна функция physics_apply_local_force(xlocal, ylocal, xforce, yforce)
Открой справку по GMS, там хоть все и на английском, но есть иллюстрации. Думаю должен понять.
Вкратце xlocal, ylocal - это координаты точки к которой прикладывается вектор силы.А xforce, yforce- это сам вектор. По иллюстрации в справке сразу поймешь что к чему. Если что спрашивай еще.

+0-
6 Tim   (18 Марта 2015 13:25) [Материал]
TimТак, чисто для справки: torque по-русски будет не "вращательная сила", а "момент силы".

+0-
7 Tymonr   (21 Марта 2015 15:57) [Материал]
TymonrСкорее "Крутящий момент", если уж по стандарту определения

+1-
8 Tim   (22 Марта 2015 17:44) [Материал]
TimУпотребляются оба варианта: https://ru.wikipedia.org/wiki/Момент_силы

+0-
9 Raven84   (26 Марта 2015 11:52) [Материал]
Raven84Ну я же не физический термин использовал. А специально написал, что я назову ее так, чтобы было понятнее. И выражение взял в кавычки. Если человек более подкован в физике и терминах, то он и так поймет о чем речь. Урок для "непосвященных". smile

+0-
5 Handsome_Phil   (16 Февраля 2015 17:27) [Материал]
Handsome_PhilБольше бы таких уроков

+2-
3 Raven84   (09 Января 2015 19:09) [Материал]
Raven84Рад, что кому-то эти уроки полезны. Позже напишу еще. smile

+1-
4 bobsss   (20 Января 2015 23:15) [Материал]
bobsssМолодец классные уроки!!! biggrin

+1-
2 Biozombio   (09 Января 2015 17:26) [Материал]
Хороший урок

+1-
1 AyzenHard   (09 Января 2015 07:21) [Материал]
отлично biggrin

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Cafu
  • EasyRPG
  • Sparrow
  • DreamSDK
  • ADRIFT
  • SimpleJ
  • PICO-8
  • BlitzPlus
  • GameMaker
  • cocos3d
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг