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

Paulo Anshowinhas

REPORTAGEM

Texto que relata acontecimentos, baseado em fatos e dados observados ou verificados diretamente pelo jornalista ou obtidos pelo o a fontes jornalísticas reconhecidas e confiáveis.

Jogo de skate de tabuleiro é novidade que será lançada no verão europeu

Action Figures de skate do jogo de tabuleiro Skate Summer a ser lançado em julho na Inglaterra - Reprodução/Instagram
Action Figures de skate do jogo de tabuleiro Skate Summer a ser lançado em julho na Inglaterra Imagem: Reprodução/Instagram

Colunista do UOL

28/01/2022 04h00

O estúdio Pandasaurus Games, conhecido no exterior pelo jogo familiar Machi Koro, acaba de lançar seu novo projeto intitulado - Skate Summer (verão do skate, em tradução livre), e busca a partir desta terça-feira, 18 de janeiro, apoio financeiro para viabilizar o projeto.

De acordo com o estúdio, o jogo se baseou em Tony Hawk Pro Skater em versão tabuleiro, de uma forma mais interativa e menos visual.

Em Skate Summer, os jogadores são desafiados a praticar suas manobras para pontuar mais que os adversários.

Em cada partida, os participantes rivalizam com os outros skatistas para ganhar um verão de skate perfeito, mas para isso tem de atravessar uma cidade recheada de rampas, corrimãos e escadarias para mostrar suas performances, ou levar tombos.

Por ser um jogo de tabuleiro, as cartas determinam o movimento dos seus personagens e as manobras que irão realizar, sendo que cada manobra corresponde a uma cor diferente, e jogadores acumulando mais pontos se eles acertarem mais manobras.

As cartas também orientam o jogador a ir para direita ou esquerda, e mudam de direção e se apontarem sempre para o mesmo caminho, irão fazer o competidor cair e perder pontos.

E assim como nos jogos de "skate games", onde cada manobra acertada, o competidor pode tirar uma letra da palavra (Skate Game), em Skate Summer também é possível fazer esse jogo da forma inversa até escrever a palavra Summer.

O jogo também irá incluir miniaturas que serão incluídas na campanha no site de financiamento coletivo Kickstarter em busca de apoio financeiro para concluir suas atividades e colocar o jogo a disposição.

As regras do jogo são relativamente simples, mas sem versão em português

O objetivo de Skate Sumer é fazer combinações de manobras, coletar tokens e visitar picos de skate para mostrar suas habilidades. Desenhado por Randy Reiman, o jogo foi criado para durar cerca de 45 minutos a uma hora por partida.

Cada partida é realizada por "rounds", sendo que cada uma tem quatro fases.

A primeira fase são os "combos", onde se joga simultaneamente para ver as manobras, sem pontos apenas para checar o "equilíbrio" de cada competidor, um aquecimento.

A segunda são as habilidades e pontuação onde as manobras começam a valer pontos, para se desenvolver no jogo, como se fossem eliminatórias.

Então vem a terceira parte, onde é possível navegar pelas pistas, escolher o skate e as roupas, onde cada um joga de uma vez para aumentar a pontuação, e por último, quem chegar na parte final com mais pontos vence o jogo.

A campanha na Kickstarter abriu dia 18 de janeiro e vai até 11 de fevereiro, e como forma de promover o lançamento irá fazer uma campanha nas redes sociais, onde o público irá dar nome aos Skatistas Monstros, personagens do jogo, alguns já foram escolhidos.

Agora é torcer para surja uma versão em português após o lançamento na Europa, que deve ocorrer no mês de Julho.