2014-02-16 3 views
0

Я пытаюсь добавить эффект частицы в метод touchhesBegan, поэтому, когда пользователь коснется рисованного спрайта (SKSpriteNode), он рисует эффект частицы. Однако, я получаю сообщение об ошибке Попытка добавить SKNode, у которого уже есть родитель: SKEmitterNode. Чтобы добавить какой-то контекст ... Игра имеет стиль bejeweled/candy crush, где блоки (deleteNode) удаляются на основе соседних цветов. В событии касания я повторяю рекурсивно, проверяя соседние блоки и добавляю их в массив, чтобы впоследствии удалить. Перед удалением каждого блока (deleteNode) я хотел бы, чтобы событие частицы произошло. Они оба наследуют от SKNode (правильно?), Так что я не понимаю, конфликт ...Xcode 5.0.2 - Попытка добавить SKNode, у которого уже есть родительский объект: <SKEmitterNode>

@interface 
{ 
    NSString *blockParticlePath; 
    SKEmitterNode *blockParticle; 
} 

в методе инициализации ...

blockParticlePath = [[NSBundle mainBundle] pathForResource:@"blockParticle" ofType:@"sks"; 
blockParticle = [NSKeyedUnarchiver unarchiveObjectWithFile:blockParticlePath]; 

в touchesBegan ...

blockParticle.position = deleteNode.position; 
blockParticle.particleColor = deleteNode.color; 
[self addChild:blockParticle]; 

Чтобы убедиться, что я не сумасшедший, я проверил другие форумы и увидел эту же логику для добавления эффектов частиц к сцене. Заранее спасибо. Если вам нужна дополнительная информация, дайте мне знать.

+0

Если вы просто добавляете свою частицу к себе (I.e. SKScene), вы должны быть в порядке, убедитесь, что у частицы нет родителя. Попробуйте создать новый проект, создайте частицу, а затем добавьте ее в SKScene, если это работает, у вас, вероятно, есть что-то, что вам не хватает. – fuzzygoat

+0

@fuzzygoat: Я выполнил этот тест. В проекте по умолчанию SpriteKit я добавил свои 6 строк кода, минус переменную deleteNode. Вместо этого используйте CGMakePoint для позиции и SKColor для цвета, и он отлично работает. Следующим шагом будет присвоение аналогичных значений в исходном проекте. Может ли компилятор путать узел emmitter с узлом спрайта просто потому, что я назначаю значения, связанные с узлом спрайта? После дальнейшего тестирования я еще раз прокомментирую. Благодарю. – whfissler

+0

Итак, я попытался установить позицию как новый CGPoint: blockParticle.position = CGMakePoint (deleteNode.position.x, deleteNode.position.y); которые я, вероятно, должен был иметь в любом случае. Но, все та же ошибка. Затем я удалил всю свою логику частиц из события касания и добавил частицу к сцене из метода инициализации, она работает. Это не динамично для моих блоков, но оно нарисовано на сцене ... – whfissler

ответ

0

@whfissler, вы объясняли многое, чтобы точно определить это решение.

Эта ошибка возникла только в том случае, если у меня было много активных объектов SKSpriteNodes (ballon game). На каждом шарике кликнет, и добавляется SKEmitterNode (взрыв). Похоже, что когда частицы, созданные взрывом, касаются друг друга, я получаю ту же ошибку, что и вы. Я изменил код из:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    SKEmitterNode *explosion = [SKEmitterNode orb_emitterNamed:@"ballonEksplosion"]; 
    CGPoint positionInScene = [touch locationInNode:self]; 
    explosion.position = positionInScene; 
    SKSpriteNode *touchedSprite; 
    for (int i = 0; i < [[self nodesAtPoint:positionInScene] count]; i++) 
    { 
     touchedSprite = (SKSpriteNode *)[[self nodesAtPoint:positionInScene] objectAtIndex:i]; 
     if ([touchedSprite.name isEqualToString:@"BALLON"]) 
     { 


      [(MBDBallon *)touchedSprite popAndRemoveWithSoundEffect]; 
      [self addChild:explosion]; 
     } 
    } 
} 

к:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 
    SKSpriteNode *touchedSprite; 
    for (int i = 0; i < [[self nodesAtPoint:positionInScene] count]; i++) 
    { 
     touchedSprite = (SKSpriteNode *)[[self nodesAtPoint:positionInScene] objectAtIndex:i]; 
     if ([touchedSprite.name isEqualToString:@"BALLON"]) 
     { 
      SKEmitterNode *explosion = [SKEmitterNode orb_emitterNamed:@"ballonEksplosion"]; 
      explosion.position = positionInScene; 
      [(MBDBallon *)touchedSprite popAndRemoveWithSoundEffect]; 
      [self addChild:explosion]; 
     } 
    } 
} 

, и она работала. Мне кажется, что мой взрыв SKEmitterNode держал как-то долго на SKScene и, следовательно, добавив еще один SKEmitterNode для currentPosition приводит к проблемам с:

self nodesAtPoint:positionInScene 

стек nodesAtPoint.

Я не совсем понимаю это, возможно, это поможет вам в дальнейшем понимании.