Pausando o jogo dentro do loop do jogo

12

Dentro do loop do jogo, o jogo é interrompido pressionando P, o que significa que o loop do jogo não funciona mais. O problema é que, após a interrupção desse loop, P não pode ser pressionado novamente para retomar o loop, pois estava dentro do próprio loop. Como fazê-lo para que, quando P for pressionado novamente, faça o loop funcionar novamente?

GSquadron
fonte

Respostas:

20

Na verdade, não pare o ciclo do jogo ao pausar o jogo. Em vez disso, você deve adicionar a variável bool, que é alterada para true / false, dependendo do jogo estar em pausa. Se o jogo estiver em pausa, você precisará parar de atualizar o jogo, mas ainda poderá continuar renderizando o quadro atual, inclusive recebendo atualizações da entrada.

if(gameIsPaused == false)
{
    // run updates
}
checkInput();
render();
Katu
fonte
Você pode querer ter uma checkInputfunção diferente para o modo pausado e o modo não pausado, porque pode haver alguns controles que estão disponíveis apenas em um modo ou outro. A checkInputfunção do modo de pausa pode fazer nada além de procurar se Pé pressionada e depois definida gameIsPaused = false, mas alguns jogos também colocam funcionalidade adicional na tela de pausa (nos anos 90, era popular ter a tela de pausa como entrada oculta para códigos de truques, modernos jogos gostam de combiná-lo com uma tela de menu).
23715 Philipp
1
Embora geralmente concorde com sua resposta, acho que deve ser explicitamente declarado que, às vezes, é perfeitamente válido executar algumas atualizações no estado de pausa. Por exemplo, animação de itens de menu ou talvez algum gerenciamento de áudio. A grande idéia é que a condição de pausa permita que você se ramifique em outro conjunto de checkInput/ render/ updatechamadas.
22615 Nicholas Miller
A única coisa que interrompe o jogo deve mudar é que o bit "update world" deve ser ignorado. Todas as outras funcionalidades provavelmente devem permanecer como normais.
precisa saber é o seguinte
4
Tentei manter a resposta o mais simples possível, porque isso é uma coisa muito básica na programação de jogos e não quis confundir o interlocutor.
Katu
1
@ user3730788: Uma ramificação executada uma vez por loop de jogo (ou seja, menos de 100 vezes por segundo) não terá impacto discernível no desempenho, nem mesmo se for imprevisível todas as vezes .
Ilmari Karonen
1

Faça com que pressione P alterne para outro loop que lida com o estado do jogo "Pausado" e permita a transição novamente para o loop original do jogo pressionando P novamente.

Na verdade, você pode colocar tudo isso no loop do jogo e introduzir uma variável de estado. Se desejar, em vez de desativar o loop, a variável de estado alterna entre a execução do respectivo código específico de estado no loop.

Haf
fonte