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

'Falcão e o Soldado Invernal' volta à fórmula Marvel, mas com boa surpresa

Poster de "Falcão e o Soldado Invernal"
Poster de "Falcão e o Soldado Invernal"
Reprodução

De Splash, em São Paulo

18/03/2021 13h00

Pelos materiais de divulgação, parecia que "Falcão e o Soldado Invernal", série da Marvel que estreia nesta sexta (19) no Disney Plus, iria mesclar cenas de ação intensa com um pouco de humor vindo da dupla improvável formada por Sam Wilson (Anthony Mackie) e Bucky Barnes (Sebastian Stan).

Mas o primeiro episódio da série, que Splash assistiu antecipadamente, trouxe uma boa surpresa que a deixou ainda mais interessante: seus heróis também enfrentam dramas pessoais, e eles não são assim tão diferentes dos meus e dos seus.

Continua depois da publicidade

Se "WandaVision" falou sobre luto a partir da vivência de Wanda (Elizabeth Olsen) em um mundo de fantasia, "Falcão e o Soldado Invernal" o faz de uma forma diferente, mais pé no chão, abrindo espaço para falar também sobre racismo e culpa.

Afinal, as vidas dos protagonistas ainda estão se ajustando.

A série se a alguns meses depois do Blip, a volta dos que haviam virado pó por conta das ações de Thanos. Sam lida com o peso do escudo do Capitão América, entregue por um velho Steve Rogers no fim de "Ultimato", e ainda com os problemas familiares dos quais fugiu ao se alistar na Força Aérea.

Bucky, por sua vez, está consumido pela culpa das ações que cometeu enquanto estava sob comando da Hydra e tenta fazer reparações, em um processo tortuoso.

Tanto Stan quanto Mackie, aliás, se saem bem nos momentos dramáticos exigidos deles. Ainda não deu tempo de ver, porém, como será a química dos dois ao longo da série —e isso vai ter que ficar para outro texto.

Continua depois da publicidade
Reprodução - Reprodução
Anthony Mackie e Sebastian Stan em cena de 'Falcão e o Soldado Invernal'
Imagem: Reprodução

Mas não é só drama...

A série começa com uma sequência ousada de ação aérea que não deixa nada a dever para os filmes do MCU e ainda lança as bases para uma trama de espionagem que segue um pouco os moldes dos filmes do Capitão América, com protestos orquestrados ao redor do mundo.

Nesse sentido, "Falcão e o Soldado Invernal" é um retorno à fórmula Marvel que já conhecemos bem, principalmente em comparação ao início ousado de "WandaVision", uma homenagem às sitcoms que fizeram história na TV.

A nova série tem uma estrutura narrativa bem mais convencional que sua antecessora, mas isso não é um problema: a direção de Kari Skogland ("The Handmaid's Tale") e o roteiro de Malcom Spellman ("Empire") entregam o suficiente para uma trama interessante e promissora, incluindo um gancho forte.

Continua depois da publicidade

Ainda é cedo para dar um veredito, já que Splash só teve o a um dos seis episódios de quase uma hora, mas a série promete uma boa diversão —e consegue criar a vontade de ver mais.