2012-04-23 1 views
2

У меня проблема с Box2d. Я создал объект (круг) в центре экрана, который вращается, чтобы проверить, правильно ли я устанавливаю Box2d, следуя руководству, которое я нашел в Интернете. Проблема в том, что круг создан, но я не могу вращаться, несмотря на то, что я следил за учебником, найденным в Интернете. Это код:Тест отладки Box2D

файл .h:

b2World * _world; 
GLESDebugDraw * _debugDraw; 

файл .mm:

-(void)setupWorld { 

    b2Vec2 gravity = b2Vec2(0.0f, 0.0f); 
    bool doSleep = false; 
    _world = new b2World(gravity, doSleep); 

} 

-(void)setupDebugDraw { 

    _debugDraw = new GLESDebugDraw(PTM_RATIO*[[CCDirector sharedDirector] contentScaleFactor]); 
    _world->SetDebugDraw(_debugDraw); 
    _debugDraw->SetFlags(b2DebugDraw::e_shapeBit |b2DebugDraw::e_jointBit); 

} 

-(void)testBox2D { 

    CGSize winSize = [CCDirector sharedDirector].winSize; 

    b2BodyDef bodyDef; 

    bodyDef.type = b2_dynamicBody; 
    bodyDef.position = b2Vec2(winSize.width/2/PTM_RATIO,winSize.height/2/PTM_RATIO); 

    b2Body *body = _world->CreateBody(&bodyDef); 

    b2CircleShape circleShape; 

    circleShape.m_radius = 25.0/PTM_RATIO; 

    b2FixtureDef fixtureDef; 

    fixtureDef.shape = &circleShape; 
    fixtureDef.density = 1.0; 

    body->CreateFixture(&fixtureDef); 

    body->ApplyAngularImpulse(0.01); 

} 

-(void)updateBox2D:(ccTime)dt { 

_world->Step(dt, 1, 1); 

[self updateBox2D:dt]; 

} 

-(void) draw { 

glDisable(GL_TEXTURE_2D); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

_world->DrawDebugData(); 

glEnable(GL_TEXTURE_2D); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

} 
 

в INIT:

[self setupWorld]; 

[self setupDebugDraw]; 

[self testBox2D]; 

ответ

0

две проблемы:

ARE YOU рекурсивный вызов updateBox2D ? Это выглядит как бесконечный цикл для меня, и я удивлен, что это не сбой вашего приложения.

Вместо этого вы должны называть ваш шаг только один раз (или несколько раз в зависимости от того, как вы настроили свой временной шаг) во время вашего метода CCScenetick.

Ваша следующая проблема заключается в том, что вы применяете небольшой импульс к своему телу, но это всего лишь одноразовый импульс ... Угловые импульсы по-прежнему страдают от затухания, поэтому тело по умолчанию не будет вращаться бесконечно. Чтобы ваше тело вращалось, вам необходимо установить угловое затухание на ноль:

bodyDef.angularDamping = 0.0f; 

 Смежные вопросы

  • Нет связанных вопросов^_^