Этот код создает фигуру и подсоединяет её к телу. Указатель на фигуру необязательно где-то хранить, так как фигура автоматически уничтожится при уничтожении тела (9.2 Неявное уничтожение).
После подсоединения фигур к телу, может потребоваться пересчет массы тела.
myBody->SetMassFromShapes() ;
Эта функция довольно ресурсоемкая, поэтому вызывать её следует только при необходимости.
Определенная фигура тела удаляется просто. Это можно использовать для моделирования разрушающихся объектов. Надо просто попросить тело удалить
присоединенную фигуру.
myBody->DestroyShape(myShape);
После уничтожения фигур тела, желательно вызвать метод SetMassFromShapes снова.
6.4. Использование фигур
Здесь можно сказать не так уж много. Можно узнать тип фигуры и какому телу она принадлежит, можно проверить находится ли заданная точка в фигуре. Обо всех возможностях можно узнать просмотрев файл b2Shape.h .
Глава 7. Соединения
Содержание
7.1. О соединениях 7.2. Определение соединения 7.2.1. Соединение "жесткий отрезок" 7.2.2. Болтовое соединение 7.2.3. Призматическое соединение 7.2.4. Талевое соединение 7.2.5. Передаточное соединение 7.2.6. Соединение с курсором мыши 7.3. Фабрика соединений 7.4.Использование соединений 7.4.1. Использование соединений "жесткий отрезок" 7.4.2. Использование болтовых соединений 7.4.3. Использование призматических соединений 7.4.4. Использование талевых соединений 7.4.5. Использование передаточных соединений7.4.6. Использование соединений с курсором мыши
7.1. Осоединениях
Соединения используются для присоединения тела к миру или другим телам. Типичный игровой пример рэгдолы, качели и подъемные тали. Соединения могут сочетаться множеством способов, что позволяет получить множество интересных движений.
Некоторые соединения предоставляют ограничения, при помощи которых вы можете контролировать диапазон возможный движений этого соединения. Некоторые предоставляют двигатели-мускулы, которые можно использовать для приведения соединения в движение с заданной скоростью и силой/вращающим моментом.
Соединения-"мускулы" могут использоваться множеством способов. Задавая соединению скорость пропорциональную расстоянию от текущей точки до желаемой можно двигать предметы. Вы также можете использовать "мускулы" для симуляции амортизирующего, трущегося
соединения: задайте соединению нулевую скорость, и в качестве максимально возможной силы/вращающего момента соединения задайте маленькое значение. Тогда двигатель будет пытаться сохранить соединение неподвижным, пока нагрузка не станет слишком высокой.
7.2. Определение соединения
Все определения соединений унаследованы от b2JointDef. Все соединения создаются между двумя различными телами. Одно из них может быть статическим. Впрочем, если хотите растрачивать помять, то можете соединять и статические тела тоже :)
Вы можете задать пользовательские данные для любого соединения, а также можете отключить проверку столкновений между соединенными телами. На самом деле, это поведение по умолчанию, и если вы хотите проверять столкновения соединенных тел, то вам нужно вручную выставить флаг collideConnected в true.
Многие определения соединений требуют, чтобы вы предоставили некоторые геометрические данные. Часто соединения будут определяться через точки - якори (anchor points). Это точки, которые зафиксированы на присоединенных телах. Box2D требует, чтобы эти точки определялись в локальных координатах тел. В этом случае соединение может быть задано даже если трансформации тела насильно изменили соединение, например, когда игра сохраняется и перезагружается. Дополнительно, некоторые определения тел должны знать изначальный относительный угол между телами (болтовое соединение). Это необходимо в частности для корректного ограничения вращения, при использовании ограничений или фиксированого угла между телами. Т.к. инициализация геометрических данных может быть довольно скучным занятием, многие типы соединений имеют функции инициализации, которые используют текущую положение тела чтобы уменьшить количество требуемой от вас работы. Тем не менее, эти функции инициализации обычно следует использовать только для прототипирования. В конечном коде лучшее определять геометрию вручную. Это сделает поведение соединений более адекватным.
Содержимое определения тела зависит от типа соединения. Далее мы рассмотрим каждое из них.
7.2.1. Соединение "жесткийотрезок"
Самым простым типом соединения является соединение "жесткий отрезок", которое означает, что расстояние между двумя точками двух тел всегда должно быть постоянным. При создании соединения "жесткий отрезок" тела уже должны находиться в нужном положении. Затем указываются якорные точки в мировых координатах. Первая якорная точка присоединяется к первому телу, а вторая соответственно ко второму. Расстояние между точками подразумевает длину жесткого отрезка. Пример определения соединения "жесткий отрезок". В данном случае мы разрешаем соединенным телам сталкиваться.
b2DistanceJointDef jointDef;
jointDef.Initialize(myBodyl, myBody2, worldAnchorOnBodyl,