Обнаружение столкновений со спрайтами из массива в 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;
}
}