thegoodfellas/blogset-br huggingface dataset:
An amazing game, with an amazing effect Some months ago i put my hands on an amazing game called Rain. It's an adventure game in which the player takes up the role as a young unamed boy who is invisible and can only be seen when standing in the pouring rain. The game is impressive! It has a sensitive atmosphere and an immersive story. But, as a developer, what really caught my attention, was the partial visibility/invisibility of the character when only part of him was under the rain, and part was under some cover. This effect can be seen a lot in the video below.Mimicking the effectI liked this effect so much, that i had to figure out how to implement it, just for the fun of it.So I spent this saturday morning playing with some shaders and cameras and achieved a very close effect. You can see the result in the video below, or you can try it yourself here.With some particles and a "wet surface" shader this could get even closer to the original. Not bad for a quick try huh ? Faz pouco mais de 20 dias que comecei um projeto pessoalchamado "Zim".Como de praxe, fiquei obcecado pelo projeto que acaboutomando (com muito prazer) todo o meu tempo livre, e tem sido um otimoexercicio de programacao e game design.Conceitos basicos do jogoZim e um puzzle game jogo em terceira pessoa sendo desenvolvido sobre Uity3D/C# onde opersonagem utilizaria algumas poucas habilidades especiais para concluir cadafase.Decidir quais habilidades o personagem teria, foi umexercicio de game design bem interessante, simplesmente por que e dificildescartar boas ideias. Durante esta etapa, me pareceu que muitas habilidadesdeixaria o jogador confuso. por isso acabei limitando todas as (centenas) depossibilidades a apenas 3:Um lancador de gel vermelho: O gel repele tudo que toca,logo, pisar no gel, impulsionaria o personagem para cima.Um lancador de oleo: Enquanto estiver sobre o oleo, opersonagem correria mais rapido. Quanto mais longo o caminho com oleo, maior avelocidade que o personagem poderia atingir. Uma "arma magnetica", que poderia segurarobjetos e arremessa-los.Com as habilidades definidas ficou claro tambem algumas coisas divertidas que poderiam ser feitas. Com o gel por exemplo poderiamos alcancar plataformas mais altas:E com o oleo seria possivel ganhar velocidade para vencer obstaculos:E como o personagem estaria constantemente saltando de um lado para o outro, ficou obvio que precisava de algum desafio enquanto estivesse "solto no ar" e a ideia mais simples foi um jato de vapor que empurrasse o jogador impedindo-o de aterrissar onde planejavaNo caso da arma magnetica, seria utilizada para mover todo tipo de plataformas e posicionar objetos em posicoes especificas como uma bateria num slot ou lancar um objeto contra um inimigo.Prototipando - Gel, Oleo e ControlesO primeiro teste foi usando o FirstPersonCharacterController da Unity3D mas logo ficou claro que para atingir os efeitos de fisica do gel e do oleo precisaria escrever um controlador de personagem totalmente baseado em fisica, onde o personagem fosse um RigidBody. Com o controlador do personagem funcionando, restou fazer a logica do gel e do oleo. Ambos afetam o vetor velocity
de todo RigidBody em que tocam, sempre considerando as normais e a direcao do movimento. O resultado e impulso e aceleracao instantaneo!O primeiro resultado satisfatorio ficou assim:Neste ponto a mecanica basica estava funcionando mas o oleo nao poderia ser aquela "geleia" azul!Decidi faze-lo como um decalque, ou seja, um plano com uma imagem alinhado a superficie. Entretanto isso trouxe problemas, ja que as vezes o decalque extrapolava as bordas da face onde havia sido aplicado. Algo parecido com a imagem ao lado.Por simplicidade, decidi nao apelar pra uma engine de decalques e contornar o problema alterando os Bounds do decalque no momento em que era aplicado. Apesar de ter restricoes a solucao funcionou muito bem. Com o problema do decalque solucionado, o oleo estava de cara nova. Nas imagens abaixo, da pra ver o oleo aplicado bem perto das bordas da rampa sem extrapolar os limites. Prototipando - Camera Orbital, Camera Fixa e desobstrucao do campo de visaoFiz os primeiros testes com perspectiva de primeira pessoa, mas a intencao e criar um game em terceira pessoa, entao passo seguinte foi criar uma camera orbital de terceira pessoa e um sistema para esmaecer objetos que se obstruem a visao do jogador. Alem disso criei regioes onde a camera estaria fixa num ponto especifico, dando um ar mais dramatico a cena. Note que ainda nao tenho um modelo decente para o personagem, por isso nos videos a seguir o personagem sera representado com uma capsula, apenas para termos ideia das dimensoes do personagem final.Prototipando - Jato de vapor, e SentinelasQuase todo livro de game design que ja li, comecou tentando definir o que e "divertitdo" e por que as pessoas jogam. E um dos fatores que sempre esta presente nas definicoes dadas e o desafio.Por isso a etapa seguinte, foi incluir alguns obstaculos. De inicio teremos 2 tipos de obstaculos:Jatos de vaporSentinelasOs jatos de vapor sao emitidos por tubos de metal espalhados pela fase. Conforme havia planejado os jatos de vapor empurram o personagem impedindo e atrapalhando a sua trajetoria.O sistema dos jatos foi feito para ser simples de ser adicionado na fase. A quantidade de jatos, intervalo entre eles, a duracao e forca do jato sao configurados direto no editor. Apesar de serem primariamente um obstaculo do jogo, tambem se mostraram bons efeitos decorativos para a faseEnquanto os jatos de vapor sao intermitentes e causem pouco dano por si so, os Sentinelas sao fachos continuos de laser letais para o jogador. Os lasers permanecem na mesma posicao patrulhando seu derredor mas travara a mira no jogador caso cruze seu facho. Alguns segundos sob a mira dos lasers e suficiente para reduzir seu life a zero.Apesar do laser so poder mirar em uma direcao, certas superficies podem refleti-lo, criando obstaculos dinamicos (e mortais mua-ha-ha!!)Prototipando - Juntando tudoNo final da criacao dos lasers, ja tinha elementos suficientes para arriscar projetar um level de testes unindo tudo que foi desenvolvido ate o momento mais algumas outras features essenciais como checkpoints e pickups. E o resultado e esse:ConclusaoMuita coisa ainda precisa ser feita, desenvolvida e ate mesmo
laser para na posicao deste objeto. void ApplyLaserReflection(Vector3 position, Vector3 direction) { RaycastHit hitInfo; vertexCount++; lineRenderer.SetVertexCount(vertexCount); if (Physics.Raycast(position, direction, out hitInfo, Mathf.Infinity) && vertexCount < 10) { // Adiciona um novo vertice ao lineRederer lineRenderer.SetPosition(vertexCount-1, hitInfo.point); // Obtem a tag do objeto que atingimos GameTags targetTag = (GameTags)Enum.Parse(typeof(GameTags), hitInfo.transform.tag); // Atingimos alguma coisa que reflete o laser ? if ( ReflectiveTags.Contains(targetTag)) { Vector3 newDirection = Vector3.Reflect(direction, hitInfo.transform.forward.normalized); //testamos por mais reflexoes... ApplyLaserReflection(hitInfo.point, newDirection); } else { //Atingimos algo que o laser pode causar dano ? if (AffectedTags.Contains(targetTag)) currentTarget = hitInfo.transform.gameObject; else currentTarget = null; } }else { lineRenderer.SetPosition(vertexCount-1 ,position + (direction * 100)); } } Como este metodo atualiza a variavel global currentTarget o metodo Update() aplica o dano enviando uma mensagem com BroadcastMessage();Bem simples e eficaz!
Neste natal, minha familia resolveu dar um netbook pro meu sobrinho de oito anos, que ja lida com o computador melhor que muita gente por ai.Como nao podia deixar de ser, o guri ficou todo satisfeito, e sobrou pro tio Marcio a tarefa de rechear o netbook com programas e jogos. E foi fazendo isso que encontrei na internet o Scratch . Trata-se de um ambiente de programacao integrado destinado principalmente a criancas (mas nao somente).Ao inves de digitar o codigo, voce arrasta e conecta blocos de instrucoes como REPITA X VEZES ou SE-SENAO. Scratch from Karen Brennan on Vimeo. Obviamente nao e algo para desenvolvimento profissional, nem amador a ponto de qualquer crianca conseguir fazer o que bem entender, mesmo assim e uma ferramenta incrivel pra prototipar ideias e fazer jogos simples para estudo ou apenas por diversao.A curva de aprendizado e bem pequena e a facilidade de controlar sprites na cena e obter entrada do usuario faz do scratch o melhor ponto de partida pros leigos iniciarem na programacao de jogos.Outra coisa bem interessante sobre o scratch e que e bem facil publicar os projetos feitos nele. A propria IDE faz o upload pro portal do scratch, onde a comunidade pode jogar, comentar e baixar os "fontes" dos projetos. No portal, o projeto roda como uma applet java, mas ha uma nova opcao de rodar como flash.E claro, enquanto digeria a ceia de natal, comecei a fazer um pequeno game no scratch. Comecei brincando com a logica e vendo ate onde poderia ir, e acabei me surpreendendo com as possibilidades desse programa. A mecanica ja e conhecida e bastante simples. O jogador deve acertar as 3 bandeiras com um tiro de canhao para passar de fase. Para atirar, o jogador deve configurar o angulo da parabola e a velocidade do tiro. Sao 4 fases ao todo, em especial a fase 3 e bastante desafiadora. Quantos tiros voce precisa para completar as 4 fases ? Espero que aqueles que jogarem se divirtam tanto quanto eu me diverti escrevendo. Bom Jogo! E boa programacao pros que quiserem se aventurar (Se nao conseguir visualizar o jogo nesta pagina, acesse diretamente por este link ). Clique na bandeira verde no topo direito para comecar o jogo.Saiba mais sobre este projetoFeliz ano novo! Programacao, Jogos e Jogos de programacaoDesde que tenho acesso a computadores, estou programando alguma coisa. Me lembro de quando ainda cursava o ensino medio (e estou velho) que estava sempre escrevendo um cracker em assembly pra desbloquear algum progama pago ou um emulador de um processador qualquer (z80, 6502 etc) so por diversao...E nao demorou muito para eu ser apresentado um jogo que me permitia justamente isso: programar por diversao. O jogo em questao e o ATRobots onde o jogador programava a IA de um robo em uma linguagem similar a assembly x86 e enviava seu robo - representado na tela por um singelo triangulo num fundo preto - para combater outros robos programados por outros jogadores.Alem deste existem similares voltados para outras linguagens como Robocode para JAVA, CRobots para C e
interpretador.Exemplo de AST para um pequeno trecho de codigoSentinel - Linguagem de programacaoComo queria um ambiente 3d para o jogo e a capacidade de executar na WEB Unity3d foi uma escolha obvia, entretanto ainda era um desafio executar logicas de programacao durante o gameplay. Procurei interpretadores de diversas linguagens de maneira que pudesse integrar com a Unity. Nada deu certo, ou pelo menos nada deu certo satisfatoriamente. Era necessario ter controle absoluto da interpretacao do codigo e garantir que independente do frame rate o codigo de um robo rodaria igual em qualquer computador. Neste ponto ficou claro que seria necessario criar uma linguagem de programacao do zero, ou pelo menos o interpretador.Cada robo dentro da Unity3d tem associado a si uma thread com uma instancia do interpretador pronto apto a executar a AST gerada pelo editor de blocos. Cada robo roda sua propria instancia do interpretadorPara que a AST esteja pronta para ser interpretada, basta serializar a representacao XML para objeto na memoria do interpretador e Voila! Sem analise sintatica ou lexica. Um graaaande atalho! A linguagem sentinel implementa apenas 4 tipos de dados: Texto, Numero, Booleano e Listas (semelhante a arrays). Embora o editor so permita a conexao entre blocos do tipo correto, a linguagem pode converter nativamente de qualquer tipo de dados para outro, tornando a linguagem bastante tolerante a erros basicos de programacao como indexar um array com um a string ou indexar um array com um indice inexistente.O Interpretador da linguagem existe de forma independente do resto do jogo, de modo que seria possivel coloca-lo numa dll separada e utiliza-lo como um interpretador para propositos gerais. O proposito deste post e na verdade apresentar o projeto como um todo, mostrando que o interpretador funciona e ja e possivel criar, programar e executar a logica de combate dos robos. Sendo um projeto de um interpretador embutido em uma engine de jogos, e evidente que existe bastante espaco pra falar da implementacao e arquitetura do projeto o que pretendo sem duvidas fazer em posts futuros.
It has been a while since i made the first demo video presenting the Sentinel Game.A lot of things has changed since then.The scenario improved a lot, lots of bugs were fixed and also lots of optimizations were made in the runtime interpreter.So now, the game is prettier and the user codes are interpreted faster. yay!I've been very busy at work recently, but I'm still being able to update the game every now and then.But, in order to release it as soon as possible (at least a beta version) , i decided to remove some features.For the beta release, players can have only one robot, as a side effect, the robot creation screen was removed.Anyway, It still looks promising for a beta version.That being said, i'm happy to share a new development progress video. Game Design e um conceito mal compreendido pela maioria das pessoas que nao estao envolvidas com o mundo do desenvolvimento de jogos.E comum as pessoas confundirem com desing grafico ou ate mesmo design da arquitetura do software do jogo.Game design se trata de transformar uma ideia em um jogo de maneira que mantenha o jogador jogando. E para manter o jogador na frente do seu jogo, ha uma quantidade enorme de pontos para se pensar como usabilidade, imersao, narrativa, dificuldade, rejogabilidade e inumeras outras. Por isso o designer de um jogo precisa entender consideravelmente dos varios aspectos que envolvem a producao do jogo que pretende criar. Um game designer (na minha opiniao) deve ser capaz de esbocar no papel a aparencia dos personagens e ainda que de maneira simples, modelar um preview (ainda que simplista) de elementos de uma cena do jogo, conhecer tecnicamente a plataforma,linguagens, engines e ferramentas utilizadas no projeto do seu jogo.Possivelmente alguns vao discordar dessa minha visao, dizendo que o designer do jogo deve se abster dos aspectos mais tecnicos do processo. Bom, como todo apaixonado por desenvolvimento de jogos, procuro ler bastante me informar de como pensam os grandes nomes da industria, e eis que encontro uma entrevista (antiga) com o Senhor Fumito Ueda, sobre o processo de desenvolvimento de ICO (jogo obrigatorio para todo aspirante a game designer!). E nessa entrevista o Senhor Ueda, demonstra em diversos pontos sua multidisciplinaridade e como isso resultou num projeto sublime, que conhecemos como ICO.A entrevista pode ser lida na integra aquiVou comentar aqui algumas partes da entrevista que suportam a visao que tenho do game designer:"In 1997, he got the idea to create a game with the universal theme of "boy meets girl," with the two main characters hand-in-hand during an adventure. To express the imagery behind this vague concept, he took an assistant and made a 3-minute movie using Lightwave."Ueda iniciou o projeto criando uma animacao. Ok, tinha um assistente, mas nao parou simplesmente na fase do "Tive uma ideia"!"Full production on the game began in October 1998; the team had made the decision to go with hand-done key frame animation rather than motion capture. Ueda claims that actors weren't able to understand the situation and move appropriated..."Aqui, da pra ver o quanto o
designer estava comprometido com a sua visao do jogo, dispensou o uso da tecnologia de captura de movimentos e optou por animacao manual por que os atores nao compreendiam como se mover adequadamente."Ueda wasn't satisfied with the results they were achieving, and became frustrated that the hardware wasn't capable of realizing his initial vision. He considered three options: either canceling the project outright, altering the design to try and finish the game on PSone, or changing platforms. After some deliberation, the team began converting the project for the PS2 hardware."Aqui, o designer percebe que o hardware nao estava sendo suficiente para alcacar a visao inicial do jogo e ficam limitados a 3 opcoes: cancelar o projeto, alterar o design do jogo, ou mudar par outra plataforma. Como o jogo saiu para Playstation2 e nao playstation, sabemos qual foi a decisao tomada. O importante aqui e o quanto o designer apostava na sua visao do gameplay e quanto compreendia da tecnologia em que estava trabalhando. Fico pensando na responsabilidade de entrar numa sala de reuniao, e dizer para aqueles que pagam pelo projeto 2 anos depois de comecado, que o hardware nao e suficiente para implementar a visao inicial. Percebo que muita gente apostava na proposta inicial, afinal, nao compete ao designer decidir se um jogo sera cancelado ou nao. Acredito que o que os executivos das empresas interessadas tinham era apenas o video de 3 minutos, feito no inicio do projeto mostrando o gameplay que pretendiam alcancar, e ainda sim, mantiveram o design inicial e decidiram mudar a plataformaAo longo da entrevista, as visao do Sr Ueda em relacao a narrativa, roteiro e imersao sao demonstradas como neste trecho onde ele explica uma decisao simples - e fundamental na atmosfera do jogo - de nao legendar as falas da personagem Yorda."Explaining why he opted not to include subtitles for Yorda's dialogue, he said that it was critical to the physical contact and "holding hands" concept that the two not be able to communicate and talk to each other all the time during gameplay."Outros exemplos da multidisciplinaridade inerente ao papel do designer, podem ser lidos aqui, onde Ueda comenta tencicamente os efeitos de iluminacao aplicados sobre as particulas implementadas para o jogo Shadow of the Colossus (como a poeira que levanta quando os colossos andam por exemplo)."This is a method which performs lighting calculations using the relationship between the viewing direction and the lights affecting the particle, which creates an effect where the particle textures appear properly highlighted. The particles lighting calculation itself becomes expensive for the vector unit, but "the particle effect becomes 3D, because it is real-time and interactive, which is a big effect in itself."Como eu disse no inicio do post, cabe ao designer conhcer tecnicamente os aspectos que envolvem a construcao da sua visao. E pudemos ver pelas entrevistas que nos 2 grandes titulos concebidos por Fumito Ueda, ele esteve envolvido desde os aspectos mais tecnicos do hardware ate as facetas mais sutis da narrativa.Obviamente o processo de desenvolvimento de um jogo como ICO ou Shadow of the colossus
nao pode ser comparado a nenhum titulo produzido atualmente no Brasil, mas a essencia do papel do designer, e a mesma desde o mais simples PONG ate a sala mais escura do castelo de ICO.Quando eu crescer, quero ser que nem ele. Ha ha!Alguns links interessantes:ICO na fase de desenvolvimento para o PSOneMaking of Shadow of the ColossusSite brasileiro sobre Fumito Ueda e seus Games
For the last 18 months, i've worked at Huawei, a Chinese multinational Telecom company. So far so good, but i really missed working with game technologies.Suddenly, a job opportunity pops from nowhere! An opportunity to work again with cool technology and manage the development of serious games and 3D simulations with technologies like augmented reality, holography and virtual reality, just to name a few.I've accepted it, and it was then, time to quit the job at Huawei.To resign with style ;) and to show my colleagues my appreciation and gratitude for all we've been through together i wrote my resignation letter the best way i know - as a game! I know a simple e-mail woud be much more direct, but playing a game at work is far more fun than reading an email, right ?The game depicts a miner in a cart jumping obstacles to get gold ores. Each gold ore reveals part of a poem. Among other things the poem brings the sentence: "consider this game as my resignation from Huawei", so everybody got the point and, of course, had fun with it.You can check below the video of the game, played up to the end. Depois de MUITO tempo sem postar, retomo a vida e as atividades anunciando a conclusao de um componente de lockpicking...Lockpicking ja e um recurso batante conhecido e amplamente utilizado em diversos jogos. Quem ja jogou Splinter Cell, Oblivion ,Fallout (sim, usamos os graficos de fallout neste demo) e etc. , ja se deparou com essa forma de ganhar acesso a uma area, ou item protegido por uma tranca.LockpickComponent e um componente XNA (Duh!) e pode ser integrado em qualquer jogo facilmente.A mecanica e bem conhecida. Deve-se encontrar um ponto na circunferencia que permita girar a tranca ate o fim (45graus) para destranca-la.Ao forcar a tranca entretanto, dependendo de quao longe da posicao de abrir estiver o pino, mais ou menos dano e aplicado sobre este. O pino pode quebrar se receber muito dano. Caso hajam mais pinos disponiveis, o componente automaticamente posiciona um pino novo para que o jogador possa tentar novamente.Baseado na dificuldade escolhida, o componente gera um intervalo aleatorio onde o pino deve ser posicionado que a tranca possa ser aberta. Quanto mais proximo o pino estiver deste intervalo, mais a chave de fenda conseguira girar a tranca. Assim, e possivel girar a tranca ate bem proximo do fim e perceber que o pino apesar de proximo, ainda nao esta na posicao ideal.O construtor recebe alem da referencia ao game, a dificuldade e o total de pinos disponiveis para abrir a tranca.A assinatura do construtor e a seguinte:public LockpickComponent(Game pGame, Difficulty pDificulty, int pPinCount)Logo, uma tranca com dificuldade normal, tendo 3 pinos disponiveis ficaria assim: LockpickComponent _lpc;...// Uma tranca de dificuldade Normal. O jogador tera 3 pinos para tentar abri-la_lpc = new LockpickComponent(this, _Difficulty.NORMAL, 3);Ao criar uma instancia do componente, pode-se configurar alguns handlers para os 3 eventos gerados pelo componente:// Evento ao abrir a tranca_lpc.OnUnlock += onLockEvent;// Evento ao desistir de abrir a tranca_lpc.OnCancelPickinLock += onLockEvent;// Evento ao quebrar todos os
pinos disponiveis_lpc.onBreakAllPins += onLockEvent;Ao iniciar, o componente faz uma pequena animacao, aproximando a camera. O zoom maximo pode ser customizado atraves da propriedade Scale, sendo 1.0 o tamanho original. No demo o valor padrao (1.5) foi utilizado.this.Components.Remove(_lpc);No demo, associei todos os eventos ao mesmo metodo, que simplesmente habilita o menu e remove o componente deixando a tela principal visivel novamente. Em um jogo real, provavelmente voce queira associar o eventos a rotinas que atualizem o inventario do personagem para debitar o numero de pinos usados, , abra uma porta em caso de sucesso e obviamente, remova o componente no final.O demo pode ser baixado aqui Lembrando que e preciso o xna runtime 3.1 para que o demo execute corretamente.:)