Box2D принимает форму моего тела

        Body b;
        while ((b=box2d.physics.PhysicssWorld.world.getBodyList().getNext())!=null) {

                   Shape shape;
                   while ((shape=b.getShapeList().getNext())!=null) {

                        Log.e("name",""+b.getUserData().toString()+" "+shape+" ");

                        opengl.saveMatrix();
                            Meshes.select(b.getUserData().toString())
                                    .translate((b.getPosition().x)*RATIO, (b.getPosition().y)*RATIO)
                                    .rotate((int) ((int) b.getAngle()* (180 / Math.PI)), 0, 0, 1)
                                    .draw(shape, 1,1,1);

                        opengl.loadMatrix();

                   }


        }

Я хотел бы получить форму своего тела, но ничего не получается, только нуль.. почему?

никогда не запускайте эту строку: Log.e("name",""+b.getUserData().toString()+" "+shape+" ");

поэтому shape=b.getShapeList().getNext()) всегда нуль...


person lacas    schedule 03.05.2011    source источник


Ответы (1)


Я только начинаю работать с Box2D. Насколько я понимаю библиотеку, основным средством получения формы тел являются их приспособления. Из фикстуры вы получаете указатель b2Shape, но, поскольку его методы являются виртуальными, вам, вероятно, потребуется преобразовать его в указатель b2PolygonShape/b2CircleShape, чтобы он был полезен. Вот некоторый код в этих строках:

void DoStuffWithShapes(b2World *World)
{
    b2Body * B = World->GetBodyList();
    while(B != NULL)
    {
        b2Fixture* F = B->GetFixtureList();             
        while(F != NULL)
        {
            switch (F->GetType())
            {
                case b2Shape::e_circle:
                {
                    b2CircleShape* circle = (b2CircleShape*) F->GetShape();                     
                    /* Do stuff with a circle shape */
                }
                break;

                case b2Shape::e_polygon:
                {
                    b2PolygonShape* poly = (b2PolygonShape*) F->GetShape();
                    /* Do stuff with a polygon shape */
                }
                break;
            }
            F = F->GetNext();
        }

        B = B->GetNext();
    }       
}

Еще кое-что, на что следует обратить внимание: функция .getNext() в b2Body возвращает указатель — это реализация связанного списка. То же верно и для b2Fixture::GetNext(). В вашем коде есть некоторые незнакомые (для меня) вещи, поэтому я не могу сказать наверняка, но он может работать нормально, если вы просто пройдетесь и убедитесь, что ваши переменные совпадают с возвращаемыми типами функций Box2D.

person freenatec    schedule 11.05.2011