我遇到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 :(得分:0)
两个问题:
您是否以递归方式呼叫updateBox2D
?对我来说这看起来像是一个无限循环,我很惊讶它没有崩溃你的应用程序。
相反,在CCScene
tick
方法中,您应该只调用一次世界的步骤(或几次,具体取决于您设置时间步的方式)。
你的下一个问题是你正在向你的身体施加一个小的冲动,但它只是一次性的冲动......角度冲动仍然受到阻尼的影响,因此默认情况下身体不会无限旋转。要保持身体旋转,需要将角度阻尼设置为零:
bodyDef.angularDamping = 0.0f;