2014-02-16 5 views
0

touchesBegan 메소드에 입자 효과를 추가하려고하므로 사용자가 그려진 스프라이트 (SKSpriteNode)를 터치하면 입자 효과. 그러나 오류가 나타납니다 이미 부모가있는 SKNode SKEmitterNode을 추가하려고했습니다. 컨텍스트를 추가하려면 ... 게임은 인접한 색상을 기반으로 블록 (deleteNode)이 삭제되는 보석으로 장식 한 사탕 스타일입니다. 터치 이벤트에서 반복적으로 반복하여 이웃 블록을 확인한 다음 나중에 제거 할 배열에 추가합니다. 각 블록 (deleteNode)을 제거하기 전에 입자 이벤트를 발생시키고 싶습니다. 그들은 둘 다 (오른쪽?), 그래서 ... 초기화 방법Xcode 5.0.2 - 이미 상위 항목이있는 SKNode를 추가하려고 시도했습니다. <SKEmitterNode>

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

... touchesBegan에서

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

... 충돌을 이해하지 못하는 SKNode에서 상속

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

내가 미치지 않았 음을 확인하기 위해 다른 포럼을 확인한 다음 장면에 입자 효과를 추가하는 것과 동일한 논리를 보았습니다. 미리 감사드립니다. 더 자세한 정보가 필요하시면 알려주세요.

+0

입자를 자기 (즉, SKScene)에 단순히 덧붙이면 괜찮을 것입니다. 파티클에 부모가 없는지 확인하십시오. 새 프로젝트를 만들고 파티클을 만든 다음 SKScene에 추가하십시오. 작동하는 경우 누락 된 부분이있을 수 있습니다. – fuzzygoat

+0

@fuzzygoat : 나는 그 테스트를 수행했다. SpriteKit 기본 프로젝트에서 deleteNode 변수를 뺀 6 줄의 코드를 추가했습니다. 대신 위치에 CGMakePoint를 사용하고 색상에 SKColor를 사용하면 정상적으로 작동합니다. 다음 단계는 원래 프로젝트에서 비슷한 값을 지정하는 것입니다. Sprite 노드와 관련된 값을 할당하기 때문에 컴파일러가 emmitter 노드를 스프라이트 노드와 혼동시킬 수 있습니까? 추가 테스트를 마친 후 다시 의견을 말합니다. 감사. – whfissler

+0

자, 위치를 새로운 CGPoint로 설정하려고했습니다 : blockParticle.position = CGMakePoint (deleteNode.position.x, deleteNode.position.y); 나는 아마 가지고 있어야한다. 그러나 여전히 같은 오류입니다. 그런 다음 터치 이벤트에서 모든 입자 로직을 제거하고 초기화 메소드 내에서 입자를 장면에 추가했습니다. 제 블록에는 역동적 인 것이 아니라 장면에 그려져 있습니다 ... – whfissler

답변

0

@whfissler, 당신은이 솔루션을 정확하게 지적하는 데 많은 도움이되었습니다.

이 오류는 많은 SKSpriteNodes (ballon 게임)가 활성화 된 경우에만 발생했습니다. 각 ballon에서이를 클릭하면 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]; 
     } 
    } 
} 

그것은했다.

self nodesAtPoint:positionInScene 

nodesAtPoint 스택 : 나에게 내 폭발 SKEmitterNode가 SKScene에 긴에 어떻게 든 유지되므로 함께 문제에 currentPosition 리드에 대한 또 다른 SKEmitterNode를 추가했다 것 같다.

완전히 이해하지 못해서 더 잘 이해할 수 있습니다.