;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL

Topo

Overwatch no Switch: Nintendo anuncia chegada do game; Pokémon tem novidade

Overwatch - Reprodução
Overwatch Imagem: Reprodução

Do UOL, em São Paulo

04/09/2019 19h04

O game "Overwatch", da Blizzard, chegará ao Nintendo Switch no dia 15 de outubro de 2019. O anúncio foi feito nesta quarta-feira (4), durante o Nintendo Direct.

A pré-venda já foi iniciada no site norte-americano da Nintendo; neste momento, já é possível adquirir o jogo por 39,99 dólares (pouco mais de R$ 160). O game ocupará 12.1 GB na memória do console.

"O fenômeno mundial chega ao Nintendo Switch", disse a Nintendo, que promete que o lançamento terá "novas formas de jogar", como controlar os bonecos usando o sensor de movimento dos Joy-Cons. A empresa, porém, não deixou claro se haverá outras diferenças das versões de PlayStation 4, Xbox One e PC.

Novos Pokémon

Para os games "Pokémon Sword" e "Pokémon Shield", que serão lançados em 15 de novembro, a Nintendo anunciou dois novos monstrinhos Pokémon.

Estamos falando de "Polteageist" (do tipo "fantasma"), que tem seu corpo feito de chá e envolvido por um bule, e a ave "Cramorant" (do tipo "água"), que tem "grande apetite e engole qualquer coisa que couber em seu bico" - as imagens de gameplay exibidas no Direct mostram um golpe com o qual o "Cramorant" cospe o que estiver em sua boca na direção do adversário.

pokémon novos - reprodução/Nintendo Direct - reprodução/Nintendo Direct
Os novos Pokémon anunciados pela Nintendo: Polteageist e Cramorant
Imagem: reprodução/Nintendo Direct

Além disso, a Nintendo introduziu ao público novidades como o "Pokémon Camp"; nestes acampamentos, o jogador poderá cozinhar mais de 100 receitas de curry com arroz (com direito a um "Curry Dex", que registrará cada nova descoberta gastronômica), brincar com seus próprios Pokémon e até interagir com os de outros players. Agora, também será possível personalizar todo o look de seu personagem, incluindo maquiagem.

O game "The Legend of Zelda: Link's Awakening" também foi destaque no Direct. O remake do clássico de 1993 poderá ser apreciado pelos jogadores a partir de 20 de setembro deste ano. Outro relançamento será "Xenoblade Chronicles", originalmente feito para o Wii.

A dupla Banjo-Kazooie estará disponível no "Super Smash Bros Ultimate" a partir de hoje (4); posteriormente, em novembro, o game também terá o lutador Terry Bogard, de "Fatal Fury" e "The King of Fighters".

Jogos de Super Nintendo no Switch

Quanto aos membros do sistema online do Switch, os mais nostálgicos poderão curtir uma lista de clássicos de Super Nintendo a partir desta quinta-feira (5). Estes s também terão a oportunidade exclusiva de comprar um controle de SNES feito para o Switch. O ório custará 29,99 dólares (mais de R$ 120).

snes no switch - reprodução/Nintendo Direct - reprodução/Nintendo Direct
Imagem: reprodução/Nintendo Direct

Veja os jogos de SNES anunciados para o Nintendo Switch Online:

  • Brawl Brothers
  • Breath of Fire
  • Demon's Crest
  • F-ZERO
  • Joe & Mac 2: Lost in the Tropics
  • Kirby's Dream Course
  • Kirby's Dream Land 3
  • Pilotwings
  • Star Fox
  • Stunt Race FX
  • Super E.D.F. Earth Defense Force
  • Super Ghouls'n Ghosts
  • Super Mario Kart
  • Super Mario World
  • Super Mario World 2: Yoshi's Island
  • Super Metroid
  • Super Puyo Puyo 2
  • Super Soccer
  • Super Tennis
  • The Legend of Zelda: A Link to the Past