Сначала вы должны создать подкласс b2QueryCallback:
class QueryCallback : public b2QueryCallback
{
public:
QueryCallback(const b2Vec2& point)
{
m_point = point;
m_object = nil;
}
bool ReportFixture(b2Fixture* fixture)
{
if (fixture->IsSensor()) return true; //ignore sensors
bool inside = fixture->TestPoint(m_point);
if (inside)
{
// We are done, terminate the query.
m_object = fixture->GetBody();
return false;
}
// Continue the query.
return true;
}
b2Vec2 m_point;
b2Body* m_object;
};
Затем в вашем методе touchBegan:
b2Vec2 pos = yourTouchPos;
// Make a small box.
b2AABB aabb;
b2Vec2 d;
d.Set(0.001f, 0.001f);
aabb.lowerBound = pos - d;
aabb.upperBound = pos + d;
// Query the world for overlapping shapes.
QueryCallback callback(pos);
world_->QueryAABB(&callback, aabb);
b2Body *body = callback.m_object;
if (body)
{
//pick the body
}
Я вижу, что вы можете управлять выбранным телом двумя способами.Первый, как вы заметили, - создание mouseJoint, а второй - кинематика вашего тела и управление его скоростью (не позицией! - при столкновении он будет обеспечивать нефизическое поведение, потому что скорость будет равна нулю).В первом случае, если вы будете перемещать ваши объекты очень быстро, будет некоторая задержка при движении.Я сам не пробовал второй способ, потому что в этом случае тело не будет сталкиваться с другими кинематическими и статическими телами.
Также вы можете заблокировать вращение тела при движении.