私は、weldJoint を作成し、それを破棄しました (以下のコードの update メソッドを参照してください)。weldJoint を破棄する際に、線速度を設定して、1 つのボディを別のボディに向けて別のweldJoint を作成します。溶接ジョイントが再作成されることはありません。次の行が原因であると確信しています。
if (weldJoint == NULL) return;
world->DestroyJoint(weldJoint);
weldJoint = NULL;
コードで。次のタイムステップではすでに NULL であるため、weldJoint は作成されません。最初は、ジョイントを破棄した後に break ステートメントを使用しようとしましたが、次の行を指す EXC_BAD_ACCESS エラーが発生していました。
world->DestroyJoint(weldJoint);
破棄して、weldJoints を再作成するにはどうすればよいですか?
更新方法:
-(void) update: (ccTime) dt
{
int32 velocityIterations = 8;
int32 positionIterations = 1;
// Instruct the world to perform a single step of simulation. It is
// generally best to keep the time step and iterations fixed.
world->Step(dt, velocityIterations, positionIterations);
// using the iterator pos over the set
std::set<BodyPair *>::iterator pos;
for(pos = bodiesForJoints.begin(); pos != bodiesForJoints.end(); ++pos)
{
b2WeldJointDef weldJointDef;
BodyPair *bodyPair = *pos;
b2Body *bodyA = bodyPair->bodyA;
b2Body *bodyB = bodyPair->bodyB;
weldJointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter());
weldJointDef.collideConnected = false;
weldJoint = (b2WeldJoint*) world->CreateJoint(&weldJointDef);
// Free the structure we allocated earlier.
free(bodyPair);
// Remove the entry from the set.
bodiesForJoints.erase(pos);
}
for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL)
{
CCSprite *mainSprite = (CCSprite*)b->GetUserData();
if (mainSprite.tag == 1) {
mainSprite.position = CGPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
CGPoint mainSpritePosition = mainSprite.position;
if (mainSprite.isMoved) {
if (weldJoint == NULL) return;
world->DestroyJoint(weldJoint);
weldJoint = NULL;
b2Vec2 velocity = b2Vec2(3.5, 2.2);
b->SetLinearVelocity(velocity);
}
}
}
}
}