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

Pai dos jogos de tiro, "DOOM" completa 25 anos; confira 10 curiosidades!

Do GameHall

10/12/2018 15h32

Parece até que foi ontem que a id Software disponibilizou o memorável "DOOM". Lançado no dia 10 de dezembro de 1993 para PC, com muitos ports e sequências sendo criados depois disso, este fantástico título que ajudou a popularizar e redefinir o gênero de jogos de tiro em primeira pessoa, fez seu 25º aniversário nesta segunda-feira.

"DOOM" foi concebido logo após outro jogo de sucesso da id Software, "Wolfenstein 3D", com o objetivo de ser melhor do que ele em todos os seus aspectos, incluindo gráficos, jogabilidade, história e, mais importante, o design das fases, que embora sejam bons neste game, eram muito limitados.

VEJA TAMBÉM

John Carmack, programador e uma das grandes mentes por trás de "DOOM", começou a trabalhar no projeto antes mesmo do lançamento de "Wolfenstein 3D", pois ele tinha uma série de objetivos que desejava alcançar com esse jogo. Ele queria, por exemplo, que os inimigos não ficassem apenas na frente ou atrás do jogador, mas também acima e abaixo dele nas fases. Ele também almejava que os níveis fossem bastante diferentes uns dos outros, com elevadores, texturas com iluminação mais realista e outros elementos que fizessem o game ser verdadeiramente uma experiência 3D.

Com uso do incrivelmente eficaz motor gráfico id Tech 1, desenvolvido por John Carmack, o designer John Romero e o programador Dave Taylor, a id Software criou mapeamentos de texturas e iluminação que até então não existiam em jogos. Algo ainda mais impressionante para a época foi o fato de que o estúdio havia conseguido também separar o motor gráfico de muitos dos materiais artísticos do game, dando ao jogador a habilidade de modificar aspectos presentes no jogo, em um período onde sequer pensava-se que isso era algo possível.

"DOOM" também foi o pioneiro em multiplayer online por meio de um serviço chamado DWANGO, ou "Dial-up Wide-Area Network Game Operation", lançado em 1994 nos Estados Unidos. Entretanto, por causa da precariedade da internet daquela época, era mais divertido jogar em LAN (Rede Local) com outros jogadores na mesma sala, cada um em seu próprio computador, algo que inclusive ajudou na popularização do multiplayer em outros jogos.

O legado de "DOOM" voltou a ser destaque e em grande estilo em 2016 com a chegada do reboot para os consoles atuais e computador. Desenvolvido pela id Software, embora sem a presença dos gênios responsáveis pela criação da franquia, o jogo conseguiu resgatar a sensação do clássico e atualizá-la de forma impecável, criando uma experiência como há anos não se via nesse gênero. O melhor disso é que ano que vem sairá a sequência, para saciar ainda mais a nossa vontade de matar demônios.

A maneira como "DOOM" influenciou a indústria é tão grande que muito daquilo que conhecemos hoje nos games devemos ao fato da existência desse jogo. Um título que pode ser aproveitado mesmo 25 anos depois de seu lançamento, seja no formato original disponibilizado para PCs atuais em "Ultimate Doom" no Steam, ou em adaptações modificadas como "Brutal Doom", criada pelo programador brasileiro Marcos Abenante, também conhecido como Sergeant_Mark_IV, que melhora o jogo em diversos aspectos e faz isso sem sacrificar sua essência. Há também ports, feitos por fãs, que rodam em plataformas inusitadas como calculadoras, impressoras e até mesmo carros, mas o ideal é que você use um computador para experimentar o game em toda a sua glória.