Обнаружение столкновений со спрайтами из массива в Cocos2D

Я довольно новичок в Objective-C и Cocos2D, так что будьте спокойны, я знаю, что это базовый материал.

Я использую массив для случайного размещения 4 спрайтов золотых монет на экране, и я использую другого спрайта (дракона), чтобы летать вокруг и собирать монеты. Очевидно, я хочу, чтобы монета исчезла, а другая появилась случайно (например, собирать яблоки в Снейке). Моя проблема в том, что я не знаю, как ссылаться на отдельные спрайты. Я добавил некоторую обработку в метод обновления, но а) я не считаю его подходящим и б) он ничего не делает. Пожалуйста помоги. Я думаю, что мне нужно использовать:

[self removeChild:sprite cleanup:YES];

Но я не уверен как. Вот как я заполняю экран кольцами:

@implementation MainScene {

CCSprite *_hero;
CCPhysicsNode *_physicsNode;
CCSprite *_goldRing;
NSMutableArray *_goldRings;

}

-(void)didLoadFromCCB {

self.userInteractionEnabled = TRUE;

_goldRing.physicsBody.collisionType = @"Level";
_goldRing.physicsBody.sensor = TRUE;

_physicsNode.collisionDelegate = self;
_hero.physicsBody.collisionType = @"hero";

CGFloat random = ((double)arc4random() / ARC4RANDOM_MAX);   
_meteorites = [NSMutableArray array];
[self spawnNewGoldRing];
[self spawnNewGoldRing];
[self spawnNewGoldRing];
[self spawnNewGoldRing];

}

-(void)spawnNewGoldRing {

CGFloat randomX = ((double)arc4random() / ARC4RANDOM_MAX);
CGFloat randomY = ((double)arc4random() / ARC4RANDOM_MAX);
CGFloat rangeX = 200;
CGFloat rangeY = 300;

CCNode *goldRing = [CCBReader load:@"goldRing"];
goldRing.position = ccp(randomX * rangeX, (randomY * rangeY)+100);
[_physicsNode addChild:goldRing];
[_goldRings addObject:goldRing];
}

- (void)update:(CCTime)delta {

_hero.position = ccp(_hero.position.x, _hero.position.y);

if(_hero.position.x <= _hero.contentSize.width/2 * -1.5) {
    _hero.position = ccp(_ground.contentSize.width + _hero.contentSize.width/2, _hero.position.y);

    NSMutableArray *collectedGoldRings = nil;
    for (CCNode *goldRing in _goldRings) {
        CGPoint goldRingWorldPosition = [_physicsNode convertToWorldSpace:goldRing.position];
        CGPoint goldRingScreenPosition = [self convertToNodeSpace:goldRingWorldPosition];
        if (goldRingScreenPosition.x < -goldRing.contentSize.width) {
            if (!collectedGoldRings) {
                collectedGoldRings = [NSMutableArray array];
            }
            [collectedGoldRings addObject:goldRing];
        }
    }
    for (CCNode *goldRingToRemove in collectedGoldRings) {
        [goldRingToRemove removeFromParent];
        [_goldRings removeObject:goldRingToRemove];
        // for each removed goldRing, add a new one
        [self spawnNewGoldRing];
    }

}

}

Было бы слишком много, чтобы спросить, как вести подсчет этих тоже, чтобы отобразить счет?

Большое спасибо за любую помощь.

РЕДАКТИРОВАТЬ*

NSLog на массиве золотых колец

"<goldRing = 0x9b756b0 | Rect = (0.00,0.00,24.00,23.50) | tag =  | atlasIndex = -1>"
)
2014-05-08 10:24:32.201 dragonCollector2[10165:60b] Gold Ring Loaded
2014-05-08 10:24:32.201 dragonCollector2[10165:60b] Array:(
"<goldRing = 0x9b77e50 | Rect = (0.00,0.00,24.00,23.50) | tag =  | atlasIndex = -1>"

2 ответа

Решение

Как я вижу, вы используете spritebuilder, поэтому вы используете новую версию Cocos2D. В этой версии вы можете отслеживать коллизию между двумя типами узлов. В твоем случае монеты и герой.

Это так просто, как:

1) Установите свой coin.physicsBody.collisionType = @"coin";

2) Установите свой hero.physicsBody.collisionType = @"hero";

3) Реализуйте этот метод:

-(void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair hero:(CCNode *)nodeA coin:(CCNode *)nodeB{

//this method will be automatically called when the hero hits a coin.
//now call your method to remove the coin and call the method to add another coin.
}

Чтобы сохранить счет, просто сделайте переменную типа int, int score;, В вашем методе didLoadFromCCB инициализируйте его 0, score=0; и внутри этого метода столкновения, просто сделайте score++; и, возможно, сделать NSLog(@"Your score:%i",score);

Надеюсь это поможет.

Для таких вещей вам не нужно использовать физику. Когда ваш герой коснется монеты, просто обновите счет пользователя (это может быть целое число) и положение монеты. в вашем методе обновления сделайте что-то вроде

for(CCSprite *gold in _goldRings){
    if(CGRectIntersectsRect(_hero.boundingBox,gold.boundingBox)){
        //touched a coin
        //do whatever u want
        //do not remove the coin from the array, just change it's position!
        _userPoints += 1;
        gold.position=ccp(arc4random()%200 , arc4random()%300);
        break;
    }
}   
Другие вопросы по тегам