cocos2d、box2d for iPhoneでiPhoneゲームを開発しています。ここで 1 つの問題があります。
上のスクリーンショットからわかるように、これらのボールは b2Body です。1つのことを除いて、すべてがうまくいきます。ボールをタップすると、画面から削除したいのですが、うまく機能します。
ただし、接続されている同じ色のボールもすべて削除する必要があります。たとえば、下の赤いボールをタップすると、このタップされたボールと交差するすべての赤いボールも削除する必要があります。
このメソッドはタップ位置を管理します
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
for( UITouch *touch in touches ) {
CGPoint location = [touch locationInView: [touch view]];
location = [[CCDirector sharedDirector] convertToGL: location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);
// go through every single b2Body
for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
b2Fixture *bf = b->GetFixtureList();
// check which ball is tapped
if (bf->TestPoint(locationWorld)) {
[self destroyBall:b];
}
}
}
}
「destroyBall」メソッドは再帰的なメソッドであり、次のように記述されます
- (void) destroyBall:(b2Body *)body_ {
CCSprite *bodySprite = (CCSprite *) body_->GetUserData();
CGFloat h2 = bodySprite.contentSize.height / 2;
CGFloat w2 = bodySprite.contentSize.width / 2;
b2Vec2 p1 = b2Vec2((bodySprite.position.x - w2) / PTM_RATIO, (bodySprite.position.y - h2) / PTM_RATIO);
b2Vec2 p2 = b2Vec2((bodySprite.position.x - w2) / PTM_RATIO, (bodySprite.position.y + h2) / PTM_RATIO);
b2Vec2 p3 = b2Vec2((bodySprite.position.x + w2) / PTM_RATIO, (bodySprite.position.y + h2) / PTM_RATIO);
b2Vec2 p4 = b2Vec2((bodySprite.position.x + w2) / PTM_RATIO, (bodySprite.position.y - h2) / PTM_RATIO);
// go through all b2Body to check which one is intersect with body_
for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {
if ((b->GetUserData() != NULL) && (b != body_)) {
CCSprite *newBall = (CCSprite *)b->GetUserData();
b2Fixture *bf = b->GetFixtureList();
if (bf->TestPoint(p1) || bf->TestPoint(p2) || bf->TestPoint(p3) || bf->TestPoint(p4)) {
if (bodySprite.tag == newBall.tag) {
[self destroyBall:b];
}
}
}
}
CCSpriteBatchNode *batch = (CCSpriteBatchNode *) [self getChildByTag:kTagBatchNode];
[batch removeChild:bodySprite cleanup:YES];
world->DestroyBody(body_);
}
アイデアは非常に単純です。ボール A がタップされると、ボール A を打っている他のボールを探します。ボール B がボール B の場合、打球がなくなるまでボール B でプロセスが繰り返されます。
ただし、再帰関数はノンストップで実行されるようです:(
box2d でこの機能を実行するためのアイデアやアルゴリズムをお持ちでしたら、よろしくお願いします。
ご支援ありがとうございました。
タン