2014-05-05 3 views
0

Я довольно новичок в Objective-C и Cocos2D, так что легко, я знаю, что это основной материал.Обнаружение столкновений с помощью спрайтов из массива в 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]; 
    } 

} 

} 

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

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

EDIT *

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>" 

ответ

1

Как я вижу, вы используете 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 variable, int score;. В вашем методе didLoadFromCCB, инициализировать его до 0, score=0; и внутри этого метода столкновения, просто сделать score++; и, возможно, сделать NSLog(@"Your score:%i",score);

Надеются, что это помогает.

0

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

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; 
    } 
} 
+0

Мне нравится, когда это происходит, однако с использованием предлагаемого кода не обнаружено столкновения. _hero - это CCSprite, а _goldRing - CCNode, поскольку он загружается из класса goldRing. Я породил два золотых кольца и взял журнал массива, который меня смущает, поскольку их координаты кажутся локальными. Это влияет на boundingBox ?? – Dave440

+0

Спасибо за помощь, я закончил использование метода ccPhysicsCollisionPostSolve и удалил детей по мере их столкновения, а затем повторно набрал другое кольцо. Это был неплохой документ в учебнике PeevedPenguins. Еще раз спасибо. – Dave440

Смежные вопросы