Sequenciar manualmente o carregamento do jogo com onReady

Quando a página que contém seu jogo é carregada pela primeira vez, há vários eventos assíncronos acontecendo.

A lógica do jogo e a tag de anúncio são carregadas, a API Ad Placement começa a ser inicializada, e os anúncios podem ser pré-carregados. Como resultado, se você chamar adBreak() muito pouco tempo depois do carregamento da página, há uma chance de que a API não tenha sido inicializada ou que os anúncios não tenham terminado de pré-carregar. Se a API não tiver inicializado, a chamada vai falhar. Se você tiver registrado um callback adBreakDone(), o breakStatus será definido como notReady.

Se você precisar sincronizar a lógica do jogo com a inicialização da API Ad Placement, use o callback onReady() para adConfig().

onReady() é chamado pela API Ad Placement quando:

  • a tag do anúncio foi carregada,
  • a API Ad Placement foi carregada e inicializada;
  • os anúncios terminaram de pré-carregar, se você solicitou o pré-carregamento usando adConfig()

Neste ponto, a API Ad Placement está totalmente inicializada. Você pode chamar adBreak(), e ele não vai retornar um status notReady. Mas, como sempre, adBreak() ainda pode não mostrar um anúncio (por exemplo, não havia um anúncio disponível).

Confira um exemplo que mostra o uso de onReady():

...
<script>
    window.adsbygoogle = window.adsbygoogle || [];
    var adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    ...
    function init() {
      // Game start logic, show loading screen
      adConfig({
        preloadAdBreaks: 'on',
        onReady: showAd
      });
      // Don't start the gameplay just yet, keep loading.
    }

    function showAd() {
      // Show an ad
      adBreak({
        type: 'start',
        adBreakDone: startGame,  // always called, unblocks the game logic
        ...
      });
    }
    ...
</script>

Observação: o caso de uso mais comum para chamar adBreak() logo após o carregamento da página é implementar um pré-roll. Recomendamos usar um tipo de posicionamento preroll em vez de tentar criar o seu próprio usando os métodos descritos aqui.

O preroll implementa automaticamente toda a lógica necessária de pré-carregamento e tempo limite. Se você usar um prerroll com seu jogo, não será necessário usar onReady(). Saiba mais sobre o prérroll.

Tempo limite

Não há garantia de que onReady() será chamado se a inicialização da API Ad Placement for atrasada ou não carregar completamente. Para garantir que o jogo comece a tempo, configure um tempo limite. Se você receber o callback onReady(), chame adBreak() para veicular o anúncio. Caso contrário, pule a chamada de anúncio e continue carregando o jogo.

O exemplo a seguir inclui um tempo limite e é semelhante à lógica implementada por um canal de pré-roll:

...
<script>
    window.adsbygoogle = window.adsbygoogle || [];
    var adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    ...
    function init() {
        // Game start logic
        let adConfigPromise =
            new Promise((resolve, reject) => adConfig({
                preloadAdBreaks: 'on',
                onReady: () => resolve(true)
            }));
        let timeoutPromise =
            new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(false);
                }, 2000);
            });
        // Whatever happens first resolves this promise.
        Promise.race([
            adConfigPromise,
            timeoutPromise
        ]).then((shouldShowPreRoll) => {
            if (shouldShowPreRoll) {
                showPreRoll();
            } else {
                startGame();
            }
        });
    }

    function showPreRoll() {
      // Show ad
      adBreak({
          type: 'start',
          adBreakDone: startGame, // always called, unblocks the game logic
          ...
      });
    }
    ...
</script>