0

私は 4 つの画像 (bat1、bat2、bat3.bat4) があるスプライト シートを持っています。画像にはバットを持っている人がいて、すべての画像をアニメーションで組み合わせると、野球をしているように見えます。以下は、スプライトシートを追加するために使用したコードです。

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"baseball.plist"];

spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"baseball.plist"];
[self addChild:spriteSheet];

background = [CCSprite spriteWithSpriteFrameName:@"bat4.png"];
background.position = ccp(220, 185);
background.tag = 10;
[self addChild:background];

for(int i = 1; i < 5; i++) {
        [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]    spriteFrameByName:[NSString stringWithFormat:@"bat%d.png", i]]];
}

CCAnimation *walkAnim = [CCAnimation animationWithSpriteFrames:walkAnimFrames delay:5.0f];

 self.walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim]];

[background runAction:_walkAction];

そして、ボールとバットの衝突を検知しています。以下のコードで

for (CCSprite *monster in _monsters) {
        if (CGRectIntersectsRect(background.boundingBox, monster.boundingBox)) {
            if (((background.position.x -5 > monster.position.x + (monster.contentSize.width/2)) && background.position.y > monster.position.y)) {
                isCollision = 1;
                [monstersToDelete addObject:monster];
            }
           // [monstersToDelete addObject:monster];
            //[self addFishToBoat];
        }
    }

ここで衝突が検出されますが、常にbat4のrectとの衝突を検出します。バットが動いていて、すべてのバットのcgrectが異なるため、basがbat1から非常に離れている場合でも、ボールのrect は、bat4 の rect と交差します。

しかし、ボールが異なるバットと衝突する場合にのみ衝突が検出されることを望みます。つまり、ボールがbat1、bat2、bat3、bat4でヒットした場合にのみ、bat4で常に検出するのではなく、衝突を検出します。

4

2 に答える 2

0

このコードを試してみてください...

_contactListener = new MyContactListener();
_world->SetContactListener(_contactListener);

// Preload effect
[[SimpleAudioEngine sharedEngine] preloadEffect:@"hahaha.caf"];



std::vector<b2Body *>toDestroy; 
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); 
    pos != _contactListener->_contacts.end(); ++pos) {
    MyContact contact = *pos;

    b2Body *bodyA = contact.fixtureA->GetBody();
    b2Body *bodyB = contact.fixtureB->GetBody();
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
        CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
        CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();

        if (spriteA.tag == 1 && spriteB.tag == 2) {
            toDestroy.push_back(bodyA);
        } else if (spriteA.tag == 2 && spriteB.tag == 1) {
            toDestroy.push_back(bodyB);
        } 
    }        
}

std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
    b2Body *body = *pos2;     
    if (body->GetUserData() != NULL) {
        CCSprite *sprite = (CCSprite *) body->GetUserData();
        [_spriteSheet removeChild:sprite cleanup:YES];
    }
    _world->DestroyBody(body);
}

if (toDestroy.size() > 0) {
    [[SimpleAudioEngine sharedEngine] playEffect:@"hahaha.caf"];   
}

このコードの詳細については、こちらをご覧ください

http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

于 2013-05-13T07:17:51.017 に答える