2014-12-25 5 views
0

게임이 끝날 때 이미지가 화면을 벗어날 때 gameOver 사운드가 멈추지 않습니다. 게임이 끝나고 메뉴가 표시 되더라도 updateOn 메서드는 update 메서드에 의해 계속 호출됨을 보여줍니다. 무슨 일이 일어나고 있는지 이해하시기 바랍니다. 이것을 막으려면 어떻게해야합니까?gameOver 사운드가 멈추지 않습니다.

편집 : && !gameEnds (아래의 업데이트 방법 참조)을 추가 한 후 gameOver 메서드를 두 번 호출하면 모든 숫자 중에서 두 번 호출되는 이유가 궁금합니다.

-(void)callNextImage: (UITapGestureRecognizer *)recognizer 
{ 
    self.counter++; 
} 

gameOver 방법은 이미지가 스크린과 탭의 개수 벗어날 때 호출한다 (사용자가 화면을 탭 때 self.counter 단위)

-(void)gameOver 
{ 
    self.gameEnds = YES; 

    // Play the gameOver sound 
    [self runAction:[SKAction playSoundFileNamed:@"gameOver.caf" waitForCompletion:NO]]; 

    [mainLayer enumerateChildNodesWithName:@"Board" usingBlock:^(SKNode *node, BOOL *stop) { 
     [node runAction:[SKAction fadeOutWithDuration:1.0f]]; 
    }]; 

    [mainLayer enumerateChildNodesWithName:@"Time" usingBlock:^(SKNode *node, BOOL *stop) { 
     [node runAction:[SKAction fadeOutWithDuration:1.0f]]; 
    }]; 

    // showing the menu 
    [menu show]; 
} 

이 방법은 탭 수를 카운트 4보다 작으며이 방법은 이와 관련이있는 것으로 보입니다.

-(void)update:(CFTimeInterval)currentTime { 
    /* Called before each frame is rendered */ 

    if (self.counter < 4 
     && (image.position.y > self.frame.size.height + 75.5f) && !gameEnds) { 
     [self gameOver]; 
    } 
} 
+0

디버거를 사용해 보셨습니까? – matt

+0

@matt : 나는 그랬다. gameOver 메서드가 계속해서 호출되었다는 것을 보여준다. –

+0

Excellent! 그러나 그것은 또한 당신에게'gameOver' 메소드를 반복적으로 호출하는 것을 보여줍니다. 따라서 문제의 원인을 쉽게 발견 할 수 있습니다. – matt

답변

0

명백한 접근 방법은 장면을 일시 중지하는 것입니다. 이것은 더 이상이라는 것을 update:을 중지

self.paused = true 

: 따라서, gameOver이 라인을 포함한다. 수행 할 애니메이션이 더 이상 없다면 수행 할 수 있지만 게임이 끝난 후 실제로는 사실입니다.

이러한 접근 방식을 사용할 수 없다면 update:에서 테스트 할 조건을 수정하여 gameOver을 호출해야하는지 여부를 확인해야합니다. 한 번에 참이면 다음 번에도 적용되지 않습니다. 패스와 다음 그리고 다음과 다음 ... 예를 들어 gameOver에 Bool 플래그 (속성)를 올리고 조건에서 테스트 할 수 있습니다.

0

이 메서드는 계속 호출되며 게임이 메뉴에 돌아 오면 여전히 호출되는 것으로 보입니다. 그러나 나는 그렇지 않습니다. 사운드를 재생하는 메서드는 비동기 적으로 호출되며, 모든 프레임이 렌더링되기 전에 메서드를 통해 게임으로 이동하여 메서드에 대한 유한하지만 매우 많은 호출을 간단하게 만들었으며 사용자의 " 게임 오버 "기준에 부합하는지 확인하십시오. 게임이 끝난 후 메뉴를 오래 기다렸 더라면 결국 대기중인 모든 사운드가 재생되고 멈출 것입니다.

소리를 재생하는 방법이 한 번만 호출되도록하는 방법이 필요합니다. 이는 부울 속성 gameIsOver를 갖는 것처럼 간단 할 수 있습니다. YES가 아닌 경우, yes로 설정 한 다음 사운드를 재생하는 메소드를 호출합니다. 그렇지 않으면 리턴하십시오.

+0

코드 (질문)를 편집했고, 나는 '&&! gameEnds'를 업데이트 메소드의 조건에 맞게 편집했습니다. 그러나 이제는'gameOver' 메쏘드가 두 번 호출됩니다. –

+0

당신의 요점은 사실입니다. 조건에서'&&! gameEnds'를 제거하면 사운드가 여러 번 재생되면'gameOver' 메서드가 호출됩니다. 부울을 시도했지만 도움이되지 않습니다. 조건을 확인한 후에'return'을 호출해도 도움이되지 않습니다. –

관련 문제