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

Fatality neles! Os piores clones de "Mortal Kombat"

Reprodução
Imagem: Reprodução

Giuseppe Carrino

Do GameHall

22/05/2019 14h00

"Mortal Kombat" fez tanto sucesso ao ser lançado em 1992, que várias empresas viram na brutalidade explícita uma oportunidade de negócios. Decidiram, então, criar seus próprios jogos de luta violentos.

Embora alguns tenham sido bem-sucedidos, e outros até tenham inovado em alguns aspectos, nem todos se salvaram -- como podemos comprovar abaixo.

"Expect no Mercy" (PC), 1996

Expect no Mercy (PC) - Reprodução - Reprodução
Imagem: Reprodução

O jogo foi baseado no filme "Mercenários da Morte", que tinha entre seus atores a então desconhecida Laurie Holden, que hoje é famosa por ter interpretado a personagem Andrea na série de TV "The Walking Dead". Ele imitava o estilo de "Mortal Kombat" sem disfarçar muito, utilizando pessoas reais para interpretar os personagens digitalizados e trazendo até mesmo fatalities. De qualquer forma, ele fracassou, assim como o filme.

"Kasumi Ninja" (Jaguar), 1994

Kasumi Ninja (Jaguar) - Reprodução - Reprodução
Imagem: Reprodução

Lançado exclusivamente para o Jaguar, "Kasumi Ninja" é um ilustre desconhecido. Ele também tentou surfar na onda dos games violentos iniciada por "Mortal Kombat", e foi até elogiado pelo seu visual. A jogabilidade desastrosa, porém, impediu que ele se destacasse por muito tempo. Por outro lado, ele foi inovador em outro aspecto: foi um dos primeiros jogos a ter um sistema de trava de conteúdo, permitindo aos jogadores diminuir a violência mostrada nos combates se assim desejassem.

"Way of the Warrior" (3DO), 1994

Way of the Warrior (3DO) -  -

Muito antes de a Naughty Dog ganhar fama mundial com "Uncharted" e "The Last of Us", ela desenvolveu esse exclusivo para 3DO em 1994. Embora tivesse ótimos gráficos e animações para a época, além de trilha sonora composta por Rob Zombie, a complexa jogabilidade afastou os jogadores e críticos. Apesar do fracasso, ele abriu as portas para que a produtora lançasse, alguns anos depois, a trilogia "Crash Bandicoot".

"Shadow: War of Succession" (3DO), 1994

Shadow: War of Succession (3DO) - Reprodução - Reprodução
Imagem: Reprodução

Assim como "Mortal Kombat", ele fez uso de personagens digitalizados, mas ando muito longe da qualidade do título da Midway. É um dos piores jogos de luta já feitos, com tantos bugs, que parece até que foi lançado de forma inacabada no mercado. Gráficos terríveis e uma jogabilidade pavorosa completam o desastre.

"Tattoo Assassins" (Arcade)

Tattoo Assassins (Arcade) - Reprodução - Reprodução
Imagem: Reprodução

Mais um jogo que provavelmente não conhecia até agora. Com direção de Bob Gale, o produtor e roteirista do clássico filme "De Volta para o Futuro", o game nunca chegou a ser lançado de fato. Ele foi concluído e disponibilizado ao público por meio de Arcades de teste em 1994. O bastante negativo e o fato de existirem outros jogos similares e de sucesso no mercado, como "Killer Instinct", levaram o game a ser cancelado pela hoje extinta Data East.