Физика в GameMaker Studio

Материал из Вики по GameMaker
Перейти к: навигация, поиск

В GameMaker Studio встроен физический движок на основе открытой библиотеки Box2D (v2.1.2/Box2dWeb-2.1.a.3). Он реализует не всё её возможности, но зато работает быстро.

Работа с физическим движком существенно отличается от обычной обработки столкновений. Это более пассивная система, в которой все взаимодействия между объектами игрового мира происходят по заранее определённым правилам в соответствии с параметрами объектов и игрового мира, которые вы зададите.

Содержание

[править] Важные аспепты

  1. Подсистема физики отделена от основной структуры GMS, то есть она не обязательно завязана на скорости комнаты и порядке шагов, как всё остальное.
  2. Физика заменяет многие обычные функции экземпляров. Например, вместо скорости и направления у экземпляров есть физическое тело, на которое нужно воздействовать силой или импульсом, чтобы перемещать его по игровому миру. К этому нужно привыкнуть, поэтому, прежде чем интегрировать физику в свой проект, поэкспериментируйте с ней, чтобы понять, как всё работает.
  3. Следите за количеством экземпляров, их столкновений и групп столкновений. Обработка физики требует интенсивных расчётов, поэтому не ждите, что вы сможете создавать тысячи экземпляров, и всё будет работать нормально.
  4. При определении столкновений используйте родительские объекты насколько это возможно. Например, если у вас пять разных объектов-стенок, не проверяйте столкновения с ними по отдельности, а создайте один абстрактный объект, назначьте его родителем всех стенок и проверяйте столкновения с родителем.
  5. Старайтесь не перемещать экземпляры, минуя физические функции. Изменить координаты экземпляра вручную возможно и в некоторых случаях даже необходимо, но этого следует избегать, потому что результаты могут быть непредсказуемыми, особенно если пытаться разрешить столкновения.
  6. На разных платформах поведение физики может незначительно отличаться из-за различной точности операций с плавающей запятой, однако каждая версия сохраняет постоянство от запуску к запуску.
  7. Чтобы предотвратить нестабильность симуляции физики, Box2D ограничивает предельные значения, на которые тело может переместиться и повернуться за одно обновление.

[править] Физический мир

Чтобы физика начала работать, нужно создать в комнате физический мир. Для этого поставьте галочку «Room is Physics World» в настройках комнаты или используйте функцию physics_world_create.

Поскольку физический движок использует меры реального мира, он переводит пиксельные координаты в метры согласно заданному соотношению. Наибольшая производительность достигается, когда размеры объектов от 0,1 до 50 метров.

Если в обычной системе столкновений позиции состояние игрового мира обновляется один раз за шаг, то физический движок делает несколько итераций в течение шага. Чем больше итераций, тем точнее вычисления, но ниже производительность. По умолчанию движок делает 10 обновлений за шаг. Чтобы изменить это значение, используйте функции physics_world_update_iterations и physics_world_update_speed. Рекомендуется не меньше 5 и не больше 30 итераций за шаг. На данный момент нельзя сделать скорость обновления физики ниже скорости комнаты, но будущие обновления могут добавить такую возможность.

[править] Функции

physics_world_create
physics_world_gravity
physics_world_update_iterations
physics_world_update_speed
physics_world_draw_debug
physics_draw_debug
physics_pause_enable

[править] Силы

[править] Фикстуры

Чтобы экземпляр мог иметь физические свойства, привяжите к нему фикстуру. Фикстура задаёт форму экземпляра и придаёт ему материальные свойства: плотность, трение и упругость. Фикстуры могут быть прямоугольниками, кругами, многоугольниками и любой другой простой фигурой: вы сами нарисуете форму точку за точкой и зададите ей свойства. От свойств будет зависеть, как экземпляр будет взаимодействовать с другими экземплярами физического мира:

Плотность — это отношение массы тела к занимаемому им объёму. Чтобы сделать экземпляр статичным (т.е. неподвижным) или кинематичным (т.е. таким, который движется с постоянной скоростью, но не реагирует на столкновения), назначьте ему плотность 0.
Трение — это сила, возникающая при соприкосновении двух тел и препятствующая их относительному движению.
Прямолинейное затухание — сила, заставляющая тело терять скорость. В нашем мире тела обычно не двигаются бесконечно: бумажный самолётик рано или поздно падает из-за сопротивления воздуха. Честно моделировать аэродинамику в игре — пустая трата ресурсов, поэтому мы обойдёмся этим упрощением.
Угловое затухание — сила, заставляющая тело терять скорость вращения. Ещё одно упрощение.
Упругость — в физике это свойство тела возвращаться в изначальную форму при упругой деформации, но, поскольку фикстуры в GMS не могут деформироваться, считайте, что упругость — это то, насколько фикстура «прыгучая».

У фикстуры может быть множество привязок с разными свойствами, подобно тому, как у объекта может быть множество экземпляров с разными значениями переменных.

[править] Создание фикстур и привязок

physics_fixture_create
physics_fixture_bind
physics_fixture_bind_ext
physics_fixture_set_collision_group
physics_fixture_delete
physics_remove_fixture

[править] Формы фикстур

physics_fixture_set_box_shape
physics_fixture_set_circle_shape
physics_fixture_set_edge_shape
physics_fixture_set_polygon_shape
physics_fixture_add_point

[править] Свойства фикстур

physics_fixture_set_density
physics_fixture_set_friction
physics_fixture_set_linear_damping
physics_fixture_set_angular_damping
physics_fixture_set_restitution
physics_fixture_set_sensor
physics_fixture_set_kinematic
physics_fixture_set_awake

[править] Изменение фикстур

physics_get_friction
physics_get_density
physics_get_restitution
physics_set_friction
physics_set_density
physics_set_restitution
physics_mass_properties

[править] Сочленения

В физическом мире GameMaker Studio, сочленения используются для соединения экземпляров объектов с миром или друг с другом. Вы множите комбинировать их различными способами для создания интересных конструкций или добавления реализма к вашему игровому миру.

!

Соединение не нужно удалять, когда вы уничтожите экземпляр присоединённый к другому экземпляру, а также не следует этого делать при завершении комнаты. За исключением особых случаях (смори зубчатое сочленение), когда данная операция требуется.

[править] Создание сочленений

physics_joint_distance_create
physics_joint_revolute_create
physics_joint_prismatic_create
physics_joint_pulley_create
physics_joint_gear_create
physics_joint_rope_create
physics_joint_wheel_create
physics_joint_weld_create
physics_joint_friction_create
physics_joint_delete

[править] Параметры сочленений

physics_joint_enable_motor
physics_joint_get_value
physics_joint_set_value

[править] Константы сочленений

Вы можете использовать ряд констант в функциях для получения (или установки) различных свойств некоторых соединений. Эти константы могут быть найдены в следующем разделе: Константы физических сочленений.

[править] Мягкие тела

[править] Физические переменные

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты