Box2D调试测试

时间:2012-04-23 18:01:05

标签: cocos2d-iphone box2d box2d-iphone

我遇到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];

1 个答案:

答案 0 :(得分:0)

两个问题:

您是否以递归方式呼叫updateBox2D?对我来说这看起来像是一个无限循环,我很惊讶它没有崩溃你的应用程序。

相反,在CCScene tick方法中,您应该只调用一次世界的步骤(或几次,具体取决于您设置时间步的方式)。

你的下一个问题是你正在向你的身体施加一个小的冲动,但它只是一次性的冲动......角度冲动仍然受到阻尼的影响,因此默认情况下身体不会无限旋转。要保持身体旋转,需要将角度阻尼设置为零:

bodyDef.angularDamping = 0.0f;