3

これはかなり簡単に聞こえるかもしれません。メソッドを作成し、initメソッドで以下のように呼び出しました。

[self createNewSpr:ccp(s.width * 0.25,s.height-200)];
[self createNewSpr:ccp(s.width * 0.50,s.height-200)];
[self createNewSpr:ccp(s.width * 0.75,s.height-200)];
[self scheduleUpdate];

スプライトに世界よりも高い重力を課すforループをupdateメソッドで定義しました。最後の呼び出しだけが新しい重力の影響を受けますが、最初と2番目は世界の重力に影響します。何が悪いのかわかりませんが、scheduleUpdateのようです。助けてください。

編集:更新方法:

-(void) update: (ccTime) dt 
{
 int32 velocityIterations = 8;
 int32 positionIterations = 1; 
 world->Step(dt, velocityIterations, positionIterations);
 for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
   {
     if (b == sprite)
        {
         b->ApplyForce( b2Vec2(0.0,20*b->GetMass()),b->GetWorldCenter());
        }
   }
}

the createNewSpr:
-(void) createNewSpr:(CGPoint)pos {
//CGSize s = [CCDirector sharedDirector].winSize;
b2Vec2 startPos = [self toMeters:pos];
CGFloat linkHeight = 0.24;
CGFloat linkWidth = 0.1;

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position = startPos;
b2FixtureDef fixtureDef;
fixtureDef.density = 0.1;
b2PolygonShape polygonShape;
polygonShape.SetAsBox(linkWidth,linkHeight);
fixtureDef.shape = &polygonShape;


//first
b2Body* link = world->CreateBody( &bodyDef );
link->CreateFixture( &fixtureDef );

PhysicsSprite* segmentSprite = [PhysicsSprite spriteWithFile:@"sg.png"];
[self addChild:segmentSprite];
[segmentSprite setPhysicsBody:link];


b2RevoluteJointDef revoluteJointDef;
revoluteJointDef.localAnchorA.Set( 0,  linkHeight);
revoluteJointDef.localAnchorB.Set( 0, -linkHeight);


for (int i = 0; i < 10; i++) {

    b2Body* newLink = world->CreateBody( &bodyDef );
    newLink->CreateFixture( &fixtureDef );
    PhysicsSprite* segmentSprite = [PhysicsSprite spriteWithFile:@"sg.png"];
    [self addChild:segmentSprite];
    [segmentSprite setPhysicsBody:link];

    revoluteJointDef.bodyA = link;
    revoluteJointDef.bodyB = newLink;
    world->CreateJoint( &revoluteJointDef );

    link = newLink;//next iteration
}

PhysicsSprite* circleBodySprite = [PhysicsSprite spriteWithFile:@"cb.png"];
[self addChild:circleBodySprite z:1];

b2CircleShape circleShape;
circleShape.m_radius = circleBodySprite.contentSize.width/2 / PTM_RATIO;
fixtureDef.shape = &circleShape;
b2Body* chainBase =world->CreateBody( &bodyDef );
chainBase->CreateFixture( &fixtureDef );
[circleBodySprite setPhysicsBody:chainBase];
sprite = chainBase;

revoluteJointDef.bodyA = link;
revoluteJointDef.bodyB = chainBase;


revoluteJointDef.localAnchorA.Set(0,linkWidth);

revoluteJointDef.localAnchorB.Set(0,linkWidth);
world->CreateJoint( &revoluteJointDef );
}
4

1 に答える 1

1

問題はcreateNewSpr方法にあります...

ボディに割り当てspriteました...したがって、このメソッドを3回呼び出すspriteと、3番目のオブジェクトのみが参照されます。

メソッドで比較すると、update3番目のオブジェクトに重力がかかるだけです...

お役に立てれば.. :)

于 2012-05-07T16:16:59.313 に答える