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

OPINIÃO

Pixel Ripped 1995: jogue "Super Nintendo" em VR escondido da mãe

Pixel Ripped 1995 é continuação de Pixel Ripped 1989 - Divulgação
Pixel Ripped 1995 é continuação de Pixel Ripped 1989 Imagem: Divulgação

Makson Lima

Colaboração para o START

25/02/2020 04h00

Quem nunca ficou jogando videogame até tarde escondido dos pais que atire o primeiro controle. Essa sensação do proibido para terminar mais aquela fase é algo que o futuro jogo Pixel Ripped 1995 consegue transmitir muito bem.

O game em Realidade Virtual é continuação de Pixel Ripped 1989, lançado em 2018 para os principais dispositivos VR. Ainda estamos a alguns meses do lançamento do novo Pixel Ripped, mas START foi convidado para uma sessão de testes no estúdio onde a mágica em Realidade Virtual acontece, o ARVORE, em São Paulo.

Antes de falar de 1995 precisamos voltar alguns anos, porque Pixel Ripped 1989 é um videogame sobre jogar outro videogame, só que em realidade virtual, ao coloca o jogador no papel de Nicola, uma garotinha viciada nessas diversões eletrônicas que tanto gostamos.

Através do aparelho portátil Gear Kid, uma espécie de Game Gear de mãos dadas a um Game Boy, controlamos a super-heroína Dot em sua jornada contra o nefasto Cyblin Lord (um goblin jocoso e maldoso), que quer extrapolar os domínios dos videogames e invadir o nosso mundo, no caso, todo aspecto de Realidade Virtual do jogo.

A mistura entre gameplay convencional, num run 'n gun de alta qualidade, remetendo diretamente a clássicos como Mega Man e Contra, e a interação com o "mundo real" em Realidade Virtual, fizeram de Pixel Ripped 1989 algo estrutural e mecanicamente bastante único.

Um dos desafios do primeiro game é jogar o portátil virtual sem ser pego pela professora no meio da aula. Já em Pixel Ripped 1995, uma estrutura similar acontece, mas agora temos que jogar um videogame 16 bit, como Super Nintendo ou Mega Drive, escondido da mãe.

Pixel Ripped 995 - Divulgação - Divulgação
"Jogando a essa hora da noite">var Collection = { "path" : "commons.uol.com.br/monaco/export/api.uol.com.br/collection/start/games-br/data.json", "channel" : "start", "central" : "start", "titulo" : "Games BR", "search" : {"tags":"80160"} };