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

Espelho de Vó e Dez Reais de Plástico: as armas de RPG como você nunca viu

Dez reais de plástico - Relíquia de um ado não tão distante - Reprodução
Dez reais de plástico - Relíquia de um ado não tão distante Imagem: Reprodução

Giovanna Breve

Colaboração para o START

30/11/2019 04h00

Resumo da notícia

  • Conta no Twitter transforma objetos cotidianos do brasileiro em armas de RPG
  • Arsenal já tem desde "chinelo" e "caçamba de entulho" até "camiseta de vereador" e "GTA pirata"
  • Criadores falam da influência de jogos antigos e até de "Resident Evil" nas criações

Diga adeus para as espadas lendárias de um "Final Fantasy" ou "Kingdom Hearts". Se depender dos "Objetos Reais como Itens de JRPG", você só precisa de um "Espelho de Vó", um "Pão na Chapa" e um "MP3" para se tornar um herói de RPG em uma jornada épica.

Esse perfil de humor no Twitter, que tem quase 150 mil seguidores em menos de um mês de vida, usa a linguagem dos games e dos RPGs japoneses para transformar objetos típicos do dia-a-dia brasileiro em armas e itens fatais. Usando o layout dos menus clássicos, esses "game designers" criam atributos, visual e descrições, fazendo, por exemplo, um pote de sorvete ter "5% de chance" de dar um item lendário — que, com certeza, não será sorvete.

Três cabeças pensam melhor do que uma

Os pais do projeto são três primos que moram em São Paulo (SP). Em entrevista ao START, eles preferem manter o anonimato e comentam que a ideia de misturar objetos do cotidiano como um inventário de um jogo surgiu em uma conversa entre eles, quando notaram que muitos utensílios am despercebidos. "Num dia, falando sobre uma bebida vitaminada, tivemos a ideia de 'Como seriam esses itens dentro de um universo de JRPG?' e a partir daí começamos a produzir", explica o trio.

Cada um tem sua função: um deles faz a modelagem 3D, enquanto o outro monta a interface (design de UI), e o terceiro comanda as mídias sociais. "Esse background diverso de cada um permitiu que a gente unisse as forças para ter um projeto bem legal", conta um dos es.

Da vida real para os RPGs

O trio de primos fala sobre o processo de criação. Depois que uma ideia surge, é feito o processo de modelagem, texturização e animação do item. O último o é inserir tudo isso na interface e publicar nas redes sociais.

Os es contam que sempre jogam videogames. Segundo eles, é "uma parte central tanto de nós hoje, quanto ao longo de nossas vidas". São diversos os games que inspiram o trio na criação de conteúdo, desde o clássico "Chrono Cross" até outros games que, mesmo não sendo um JRPG, têm uma interface icônica de itens, como Resident Evil.

Resident - Reprodução - Reprodução
"Resident Evil", apesar de não ser RPG, é uma das inspirações para os itens e menus do grupo
Imagem: Reprodução

Brasileirinhos guerreiros

Lançada em novembro, a página já ganhou repercussão: atualmente, "Objetos Reais como Itens de JRPG" tem quase 150 mil seguidores no Twitter, e mais de nove mil na recém-inaugurada conta no Instagram.

O trio confessa que ficou surpreso com o sucesso repentino. "Tínhamos noção de que outras pessoas iam curtir, mas é surpreendente como o pessoal curtiu isso, dá muita satisfação porque é aquele tipo de coisa que a gente compartilha enquanto brasileiros."

"Nós lemos o que as pessoas respondem e comentam na página, algo que é muito legal uma vez que são perspectivas e olhares diferentes que, muitas vezes, nós não percebemos."

E por serem três pessoas que organizam existe muita interação. Cada posta e responde os tweets, o que pode gerar opiniões divergentes entre eles. "Os três têm o a tudo, então a gente vai comentando e interagindo de acordo com o que a gente acha. Às vezes é discordando um do outro, outras vezes é respondendo aquilo que dá."

Os comentários do público são importantes, ressaltando a identificação com objetos específicos, como o DVD Pirata de GTA, ou mandando sugestões que, às vezes, o trio acata. "Dar espaço para esse tipo de interação página-seguidor também é muito importante."

Depois dos itens, a página está expandindo o arsenal, incluindo locais como barraquinha de pastel e até a possibilidade de "craftar" (construir novos itens a partir de outros objetos).

"Começamos a perceber que muitas ideias nossas não se encaixavam exatamente como itens, que eram mais locações e aí só pensamos 'Por que não?' e fomos desenvolvendo essa linguagem também em paralelo com a nominal de itens", explica o trio, ainda revelando que pretendem lançar novas ideias, mas que elas ainda são surpresa.

Inventário de itens inusitados

  • Sabonete de resto: "feito com a carcaça de outros sabonetes"
  • Caixa de grafite: "uma vez que este item toca o chão, perde toda sua utilidade"
  • Senha de atendimento: "item necessário para a quest TIRAR SEGUNDA VIA DE DOCUMENTO"
  • Carrinho de pipoca: "seu cheiro de pipoca atravessa até o chumbo mais grosso"
  • Camiseta de vereador: "pode ser transformada no item PANO DE CHÃO"
  • MP3 Player: "equipado com arquivos como STEREOLOVE.mp3"
  • Pão na chapa: "pode ser combinado ao item PINGADO"
  • Espelho de vó: "revela seus mais íntimos pensamentos"
  • CD do Fresno: "lembra dos tempos da juventude"
  • Rolo de papel higiênico quase acabando: "um resquício de esperança"