Как взять b2Body и перемещать его по экрану? (Cocos2d, Box2D, iphone) - PullRequest
1 голос
/ 12 марта 2011

Я хочу переместить любое тело b2, которого касаются на экране, по всему экрану. Я слышал кое-что о суставах мыши ...

Я обнаружил, что: http://iphonedev.net/2009/08/05/how-to-grab-a-sprite-with-cocos2d-and-box2d/

но я просто выдаю много ошибок, если просто скопирую методы ccTouch в новый проект (конечно, переменные в заголовке тоже). Например. world-> Query <- НЕТ ЧЛЕНА НАЙДЕНО </p>

Пусть кто-нибудь создаст новый проект и загрузит его здесь. Или есть лучший способ?

1 Ответ

6 голосов
/ 12 марта 2011

Сначала вы должны создать подкласс 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, а второй - кинематика вашего тела и управление его скоростью (не позицией! - при столкновении он будет обеспечивать нефизическое поведение, потому что скорость будет равна нулю).В первом случае, если вы будете перемещать ваши объекты очень быстро, будет некоторая задержка при движении.Я сам не пробовал второй способ, потому что в этом случае тело не будет сталкиваться с другими кинематическими и статическими телами.

Также вы можете заблокировать вращение тела при движении.

...