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

Riot anuncia LoL mobile, jogos de luta, tiro e uma animação inédita

League of Legends: Wild Rift é versão de LoL para mobile  - Reprodução
League of Legends: Wild Rift é versão de LoL para mobile Imagem: Reprodução

Do START, em São Paulo

15/10/2019 22h41

Durante o evento de comemoração de 10 anos de "League of Legends", a Riot Games anunciou não só o jogo de cartas "Legends of Runeterra", mas uma série de outros games e projetos que estão em desenvolvimento.

Confira a seguir os principais destaques.

League of Legends mobile e nos consoles

A versão mobile de LoL deixou de ser lenda. Ela vai se chamar "League of Legends: Wild Rift", focada em mobile e consoles, com lançamento para 2020.

De acordo com a empresa, "Wild Rift" não é uma adaptação da versão de PC, mas um game feito do zero e levando a consideração as características das novas plataformas. As partidas, por exemplo, terão duração de 15 a 20 minutos.

Além disso, os controles foram adaptados para deixar as disputas de cinco contra cinco no Summoner's Rift, o mapa do jogo, tão intensas quanto na versão de PC, segundo a empresa.

TFT na palma da mão

Uma das desvantagens de "Teamfight Tactics" diante dos concorrentes como "Dota Underlords" era a falta de uma versão mobile. Isso vai mudar no futuro, já que a Riot está trabalhando em uma versão mobile de "Teamfight Tactics". Ele vai deixar de ser um modo de jogo dentro de "League of Legends" para ganhar vida própria. TFT Mobile deve ser lançado em 2020 para dispositivos iOS e Android.

Outros projetos

E não foi só isso. No torneio de luta EVO deste ano, a informação de que a Riot estava desenvolvendo um game de luta foi revelada. Agora, a empresa oficializou o projeot, chamado pelo nome provisório de "Projeto L", que também é baseado no universo de LoL e com os campeões do jogo como personagens. Porém, nenhuma previsão de lançamento foi dada.

Em seguida, foi revelado o "Projeto A", um game de tiro tático focado em personagens, nos moldes de "Overwatch", e que também não tem data para ser lançado.

Para os fãs de eSports, a Riot anunciou "LoL Esports Manager", um simulador em que você poderá montar e gerenciar sua própria equipe de pro-players.

LoL Esports Manager - Divulgação - Divulgação
LoL Esports Manager vai começar em 2020 com jogadores da liga LPL, e gradualmente deve expandir com conteúdo de outras regiões
Imagem: Divulgação

E, para encerrar, a empresa revelou "Arcane", uma série animada de League of Legends com previsão de lançamento para 2020.

SIGA O START NAS REDES SOCIAIS

Twitter: https://twitter.com/start_uol
Instagram: https://www.instagram.com/start_uol/
Facebook: https://www.facebook.com/startuol/
TikTok: http://vm.tiktok.com/Rqwe2g/
Twitch: https://www.twitch.tv/start_uol