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

GGWP

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Vivo Keyd bicampeã da LBFF: sequência, narrativa e 'laço forte'

Vivo Keyd bicampeã da LBFF - Divulgação/Garena
Vivo Keyd bicampeã da LBFF Imagem: Divulgação/Garena

Colunista do UOL

25/10/2022 04h00

A Liga Brasileira de Free Fire já viveu sete edições - embora a contagem tenha continuado, a segunda acabou cancelada por causa da pandemia do coronavírus. Somente agora a primeira bicampeã foi coroada: a Vivo Keyd ergueu a taça pela segunda vez e ampliou ainda mais sua trajetória no cenário competitivo do Battle Royale da Garena. Uma conquista significativa por diversos motivos e que gera múltiplas análises.

Assim como no Mundial de Sentosa, realizado em maio deste ano, a Keyd voltará a representar o Brasil no principal campeonato global do game. Uma sequência importante para a organização, dona de um dos nomes mais fortes no esporte eletrônico brasileiro. Com uma extensa tradição ao longo dos anos, em diversos jogos, a equipe segue se reinventando para seguir em alta.

Do ponto de vista de narrativa, a edificação de personagens é um dos quesitos nos quais a LBFF precisa evoluir em relação à concorrência. Do que se viu até hoje, o próprio game sempre acabou sendo mais protagonista do que os jogadores - e, de certa maneira, por algum período, com justiça. Afinal, o Free Fire democratizou como nunca os Esports no país.

Porém, a longo prazo, isso pode ser nocivo. É necessário contar com nomes fortes não só fora do servidor, como também dentro. Influenciadores, donos de organizações, grandes streamers... Tudo isso é extremamente importante e colabora para trazer números. Como já dissemos anteriormente aqui no GGWP, é necessário furar a bolha. Ir além das rivalidades já proporcionadas pelo próprio Free Fire.

Da mesma forma que, para as equipes, não é interessante a longo prazo ficar atrelado somente a um jogo e a um tipo de público, para o campeonato é necessário desatar os nós e desenvolver novas (e robustas) histórias. A Vivo Keyd é um laço forte neste sentido, extremamente valioso para a liga. Um imã de tradição, capaz de quebrar paradigmas - mas que precisa ser trabalhado da maneira correta.

Assim como nas modalidades tradicionais, no esporte eletrônico não há uma "receita de bolo" para fazer com que um game (e tudo que o cerca) tenha sucesso e se destaque perante a concorrência. É um exercício constante de reinvenção, observação e, o mais importante: ouvir os s da comunidade e de quem está fora. Saber absorver o melhor de cada ponta.

Porém, um pensamento para se levar seriamente em conta, por mais simples que pareça, na prática. Enquanto os jogos sobem e descem, têm altos e baixos, as organizações tradicionais permanecem - ganhando ou perdendo. Ter esse know how ao estimular uma fan base é parte fundamental.