2

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];
4

1 に答える 1

0

2つの問題:

再帰的に呼び出していupdateBox2Dますか?これは私には無限ループのように見えますが、アプリケーションがクラッシュしていないことに驚いています。

代わりに、メソッド中にワールドのステップを1回だけ(またはタイムステップの設定方法によっては数回)呼び出す必要がありますCCScene tick

次の問題は、体に小さなインパルスを適用していることですが、それは1回限りのインパルスです...角度インパルスは依然として減衰の影響を受けるため、デフォルトでは体が無期限に回転することはありません。体を回転させ続けるには、角度減衰をゼロに設定する必要があります。

bodyDef.angularDamping = 0.0f;
于 2012-04-23T21:55:35.823 に答える