2014-12-25 3 views
0

ИграИгры звучат без остановки, когда изображение выходит из экрана (игра должна заканчиваться). Это показывает, что метод gameOver продолжает вызываться методом обновления, даже если игра завершена и отображается меню. Надеюсь, вы понимаете, что происходит. Что я могу сделать, чтобы остановить это?ИграНовый звук воспроизводится без остановок

Редактировать: после добавления && !gameEnds (см. Метод обновления ниже) метод gameOver вызывается дважды, мне интересно, почему из всех номеров он называется два раза.

-(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]; 
} 

Этот метод подсчитывает количество отводов (приращения self.counter, когда пользователь нажимает на экран)

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

метод GameOver должен быть вызван, когда изображение покидает экран и количество отводов менее 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

Отлично! Но это также показывает, что вы снова и снова вызываете метод 'gameOver'. Таким образом, вы можете легко обнаружить причину проблемы. – matt

ответ

0

Одним из очевидных подходов было бы приостановить сцену. Таким образом, gameOver будет включать эту строку:

self.paused = true 

Это остановит update: от вызова больше. Вы можете сделать это только в том случае, если у вас больше нет анимации, но, поскольку игра закончилась, возможно, это действительно так.

Если этот подход неприемлем, вам необходимо изменить условие, которое вы тестируете, в update:, чтобы узнать, следует ли вызывать gameOver таким образом, чтобы, если он является истинным на одном проходе, это также не верно на следующем pass и следующего, следующего и следующего ... Например, вы можете поднять флаг Bool (свойство) в gameOver и протестировать его в состоянии.

0

Похоже, что этот метод вызывается постоянно и по-прежнему вызывается, как только игра возвращается в меню, но я уверен, что это не так. Ваш метод воспроизведения звука вызывается асинхронно, и вы просто создали конечное, но очень большое количество вызовов метода, переходя к методу игры до того, как каждый кадр будет визуализирован, и есть несколько кадров, которые соответствуют вашим " игра над "критериями, прежде чем вы действительно вышли из игры. Если вы долго ждали в меню после игры, в конце концов все звуки в очереди будут играть, и это остановится.

Вам просто нужен способ обеспечить, чтобы метод воспроизведения звука вызывался только один раз. Это может быть так же просто, как наличие логического свойства gameIsOver. Если это не ДА, вы устанавливаете его в yes, а затем выполняете вызов метода, который воспроизводит звук. В противном случае вернитесь.

+0

Я отредактировал код (вопрос), I '&&! GameEnds' условиям в методе обновления. Но теперь метод 'gameOver' вызывается дважды. –

+0

Ваша точка верна, если я удаляю '&&! GameEnds' из условий, метод' gameOver' вызывается, как только звук воспроизводится несколько раз. Я пробовал логическое, это не помогает. вызов 'return' после проверки условия не помогает. –

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