Внимание
Box2D использует единицы МКС. Используйте размеры движущихся объектов, в интервале от 0.1 до 10 метров. Вам будет нужно воспользоваться масштабированием при выводе результата в графическом виде. В примерах Box2D используется OpenGL-преобразование viewport.
3.4. Пользовательскиеданные
Классы b2shape, b2Body и b2Joint позволяют сохранить указатель на какие-то другие данные в виде указателя на произвольный тип void. Это удобно, когда при использовании объектов Box2D необходимо задавать соответствующие им «игровые» объекты.
Например, часто этот указатель хранит ссылку на соответствующий «игровой объект». Получается своеобразная циклическая ссылка, когда, имея игровой объект, можно получить указатель на физическое тело и, наоборот, имея тело получить указатель на игровой объект.
GameActor* actor = GameCreateActor(); b2BodyDef bodyDef; bodyDef.userData = actor;
actor->body = box2Dworld->CreateBody(SbodyDef) ;
Например, в нижеприведенных ситуациях без использования такого указателя не обойтись:
Повреждение объекта после столкновения
Выполнение какого-либо события при попадании персонажа в ограничивающий бокс
Уведомление игровых объектов о разрыве соединения между физическими объектами
Следует помнить, что указатель на данные можно использовать по своему усмотрению и хранить в нем все что угодно, но при его использовании следует быть осторожным. Например, если в этом указателе хранится ссылка на игровой объект, то и в остальных объектах должна храниться ссылка того же типа, иначе, может произойти исключительная ситуация при попытке приведения типа указателя.
3.5. Использование C+ +
C++ хорош инкапсуляцией данных и полиморфизмом, но он не настолько хорош для построения API (интерфейсов программирование приложений).
Следовало ли нам воспользоваться концепцией абстрактных фабрик или какой-либо другой? В случае с фабриками, с одной стороны, API выглядит проще, но в конечном итоге мы встаем на путь эффективной разработки и отладки.
Следовало ли нам требовать использования концепции защищенных (private) данных и "дружественных" функций? Возможно, но со временем количество "друзей" могло стать огромным.
Может быть нам следовало обернуть код на C++ интерфейсами на Си? Может быть, но это огромная работа, которая к тому же может привести к неоптимальным изменениям внутри Box2D.
Для Box2D был выбран путь минимального сопротивления. Если для некоторых случаев классы с их устройством и функциональностью подходили лучше, то использовались открытые функции-интерфейсы и защищенные данные. В других случаях использовались классы или структуры, все данные которых были открыты для доступа извне. Благодаря такому подходу удалось достичь высокой скорости разработки, легкости при отладке и минимальной заботы о сохранении непроницаемой для стороннего взгляда инкапсуляции данных. Обратной стороной монеты стал тот факт, что вы не увидите чистого и простого API. Правда у вас есть это прекрасное руководство которое вам поможет :)
3.6. Недовольным
Не нравится как устроен API? Прекрасно! У вас есть исходный код! Серьезно, если у вас есть что сказать по поводу Box2D, пожалуйста, оставьте комментарий на форуме: http://www.box2d.org/forum
Глава 4. Мир
Содержание
4.1. О мире 4.2. Создание и уничтожение мира Box2D 4.3. Использование мира 4.3.1. Моделирование 4.3.2. Просмотр объектов мира 4.3.3. ААВВ запросы
4.1. Омире
Класс b2Worid содержит тела и соединения. Он управляет всеми аспектами моделирования и позволяет обрабатывать асинхронные очереди (как очереди ААВВ). Значительная часть вашего взаимодействия с Box2D будет происходить через объект
b2World.
4.2. Создание и уничтожение мира Box2D
Создать мир совсем несложно. Необходимо лишь предоставить ограничивающий бокс мира (ААВВ) и вектор гравитации.
ААВВ должен содержать весь мир. Можно улучшить производительность, сделав бокс немного больше чем мир, например, раза в 2 для надежности. Если у вас много тел попадающих за пределы мира, то эти тела необходимо находить и удалять. Это повысит производительность и предотвратит возможное переполнение при обработке чисел с плавающей точкой. Для создания и удаления мира следует использовать соответственно операторы new и delete.
b2World* myWorld = new b2World(aabb, gravity, doSleep); ... сделать что-нибудь ... delete myWorld;
Внимание
Еще раз повторяем, ААВВ мира всегда должен быть больше региона, где располагаются тела. Если тело (возможно в процессе моделирования) пересекает границу ААВВ мира, то оно замораживается и исключается из процесса моделирования.
4.3. Использованиемира
Класс мира содержит функции-фабрики, предназначенные для создания и уничтожения
тел и соединений.
Эти функции будут рассмотрены далее в разделах "Тела" (bodies) и "Соединения" (joints). С b2Worid возможны еще несколько операций (кроме создания и удаления тел и соединения), эти операции мы сейчас и рассмотрим.
4.3.1. Моделирование
Класс мира используется для запуска и управления процессом моделирования. Вы задаете длительность шага и количество итераций на шаг. Например, так:
float32 timeStep = l.Of / 60.f; int32 iterationCount = 10; myWorld->Step(timeStep, iterationCount);