2015-02-03 3 views
2

내 스프라이트가 게임 내 다른 스프라이트와 충돌하면 현재 입자 효과를 표시합니다.재생이 끝나면 부모에서 이미 터 노드를 수동으로 제거해야합니까?

let sparkParticle = SKEmitterNode(fileNamed: "SparkParticle.sks") 
if sparkParticle.parent == nil 
{ 
    sparkParticle.position = mySprite.position 
    self._particleLayer.addChild(sparkParticle) 
} 
sparkParticle.resetSimulation() 

내 스프라이트 현재 I가 입자 방출 노드의 위치를 ​​설정하고 (100)의 최대 1000 개 입자 출산율 인 I 만든 입자있다 :

I는이 코드 조각을 화면. 그런 다음 입자 레이어 노드의 자식으로 추가합니다.

질문이 끝나면 수동으로 파티클 이미 터 노드를 부모에서 제거해야합니까? 또는 Sprite Kit는 재생이 끝난 후 자동으로 제거합니까?

내 프로젝트는 스프라이트가 서로 충돌하도록 설계되었으므로 메모리 누수를 방지하기 위해 수동으로 처리해야하는지 확인하고 싶습니다 (입자 이미 터 노드가 많은 파티클 레이어 이미 연주 완료)

+1

직접 제거해야합니다. – hamobi

+0

@hamobi는 의견에 감사드립니다. 이미 터 노드가 재생을 마쳤을 때 트리거되어 이벤트를 제거 할 수 있는지 감지 할 수있는 이벤트/메소드가 있습니까? – aresz

+0

아니오 나는 그렇게 생각하지 않는다 .. 나는 SKAction을 사용하여 일정 시간이 지나면 제거한다. 설명을 주셔서 감사합니다. – hamobi

답변

0

짧은 대답은 당신이 그것에 대해 걱정할 필요가 없다는 것입니다. 그러나 입자 이미 터가 화면에서 벗어나거나 영구적으로 작동하면 문제가됩니다. 장면이 할당 해제되면 SKEmitterNode가 자동으로 제거됩니다. SKEMitterNode는 노드 트리에 삽입되는 SKNode이기 때문입니다.

그러나 신중하게 처리하려면 장면을 다음 방법으로 할당 해제하기 전에 모든 동작과 에미 터를 수동 및 반복적으로 중지 할 수 있습니다. 장면이 할당 취소되고 내 응용 프로그램이 충돌 한 후에 지연된 SKActions가 실행되는 데 문제가있어서 장면이 할당 해제되기 전에 수동으로 중지했습니다.

SKScene *oldScene = skView.scene; 
[skView presentScene:newScene transition:nil]; 
if (oldScene) 
    [PCUtils recursivelyStopAndRemoveNode:oldScene]; 
+0

. 이 도움이 :) – aresz

0

실제로하는 것이 좋습니다 당신이 장면을 변경하는 곳 그리고

+(void)recursivelyStopAndRemoveNode:(SKNode*)node { 

    // recursively call all children 
    for (SKNode *childNode in [node children]) { 
     [PCUtils recursivelyStopAndRemoveNode:childNode]; 
    } 

    // stop emitters 
    if ([node isKindOfClass:[SKEmitterNode class]]) { 
     SKEmitterNode* sken = (SKEmitterNode*)node; 
     sken.targetNode = nil; 
     sken.particleBirthRate = 0; 
     NSLog(@"stopping emitter %@", node.name); 
    } 

    // stop any running actions 
    [node removeAllActions]; 

    // remove me from my parent. 
    [node removeFromParent]; 

} 

, 당신의 GameViewController에서 사용하거나 :

이전 장면에 대한 참조를 유지하고 현장에이 전화 이미 터를 제거하면됩니다. 에미 터를 제거하지 않았기 때문에 최근에 내 게임에서 문제가 발생했습니다. 에미 터가 추가되었을 때 100 % 재현 할 수 있었기 때문에 프레임 속도 저하의 유일한 이유였습니다. 내가 지체를보기 시작하기 전에 약 20 개의 제거되지 않은 이미 터가 필요했습니다.

실제로는 꽤 쉽습니다. 대기 액션 (1 초 또는 효과의 길이보다 조금 큼)과 removeFromParent 액션을 포함하는 SKAction Sequence를 생성 할 수 있습니다.

이렇게하면 처리가 끝난 후에 제거되므로 프레임 속도가 떨어지지 않습니다.

관련 문제