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

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

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

Game Maker Studio. Физика. Урок 2: Соединения
В прошлом уроке я описал основы физики в Game Maker Studio. Вы научились создавать простейшие тела и задавать им некоторые свойства. Готовя второй урок о соединениях, я написал довольно большой текст. Но перечитав его понял, что в нем слишком много лишнего и это только запутает читателя. В нем я делал обзор нескольких соединений (Joints ), но потом, проанализировав приходившие мне вопросы, понял, что все это не нужно для рядового начинающего пользователя. И проще подробно описать одно соединение, а на примере него уже любой сможет разобраться в остальных Joints, просто заглянув в справку. И пусть она на Английском, но зная основу, разобраться будет уже совсем не сложно.
Мне приходили письма с такими вопросами: "Как создать веревку?","Как сделать машину?" и прочее. Проанализировав их, я выбрал одно соединение, которое можно использовать для обоих случаев. Да и вообще оно используется чаще всего, как я считаю. И это соединение physics_joint_revolute_create или как я его называю шаровое соединение или вращательное. Начнем.

Сначала давайте попробуем представить, что это такое. Самое простое для понимания определение-это гвоздь или вал. Посмотрите на схему.

Тут у нас два физических объекта-четырехугольника. Видите красную точку? Это и есть наше соединение. Т.е. синий объект как бы прибит к черному и может вращаться вокруг этой оси. Фантазия не работает? Давайте обратимся к более простому для понимания примеру.

Машина состоит из трех объектов: корпуса и двух колес. Так вот эти колеса как бы прибиваются к корпусу в местах соединения (отмечено красными точками). Т.е. они как бы на валу и могут вращаться вокруг своей оси.
Или вот цепь. Одно звено скопировано несколько раз и каждые соседние звенья соединены как бы гвоздями в местах, отмеченных красными точками. Они могут вращаться вокруг этих осей. Так думаю понятнее. Теперь перейдем к практике.

Сначала обратимся к справке.
physics_joint_revolute_create(inst1,inst2,w_anchor_x,w_anchor_y,ang_min_limt,ang_max_limit,ang_limit,max_motor_torque,motor_speed,motor,col)

В кратце опишу каждый параметр этой функции.
inst1 и inst2 - грубо говоря это первый и второй объект, которые будут соеденены между собой. Если обратиться к примерам выше, то это черный и синий прямоугольники, или корпус машины и колесо или соседние звенья цепи. Но вместо inst1 мы указываем не сам объект (не его имя), а его id. Для совсем уж не опытных скажу, что каждый объект, помещенный в комнату, содержит свой уникальный номер или идентификатор. Как его узнать, напишу чуть позже.
w_anchor_x и w_anchor_y - это X и Y координата той самой (красной на схемах) точки соединения.
ang_min_limt и ang_max_limit - это ограничения. Минимальный и максимальный угол на который может поворачиваться "прибитое" тело.
ang_limit - это значение может быть либо 0 (false) либо 1 (true), т.е. либо истина, либо ложь. Если оно равно 1, то ограничения угла указанные выше будут работать. Если же 0, то они просто будут игнорироваться и соединенное тело будет вращаться без ограничений на все 360 гр. Это пригодиться нам позже для колес.
Следующие три параметра связаны с вращением или так называемым мотором. Если его не включать, то прикрепленное тело будет пассивно, т.е. просто балтаться и вращаться под действием других, внешних сил. Если же его включить, то прикрепленное тело начнет принудительно вращаться. Это можно опять же использовать для колес. Так вот это соответственно максимальное значение вращения, скорость вращения и опять же 1 или 0 (т.е. включен мотор или выключен). В примере с машиной его можно включить. В примере с цепью его следует отключить, иначе все звенья буду вращаться как безумные!
Последний параметр col - тоже либо 0 либо 1. Он означает могут ли два соединенных тела сталкиваться между собой или нет. Если 1, то они смогут сталкиваться (но только если мы пропишем это в событии столкновения как я писал в первом уроке), если 0, то они не будут сталкиваться независимо ни от чего.
Это была очень скучная часть, но многие параметры встречаются в других соединениях. Так что знать все же нужно. И не бойтесь, что можете запутаться в таком большом кол-ве параметров. Сейчас вы поймете на сколько все просто.
Итак, машина. Создаем и рисуем два спрайта: колесо (32 на 32 пикселя) и сам корпус машины (128 на 64 пикселя). Создаем 2 объекта: Car_body и Car_wheel. Пользуясь полученными знаниями из первого урока присваиваем им физические свойства и назначаем маски столкновения: для колеса-круг, для корпуса машины-прямоугольник соответственно. У меня они получились такими.

Как вы заметили из скриншота в объекте колеса я уже заранее прописал событие столкновения со стеной.Отдельные части готовы. Теперь пора использовать соединение. Создаем новый объект Car к примеру. Ему не назначаем никакой спрайт, и не включаем галочку с физикой. А просто в событии создания Create прописываем такой код:

Я думаю он понятен, но все же разберем поподробнее. Первые три строчки: мы создаем объект корпуса машины и два объекта колеса (обратите внимание на координаты колес, одно ниже и левее, второе ниже и правее). Координаты колес выставляете исходя из ваших рисунков (не забудьте в спрайтах колеса и корпуса машины нажать кнопку Center). И записываем id (идентификаторы) объектов в переменные p1,p2 и p3. Я выше писал, что при создании соединения параметры inst1 и inst2 должны быть идентификаторами объектов.
Далее создаем соединение корпуса с первым колесом и соединение корпуса со вторым колесом. Обратите внимание, что из параметров указаны только id первого и второго объекта и координаты соединения (которые совпадают с координатами центров соответствующих колес). Все остальные параметры выставлены на 0. Они нам не нужны. Нам не нужно ни ограничение углов (колеса вращаются вокруг своей оси), ни мотор и т.д.
Далее просто ставим объект Car (именно Car, а не Car_body или Car_wheel) в комнату, в которой предварительно расставляем стены и получилось вот что.

Как видите, я заранее приготовил еще стены со скосом. Нарисовал для них спрайты и при назначении маски столкновения выбрал Shape (т.е. многоугольник), обвел треугольником. И родителем этого объекта указал объект Wall, чтобы не прописывать отдельно столкновение колес еще и с этой стеной.Машину на этом примере я специально поставил на самый край, чтобы она скатилась сама, т.к. пока никакие силы к ней мы не прикладывали (это в следующем уроке).

Давайте теперь создадим цепь. Подробно останавливаться не буду. Напишу сразу код. А вы, исходя из полученных за два урока знаний, думаю уже сами сможете его понять и разобрать. Итак, создаем два спрайта. Один из них звено цепи (у меня оно 16 на 32 пикселя,так как весь код будет подстроен под эти размеры). Второй просто круг (размером 16 на 16). Зачем он нужен сейчас поймете. Далее создаем два объекта. Один Chain_Pin, второй Chain_part. В Chain_part выставляем спрайт звена цепи, все физические свойства по аналогии и прямоугольную маску столкновений. В Chain_pin выставляем спрайт круга и в свойствах параметр Density (плотности) ставим на 0. Как мы это делали со стеной. Объясняю зачем это нужно и зачем нам вообще этот объект. Когда мы создадим цепь, то она всегда будет падать вниз под действием тяжести звеньев. Т.е. нам нужно эту цепь куда-то привязать. Для этого и создаем "неподвижный объект" Chain_pin к которому мы ее привяжем. Вот звено у нас готово, булавка (как я ее называю) готова. Теперь создаем саму цепь. Создаем объект Chain (аналогичный объекту Car). Ему мы не задаем никакие физические свойства, никаких спрайтов и масок столкновений. А просто в событии Create прописываем код:

Теперь вставляем объект Chain в комнату. Наша цепь готова. Кол-во звеньев можно регулировать, меняя значение в коде repeat (8) . Т.е. сейчас восемь повторений участка кода и соответственно звеньев. Можете уменьшать или увеличивать. Я еще создал событие столкновения в объекте корпуса машины со звеньями цепи. Чтобы, проезжая, машина задевала цепь в примере.

Думаю на этом стоит закончить второй урок. Для меня очень сложно было описать все вкратце. Но иначе этот урок был бы похож на остальные и вы бы просто бездумно скопировали код. По этому я постарался все разжевать понятным языком. Надеюсь этот урок окажется вам полезным. Оставляйте комментарии, задавайте вопросы. Удачи с изучением. Главное практика. Пробуйте, создавайте, экспериментируйте с различными параметрами и у вас все получится.
Категория: Движки и Гейммейкеры | Добавил: Raven84 (03 Января 2015) | Автор: Лучин Владимир Николаевич
Просмотров: 15623 | Комментарии: 16 | Рейтинг: 4.7/10 |
Теги: Веревка, соединения, GMS, joints, GML, Цепь, физика, Game Maker Studio, Урок, цепи
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

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

Всего комментариев: 16
+0-
13 Wadim-Letun   (30 Июня 2018 18:55) [Материал]
Помогите пожалуйста! Как узнать id объекта можете мне пошагово объяснить я просто тупой и в кодах не понимаю.(То, что написано внизу для меня не понятно ни капли)

+0-
15 Raven84   (05 Июля 2018 11:23) [Материал]
Raven84id объетка можно узнать в редакторе комнат. Просто наводите курсор поверх любого объекта в редакторе комнат и у вас снизу высветится его id. Но как уже сказал выше, эти id не подойдут для работы с физикой. Для этого можно либо присваивать переменную при создани объекта кодом, как я описал в комментарии ниже. Эта переменная и будет хранить id физического объекта, но это если он создан кодом. Если же вы к примеру физический объект просто поставили в редакторе комнат, то зная в каких координатах он находится в комнате, можно узнать его id. Для этого в каком-нибудь объекте в коде создания (Create) пишем m=instance_position(x,y,obj), где меняем x и y на координаты этого объекта в комнате (их же мы знаем), а вместо obj пишем имя этого объекта. И все. Переменная m будет хранить физический id этого самого объетка.
А вообще советовал бы вам для начала изучить основы GMS и только потом браться за физику.

+0-
16 Raven84   (05 Июля 2018 11:24) [Материал]
Raven84Так как если вы в кодах не понимаете, то за нее лучше вообще не браться. Нужно сначала код сам подучить.

+0-
12 melant   (21 Августа 2016 17:39) [Материал]
К сожалению, я все равно не понял как пользоваться m=instance_create(x,y,obj). Объясните подробнее для меня, тугодума.

+0-
14 Raven84   (05 Июля 2018 11:16) [Материал]
Raven84А что именно не понятно? Вообще урок создан для тех, кто имеет уже хоть какое-то понимание самого конструктора GMS. Только тогда можно уже переходить к изучению самой физики в нем.
instance_create в GMS используется для создания какого-то объекта (точнее будет сказать образца объекта, но это не важно).
Т.е. хотим в комнате создать колесо в координатах x=200 и y=300. Для этого пишем instance_create(200,300,Car_wheel). Где "Car_wheel" это имя объекта этого самого колеса у вас в редакторе. Вы можете его по другому обозвать как угодно.
С созданием понятно?
А теперь для чего мы перед instance_create пишем "m=". Т.е. мы создали объект колеса и в дальнейшем, чтобы проще было обращаться именно к нему для каких то изменений, мы присваиваем его id к переменной m. Можно и переменную как угодно обзывать.
Этого делать не нужно если у вас во всей комнате только одно колесо. Тогда к нему можно будет обратиться на прямую как к Car_wheel. Но если у нас их в комнате несколько, то обращаясь напрямую к Car_wheel у нас будут происходить изменения одновременно во всех колесах, находящихся в комнате.
А вот как обращаться к объектам и для чего этого к сожалению невозможно рассказать в одном маленьком комментарии. Это нужно хотя бы поверхностно изучить сам GMS.

+1-
5 Banan4ik   (07 Января 2015 20:50) [Материал]
Banan4ikПодскажи, где этот id брать? А то не пойму, это id из комнаты? Я вставил, но у меня не пашет sad

+1-
6 Raven84   (08 Января 2015 06:16) [Материал]
Raven84Нет те id, что высвечиваются при наведении на объект в комнате не пойдут. В физическом мире объектам присваиваются свои id.
Узнать id можно несколькими способами,использую к примеру такие функции, как m=instance_create(x,y,obj). Т.е. если мы создаем объект через код, то в переменной m и будет записан тот самый id. Если мы объект поместили в комнату не кодом, то можно воспользоваться к примеру функцией m=instance_position(x,y,obj). Т.е. она проверяет находится ли объект с именем obj в координатах x и y. И если он там есть,то переменной m присвоится id этого объекта.

+1-
7 Raven84   (08 Января 2015 06:19) [Материал]
Raven84Кстати именно по этому я и не вставлял к примеру объект машины и объекты колес в комнате. А создал отдельный объект Car, в котором прописал создание тела машины и колес, чтобы сразу узнать их id и записать в переменные p1,p2 и p3.

+0-
8 Raven84   (08 Января 2015 06:20) [Материал]
Raven84Надеюсь помог. Если и так не понятно или возникнут еще какие-нибудь вопросы-обращайтесь. По возможности постараюсь ответить на все. smile

+0-
9 Raven84   (08 Января 2015 06:23) [Материал]
Raven84Кстати сказать, именно для колес в последней версии GMS появилась отдельная, специальная функция. С помощью нее колесам еще можно придать и амортизацию (пружинистость). Еее описывать не стал, т.к. не у всех есть последняя версия. Но сам ее уже опробовал, она довольна проста. Кому интересно и у кого есть последняя версия,могу скинуть сам ее код.

+1-
10 Banan4ik   (08 Января 2015 12:46) [Материал]
Banan4ikНет, нет, все очень понятно и розжовано biggrin Спасибо огромное

+1-
11 Raven84   (08 Января 2015 12:59) [Материал]
Raven84Ок. Рад, что помог. Третий урок уже написал. Он в данный момент проходит модерацию. Будет немного посложнее, но надеюсь разберетесь что к чему.

+1-
3 AyzenHard   (06 Января 2015 07:54) [Материал]
отличные уроки, требуем продолжения

+1-
4 Raven84   (06 Января 2015 08:09) [Материал]
Raven84Продолжение скоро будет. В следующем уроке расскажу о силах в GMS. С помощью этого вы уже сможете создать простенький платформер с физикой, где можно толкать ящики или цепляться за ту же веревку для преодоления припятствий. Так же сможете сделать управление машиной, т.е. чтобы при нажатии кнопки колеса начинали крутиться и т.д. Вообщем ждите. Пока немного занят. Как удастся уладить все домашние дела-напишу.

+1-
1 TLT   (04 Января 2015 22:49) [Материал]
TLTОтличный урок по объяснению устройства.

+2-
2 Raven84   (05 Января 2015 04:54) [Материал]
Raven84Спасибо. Именно таких статей мне не хватало в свое время, когда я только учился. Тогда было в основном все на Английском. Стараюсь написать все так, чтобы человек даже не знакомый с Game Maker Studio смог что-то сделать. Но без самообучения, конечно далеко никто не уйдет. Я лишь даю толчки. smile

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Garry's mod
  • GLEngine2D
  • Harfang 3D
  • Genesis 2D
  • Green Elf Game Engine
  • 8bitworkshop
  • ADRIFT
  • cocos3d
  • Flax
  • MightyEngine
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг