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

Como "Zelda: Breath of the Wild" mudará os games de mundo aberto

Veja "Breath of the Wild" em ação

Flash

Pedro Henrique Lutti Lippe

Do UOL, em São Paulo

22/03/2017 11h00

O novo "Zelda" é um mundo aberto para quem já está cansado de mundos abertos.

Tomadas pela natureza indomável após um evento catastrófico um século atrás, as ruínas de Hyrule resgatam no jogador a curiosidade e a vontade de explorar que tantos outros jogos falharam em instigar nos anos recentes. Surpresas estão por todos os lados e tomam as mais diversas formas: inimigos inesperados, itens criativos, quebra-cabeças engenhosos, diálogos engraçados...

Perante a vastidão deste mundo, Link é minúsculo. Seja escalando desfiladeiros ou cavalgando pelos campos, a pequenez do herói fica evidente - o que torna ainda mais impactantes momentos em que suas ações fazem a diferença. E não falo apenas de grandes feitos na história, mas também de pequenas coisas corriqueiras, como quando uma flecha de fogo desgovernada em uma batalha acaba deixando o gramado ao redor em chamas.

"Breath of the Wild" é uma aventura no real sentido da palavra. Você não vai seguir pontos pré-marcados no mapa atrás de coletáveis ou grupos de inimigos, mas sim decidir uma direção qualquer e tomar seu rumo, de cabeça aberta para fazer novas descobertas.

O incrível mundo de "Breath of the Wild"

Flash

Ainda que seja tratado por todos como um grande herói, Link tem a seu favor apenas um repertório de talentos acrobáticos. Para sobreviver ao mundo selvagem e seus perigos, o guerreiro depende de itens que encontra pelo caminho. Carnes de caça, plantas e cogumelos colhidos das florestas e partes de monstros podem ser transformados em refeições que recuperam pontos de vida e reforçam atributos, por exemplo.

É preciso improvisar até mesmo quando o assunto é equipamento: espadas, tacapes, lanças e escudos quebram rapidamente com o uso. Torna-se parte da estratégia de combate saber quando é o melhor momento para utilizar qual arma contra quem. A capacidade de atacar e defender é um recurso limitado, e muitas vezes é preciso dar um jeito de roubar a arma de um inimigo para usar contra ele (mesmo que a arma em questão seja um galho seco ou um esfregão).

Nota de Zelda: breath of the wild - Arte/UOL Jogos - Arte/UOL Jogos
Game foi avaliado no Nintendo Switch
Imagem: Arte/UOL Jogos

Todos estes elementos de gerenciamento de recursos acrescentam à experiência. O jogador não só é obrigado a estar sempre atento aos locais que visita em busca de itens úteis, como também precisa usar constantemente a criatividade para resolver problemas que não tem uma única solução. O ambiente está frio demais? Link pode vestir um casaco. Ou talvez comer uma refeição quente. Ou quem sabe até mesmo carregar consigo uma arma com propriedades elementais de fogo.

Pequenas 'dungeons' com quebra-cabeças independentes, as Shrines são outros ótimos exemplos de como a engenhosidade do game motiva o jogador a ser igualmente engenhoso.

É certo: quando Link entra em um Shrine, ele tem todas as ferramentas que precisa para completá-lo. Mas as várias soluções para cada um dos enigmas que eles escondem raramente são óbvias. Algumas cobram precisão, outras raciocínio lógico - mas todas, sem exceção, am um sentimento incrível de satisfação quando descobertas.

Cada Shrine é um microcosmo de "Breath of the Wild" como um todo. Estamos falando de um game que respeita o tempo do jogador, por sempre recompensar aquele que investe alguns minutos a mais para explorar aquela pequena caverna. E talvez ainda mais raro: é um game que respeita a inteligência do jogador, por oferecer desafios que não vêm acompanhados de uma etiqueta com a solução. (Aclamado, "Horizon" tem 'quebra-cabeças' cujas respostas estão literalmente escritas na parede.)

E "Breath of the Wild" não é divertido apenas por conta de suas mecânicas. O game tem cenários incríveis, chefes ameaçadores, uma narrativa emocionante, personagens cativantes (dos protagonistas aos figurantes que você encontra por acaso), e uma infinidade de conteúdo.

Pequenas liberdades como a de escalar qualquer encosta ou a de cortar árvores para fazer pontes de troncos, somadas, dão ao jogador a impressão de que a própria criatividade é o único limite. E afinal, não é exatamente isso que significa ser um mundo aberto?

O gênero nunca mais será o mesmo. "Breath of the Wild" dá liberdade de verdade aos jogadores, e aqueles que não fizerem o mesmo a partir de agora ficarão para trás, perdendo o direito de serem chamados de 'jogos de mundo aberto'.