Помогите с вопросом дизайна - PullRequest
1 голос
/ 05 июля 2011

Вот моя проблема.

Я использую физическую библиотеку под названием Box2D.Я могу подключить слушателя, который скажет мне, когда сталкиваются 2 прибора.

По сути, Box2D работает, создав b2Bbody.Таким образом, я знаю только, к какому b2 принадлежит прибор, который столкнулся.В моей игре у меня есть Entity, и из этого у меня есть PhisicsEntity.PhysicsEntity содержит указатель на b2Body.У этого также есть метод sendMessage, который прибывает из Entity.Проблема в том, что от b2Body я могу отправить PhysicsEntity сообщение о столкновении.Я подумал о том, чтобы установить для userData void * объекта b2Body соответствующее значение PhysicsEntity.Хотя это очень неправильно, чтобы сделать это, чтобы создать это.

Есть ли лучший способ, которым я мог бы очень быстро узнать Физическую сущность, связанную с b2Body, без приведения или поиска?

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

Это как раз та цель, для которой такие поля, как это поле userData, предназначены для ссылки на данные вашего приложения, относящиеся к объекту библиотеки. Это вполне уместное использование void *.

Если бы вы спрашивали о C, я бы сказал, что вам также не нужно использовать какие-либо приведения, поскольку преобразование в void * и из него может быть выполнено без каких-либо приведений, а необходимость использовать приведение является признаком возможного проблема, но если я правильно помню, C ++ требует этих приведений (я не использую C ++ достаточно, чтобы быть уверенным).

0 голосов
/ 05 июля 2011

Это именно то, для чего предназначен указатель userData. Это довольно стандартная парадигма - посмотрите на такие функции, как pthread_create или CreateThread, для другого примера.

Если вы столкнулись с библиотекой, которая не позволяет вам использовать void * (или небезопасно - например, хранить его локально как int), тогда вы можете использовать std :: map для разрешения типа. Это медленнее и с гораздо большими накладными расходами.

...