terça-feira, 29 de janeiro de 2013

Global Game Jam 2013 - Like a Boss!

E ai pessoal, tudo bem?

Bom, como de costume haha, mil desculpas pela demora em fazer uma nova postagem. Semana passada foi extremamente corrida, tivemos dois dias inteiros de reuniões e sexta-feira não só foi feriado em São Paulo como foi o início do Global Game Jam 2013 (que por sua vez foi FODA!), então realmente não tivemos tempo.

No entanto, por mais coisas que tenha pra fazer hoje, sinto que preciso contar como foi nossa experiência no Global Game Jam, então prepare-se para um post longo!


Acho que a primeira coisa que posso dizer é que esse foi o primeiro Jam não-competitivo que participamos. E ao todo, nosso 3o Game Jam na vida... nosso primeiro foi na BGS 2010, como a equipe representando a Universidade Anhembi Morumbi (onde somos formados), que aconteceu no Rio de Janeiro e com certeza foi uma experiência muito legal, o joguinho que fizemos (Jornada de Miner) foi vencedor da competição e levamos pra casa um PS3 cada um. Posso dizer que aquele foi nosso primeiro jogo em Unity de todos os tempos, a primeira vez que eu pessoalmente peguei pra programar na engine.

Jornada de Miner, 2010, BGS

Nosso segundo Game Jam foi o Dev Island no BIG, que ao contrário dos Jams tradicionais durou apenas 24 horas, onde criamos Ready, Eat, Fight! (saiba mais e jogue aqui), que foi na verdade o primeiro Jam após a criação da Fire Horse, e foi outra experiência show de bola, não ganhamos a competição (essa honra foi pro estúdio Catavento) mas criamos algo que nos orgulhamos de ter feito, sinceramente achamos que é um jogo que tem muito futuro e temos planos de ainda expandir a ideia para um jogo mais completo.

Ready, Eat, Fight!, 2012, BIG Dev Island

E nessa sexta-feira, dia 25, participamos pela primeira vez no Global Game Jam. Eu estaria mentindo se não dissesse que parte da gente ficou com preguiça de participar por não ser uma competição. É algo que achamos importante, ter um feedback de como foi nosso desempenho, não apenas criar por criar... são muitas horas de trabalho pra talvez ficarem jogadas ao vento só por isso mesmo... enfim, no começo não estávamos muito animados com a ideia  MAS, decidimos tentar, afinal de contas é um evento enorme e achamos que era a melhor forma de tentar algo desse tipo. Decidimos aproveitar o tempo do GGJ pra pensar, elaborar novas ideias, fazer um bom brainstorm e tentar sair com algo interessante, diferente do habitual, mas não um jogo-conceito, queríamos sair do GGJ com uma IDEIA foda, mais do que um produto foda. Mas será que saímos com uma ideia foda? Sera que o produto ficou um lixo? Sera que o Danilo virou homem? A resposta pra todas essas perguntas (menos sobre o Danilo, isso talvez a gente nunca saiba) está descrita abaixo!

Capítulo 1 - Preparação

A primeira coisa que fizemos foi estocar alimentos. Fomos ao supermercado e compramos alguns litros de energéticos, alguns pacotes de salgadinho tamanho família, alguns litros de coca-cola, pão e frios para a primeira noite (só a primeira noite, pq frios fora da geladeira... é tenso), um pacote de Ana Maria pra cada um, e pra não dizer que foi só porcaria, compramos UM cacho de banana... e ainda sobrou uma banana no final das contas!! Enfim, a parte importante aqui é pensar em alimentos que não precisem de cozimento nem de geladeira, e levar bastante coisa pra beliscar. É importante levar coisas que sejam gostosas, e não miguelar nas quantidades, porque comer coisas sem graça ou ficar sem comer baixam a produtividade, tiram a concentração do que realmente importa, criar jogos.

Só alimentos saudáveis, óbvio

Também é importante notar que apesar de não ser algo seguido por todos os jammers do mundo, você vai passar 2 dias inteiros fora de casa... é bom levar no mínimo uma troca de roupa, um casaco, sabonete e etc, por você e pelos outros! Ficar grudento fedendo e programando com certeza não é algo muito agradável pra ninguém.

Capítulo 2 - Brainstorm

Bom, depois de tudo isso, juntar nossas máquinas (ninguém da equipe tem Note então isso quer dizer 3 desktops) e ir pro evento, arrumamos nosso equipamento, cumprimentamos e conhecemos algumas pessoas e em torno das 17hrs +- assistimos a um breve keynote do GGJ com algumas dicas e a parte que interessa... o TEMA! Como imagino que todos saibam mas vale mencionar, o tema desse ano foi "The sound of a heartbeat", "O som de um batimentos cardíaco", apresentado apenas como som. Como foi apresentado, o tema não é "o coração", mas os batimentos... o que abre uma gama enorme de possibilidades. Saímos da apresentação pensando no que poderíamos fazer.


Num primeiro momento esse pareceu ser um tema bem legal, a gente logo de cara pensou em um monte de possíveis aplicações e tudo o mais... mas como disse ai pra cima, a gente não tava ali pra fazer "um joguinho", então a primeira coisa que eliminamos foram todas as ideias que eram dentro do corpo humano ou qualquer corpo que seja. Não achamos que é um negócio interessante, se alguém diz "não, pq vc é um glóbulo branco que navega pelas veias até o coração e não sei oq...", não sei vocês, mas eu pensaria "uau........................... que jogo legal.................................. -.-"... enfim, a gente queria evitar ao máximo qualquer aplicação muito na cara do tema. Falar a verdade chegou um ponto da discussão que a gente tava pouco se lixando pro tema. A gente pensou em pelo menos umas 30 ideias de jogo, e no final estávamos entre duas que dariam bons jogos, mas ao mesmo tempo, não eram exatamente o que a gente queria... a gente queria na verdade criar um jogo que fosse diferente do que a gente costuma criar, não se preocupar com "é comercializável? alguém vai querer essa porcaria?" enfim, uma coisa que fosse simplesmente diferente.

Rabiscos das ideias... foram muito mais que essas...

Até ficarmos entre essas duas ideias, já era em torno de 1hr da manha do sábado .. isso é, nós ficamos 8 horas e meia só conversando sobre ideias pra ficar entre duas... e ainda não estávamos contentes... na verdade estávamos é preocupados em não ter tempo de fazer uma ideia mais legal por passar tanto tempo discutindo... 8 horas e meia é mais do que 1/3 de um dia, a gente ainda não tinha nada além de uns rabiscos no papel...

Featuring minha careca sexy... -.-

E ai a gente começou a pensar filosoficamente .. "Pq que tal jogo é bom?" "Que elemento disso aqui que as pessoas se sentem tão atraídas assim?" "Será que não da pra re trabalhar isso?" "Que jogo que eu gosto? Pq que eu gosto desse jogo?" e a partir daí tentar reimaginar algum jogo com outro aspecto, outro ponto de vista... retrabalhar a mecânica e pensar em algo interessante... e numa dessas, quase que sem querer, sem pensar, perguntei pro Fernando e Danilo o seguinte: "Ok... World of Warcraft... a galera em geral gosta de raid e tal, fazer aqueles grupos de 25, 40 pessoas pra matar um chefe... e se ao invés disso, você fosse o chefe e tivesse que matar as 40 pessoas?" e depois de 1 ou 2 segundos pensando sobre isso, pensamos "hmmm... é impressão minha ou a gente acabou de ter uma ideia foda??" ahah, e de repente, todas as 8 horas e meia de discussão foram pro lixo e já sabíamos o que faríamos, um jogo em que você está la de boa na sua sala maligna só relaxando quando uma raid chega pra roubar tudo que você tem.

Capítulo 3 - Desenvolvimento

Agora que o que queríamos fazer estava claro, precisávamos pensar no "como fazer" das coisas... eu como programador imediatamente sabia que a IA ia ser o ponto mais difícil, pois pra ficar um negócio divertido, a IA teria que ser inteligente suficiente pra não ser só mais um "Diablo" da vida que tem trezentos bixos e você da uma porrada e eles morrem todos, e ao mesmo tempo não queria simplesmente colocar 10 milhões de vida pra cada inimigo e ai você na prática enfrenta 40 bosses. Ao mesmo tempo, sabia que em 48 horas (na verdade 39) não ia ser capaz de programar algumas IAs que são praticamente humanas (nem uma IA foda desse jeito eu ia conseguir nesse tempo, imagina várias (não sei nem se consigo criar uma dessas na vida inteira =P)). Outra coisa que seria um desafio seria modelar, texturizar e animar vários personagens 3D, mais o ambiente, mais o menu e interface com tão pouco tempo.

Sketchs de versões do Boss (player)

O que nós queríamos nessa game jam era criar ao menos um protótipo de uma ideia que a gente considerasse realmente boa, ver até onde conseguíamos puxar, e fazer tudo isso da maneira mais rápida possível. Então, ao subirmos de volta pra sala, o Danilo pegou algumas folhas e criou rapidinho um model sheet do que seria o Boss (ou no nosso caso o Player) e o Fernando logo que recebeu começou a modelar freneticamente  Eu por outro lado, sabia que ia querer usar algumas classes que eu já tinha preparadas anteriormente, uma delas certamente seria a que mostrei aqui no blog no último post, a de movimentação do Knights Trial. Peguei a classe e vi que tinha uma série de particularidades específicas para Knights Trial, fiz uma adaptação e apliquei em um quadrado, e assim, já tinha o personagem principal andando do jeito que queria.

Trabalhando... nota para os nossos pequenos notebooks =P

Pensamos em que golpes o Boss teria, mas o que já era certo é que ele usaria uma arma e poderia bater com ela. Logo, precisaria de um Trail Renderer melhor que o que vem junto do Unity (que causa alguns problemas, ou eu pelo menos não sei usar direito), que se chama TimeBasedTrailRenderer, que está na Unify Community e é basicamente a mesma coisa, mas ao invés de ser baseado na distância entre as posições, é baseado no tempo que passou, e depois de muito teste no Knights Trial, oferece um resultado muito melhor.

Enquanto fazia as adaptações de alguns scripts, o Fernando me enviou o personagem principal animado, e adaptei o script de animação do boss pra o esqueleto e tudo o mais que eram diferentes agora. A última coisa que faltava eu copiar de Knight´s Trial eram as habilidades Slash, Thunderclap e Bladestorm. Elas não são exatamente complexas, na verdade graças ao sistema de skills, é muito fácil criar outras habilidades, mas como o Boss usaria exatamente as mesmas habilidades, e eu sabia que o tempo seria apertado para o Danilo (que pinta as texturas), achei melhor pegar esses assets completos do outro projeto.

Comendo... Pizza by Unity, valeu Jay Santos!

E então, com o Boss praticamente funcional, comecei a criar as IAs. Não são, definitivamente, as IAs mais complexas do mundo, mas com certeza são bem mais complexas que no Knight´s Trial. Cada um deles responde aos eventos que acontecem e procuram agir de forma a evitar a morte a todo custo. Fogem do boss, usam habilidades pra se proteger em fases em que o dano recebido é muito alto, curam sempre os alvos de maior prioridade, esperam o momento certo de usarem habilidades que causam mais dano, enfim, ainda tem muito a acrescentar nesse sentido, mas com certeza fiquei feliz com o resultado das IAs.

Passei boa parte das horas trabalhando nas IAs, e enquanto isso os modelos e texturas iam ficando prontos e animados, e eu implementava tudo no projeto, que aos poucos foi tomando forma... e logo já estava jogável. Infelizmente não tenho nenhum screenshot dessa fase do desenvolvimento pra mostrar, mas é basicamente um chão cinza sem nada, e um monte de bixo se matando em cima =P.

Trabalhando.... dia e noite... e gostando!

Foi nessa hora que me toquei que agora, finalmente, estávamos fazendo um jogo para web, PC... enfim, máquinas que TEM capacidade de processamento pra rodar alguma coisa... e comecei a enfeitar o jogo. Liguei a sombra dinâmica, adicionei Bloom Effects (Image Effect do Unity Pro), não economizei nas partículas, não otimizei o código como de costume (até pelo tempo de desenvolvimento)... e o jogo continuou leve! Posso dizer agora que depois de fazer UM jogo pra mobile, você está definitivamente apto a fazer um jogo bonito pra PC haha, porque é tão ABSURDA a diferença de poder de um e outro que sério, é incomparável. Enquanto Knight´s Trial está giga otimizado (pelo menos até onde eu sei otimizar), mal aguenta 5 inimigos na tela num iphone 3GS... Like a Boss aguenta até em PCs mais velhos 40 inimigos + boss + image effect + sombra dinâmica + partícula pra burro + ia mais complexa... e tranquilo! Na realidade eu cheguei a fazer testes com 120 inimigos e foi ai que começou a cair de 60 FPS... 120 inimigos... é MUITA coisa...

Á esquerda o Danilo pintando as texturas, eu no meio com Unity aberto e á direita o Fernando modelando outra parte do cenário.

Enfim, trabalhamos muito, muito mesmo, entre sexta e domingo a noite dormi apenas 3 horas e foi apertado de tempo... mas valeu a pena, valeu MUITO a pena! Alias, como mencionado no site do nosso jogo no Global Game Jam, um agradecimento especial para o Emmo Martins, da Bamba Music por ter criado a trilha sonora do jogo pra gente na hora, super atencioso e prestativo, e sabe do que fala, vale a pena conferir o trabalho do cara!

Enfim, foi cansativo, foi tenso, passamos horas e horas e mais horas só no brainstorm de uma ideia... mas com certeza foi um tempo MUITO bem aproveitado, e nos orgulhamos MUITO do resultado final! Modestia á parte, eu acho que terminamos esse GGJ, literalmente, Like a Boss! =P

Like a Boss... literally

Para jogar o jogo, basta clicar aqui!

Capítulo 4 - Adicionando personalidade ao jogo

Esse acho que é o tópico que eu mais quero discutir aqui nesse post. Sei que já escrevi pra burro e pouca gente vai ter paciência de ler até aqui, mas a gente precisa guardar o melhor para o final. Na minha singela opinião, apesar de eu ter ficado MUITO satisfeito com o gameplay do jogo, com como os inimigos ficaram difíceis, resistentes, mesmo tendo tão pouca vida (Uma skill chega a dar 5000 de dano, tem inimigo com 6000 de vida... mas graças á cooperação, eles se aguentam), acredito que nós conseguimos adicionar uma layer de personalidade ao jogo que a gente nunca tinha explorado e ficou muito legal e com certeza vamos explorar muito muito mais daqui pra frente, que é:

***Diálogos entre NPCs***


É isso mesmo... linhas de diálogo que um NPC fala para o outro... como por exemplo na imagem abaixo:

NPC: "Christ, 3hrs and a half to get here today"/"Jesus, 3hrs e meia pra chegar aqui hoje"

Na imagem acima o texto aparece na legenda da imagem... então toda a raid (termo usado pra definir um grupo muito grande de jogadores em MMOs, caso alguém não saiba) que está se organizando pra chamar o Boss fuderastico que é você, um dos caras la no meio ta reclamando que hoje a raid demorou muito pra chegar nesse ponto da dungeon... os outros concordam, mas se mostram otimistas... um até diz que ta esperando faz tempo pra por a mão na arma do Boss (sua arma!), e por fim o líder do grupo pede silêncio pra começar a luta que exige muita concentração.

Esse é apenas o diálogo inicial, e usamos esse diálogo até como tutorial disfarçado... em um dos casos (existem vários diálogos, um deles é escolhido aleatoriamente a cada vez que o jogador inicia o jogo) um dos jogadores diz "É minha primeira vez aqui, por favor explica a luta", e os outros dizem como o Boss é épico (você é épico!), que tem ataques mortais e tudo o mais... e o líder fecha dizendo que é só sair de cima das coisas brilhantes (a dica mais óbvia e tradicional de todos os chefes de todos os MMOs de todo o mundo =P).

LEEEROOOOYYYYYYY JENKIIIINNNSSSSS!!!!1111

Eu sei que parece bobeira... as falas deles não afetam em absolutamente nada o jogo... mas de verdade, adicionam uma camada de imersão na ideia que você é o chefe, o fodão, que é até difícil de entender. Durante a luta eles reclamam uns com os outros sobre falhas de gameplay, por exemplo, os Tanks reclamam que os Healers não estão curando bem, os Healers avisam que estão ficando sem mana, pedem para os arqueiros usarem bandagens, os arqueiros falam quando usam uma magia forte pro Tank manter o aggro do Boss... enfim, detalhes... quando um deles morre ele pode ficar puto por morrer e falar "GG to fora", um monte de piadinhas internas de MMOs que dão uma camada muito legal pro jogo.

Game Over... jeito é esperar seu respawn =/

Quando os jogadores ganham no entanto, eles começam a discutir os itens que caíram de você, como por exemplo, na screenshot acima um dos Healers está empolgado porque caiu o cajado Amathena (qualquer relação com esse item é mera coincidência), um cara está reclamando que você demorou para morrer, o outro já está formando um novo grupo pra fazer heroic mode... boberinhas, frases pequenas, mas que dão um humor pro jogo pelo mesmo motivo que os "memes", são coisas que a gente ta tão acostumado de ouvir enquanto joga, que quando vê um NPC que quer se passar por humano, falando isso... é... cômico! haha

Capítulo 5 - Conclusão

Resumidamente, o que tenho a dizer do GGJ é que foi MUITO legal participar, a gente não se preocupou muito com tema, com nada desse tipo, a gente se preocupou em pegar esse tempo e usar de maneira criativa e foi um esforço muito válido e recompensador.

Acho que não preciso nem dizer como estamos empolgados em trabalhar em cima dessa ideia  pra ser bem sincero eu to contando os segundos pra pegar esse projeto e deixar mais robusto, já tivemos UM MONTE de ideias em cima desse jogo e com certeza vocês vão ouvir mais sobre esse projeto nos próximos tempos.

Bom, como sempre, gostaria de agradecer a paciência por ter lido até aqui, espero que tenham gostado do nosso relato sobre o GGJ, e qualquer comentário, sugestão, crítica, etc, deixa um comentário que a gente responde assim que possível.

Grande abraço!

domingo, 20 de janeiro de 2013

Knight's Trial - Flamethrower, crítico e mira

Boa noite pessoal, tudo bem?

Nessa ultima semana (13-01-2013 a 19-01-2013) a gente tem trabalhado em cima de alguns detalhes do jogo. Na verdade a gente ta trabalhando em cima de uma coisa BEM legal, mas quando estiver mais encaminhada eu mostro pra vocês. Mas, enquanto a coisa BEM legal não aparece haha, estou fazendo alguns ajustes em detalhes do jogo, e trabalhando em cima de umas possibilidades que estamos estudando, mas falo disso em outro post se tudo se confirmar. Hoje no entanto, quero mostrar o seguinte:

Update visual de Flamethrower

A primeira coisa que quero mostrar pra vocês é que finalmente melhoramos a arte da magia Flamethrower! Estava bem porca pra ser sincero, não temos muito a manha dos particle effects ainda, e o novo também não tá exatamente como a gente gostaria, MAS, vejam o videozinho e digam o que acham =).


Danos Críticos

Pra quem prestou atenção no vídeo e já jogou o jogo em algum momento, pode ter percebido outro detalhe que implementamos recentemente. Adicionamos danos críticos, por enquanto o sistema é meio simples, ainda não acho que a arte do "crítico" seja final, mas digam o que acham! Essa é definitivamente a mudança mais ridícula de se fazer, como jogar um dado mesmo... se o valor (de 1 a 100) for menor que 20 por exemplo, um crítico acontece... e um fator divertido no jogo, que possibilita inclusive uma profundidade maior nos itens, que podem dar ao invés de puro aumento de dano, aumentar a chance de danos críticos.


Slow Motion

Outro detalhezinho que também já tinha sido implementado alguns dias atrás é o Slow Motion. Nós diminuimos a velocidade do jogo por um tempo bem breve quando o jogador consegue atingir 3 inimigos ou mais em um só hit, e da um efeito diferenciado, tipo potencializa o impacto, é algo +- assim:


O slow motion na verdade é só o começo de algo que a gente quer adicionar já faz algum tempo. Queremos criar esse tipo de "mini objetivo" durante a partida pro jogador, tipo acertar vários inimigos de uma vez, jogar inimigos pra fora da arena e tudo o mais, dando pequenas recompensas (XP, achievements, gold), incentivando que ele jogue um pouco mais estratégicamente e não puro hack'n'slash. Um exemplo bem recente desse tipo de coisa (que existe em varios jogos) é Diablo 3, quando você elimina muitos monstros com uma só habilidade, ou em muito pouco tempo... é algo desse tipo.

Orientação do Personagem

Bom, essa é uma mudança que não é válida para mobile. Basicamente, agora o jogador pode controlar com o mouse a orientação do personagem ao invés de simplesmente mirar as mágias e elas sairem na direção do click. Não só era horrível você estar andando pra frente e soltar um Frostbolt pra trás e ele sair atravessando você toscamente, como tornava habilidades como o Flamethrower um tanto difíceis de usar, uma vez que só atiravam para a frente. Como agora é possível rotacionar o torso do personagem, você pode lançar chamas para todos os lados sem mudar sua direção de movimento. (Da pra ver isso no vídeo do Flamethrower, la em cima, o Flamethrower antigo ainda não tinha essa funcionalidade, o novo é claramente muito mais fácil controlar)

De todas as features que estou descrevendo aqui, hoje, essa é certamente a mais complicada, pentelha e chata de implementar de todas. Por quê? Bom, é o seguinte:

Não queremos que nenhuma magia atrapalhe a movimentação do personagem, isso é muito chato. Então, se o personagem está indo pra cima, mas quer lançar uma magia pra baixo, se no código eu simplesmente girar o personagem 180 graus pra trás, a animação vai parecer um moonwalk (as pernas vao correr pra baixo (já que estão viradas pra baixo) e o personagem vai, efetivamente, se mover pra cima.

Além disso, se o lançar um Frostbolt precisar esperar toda uma animação do personagem se virando, atirando, e virando de volta... sério, é chato. Perde a dinamicidade que queremos colocar no jogo, você se sente preso e de certa forma punido por estar lançando a habilidade.

Pra resolver esse impace, o primeiro passo que tomamos foi criar um Bone na coluna do personagem que seria controlado apenas pelo código, assim temos um bone que eu posso controlar pelo código sem me preocupar em prejudicar o efeito visual da animação. Como esse bone rotaciona toda a parte de cima do personagem, se eu mandar o bone "apontar" para o mouse, as pernas vao estar apontando em direção ao sentido de movimento do personagem, e o torso vai estar apontando na direção do mouse. Eis que surge o primeiro problema, se o jogador está andando pra cima, e olhar pra baixo, ele vira praticamente o exorcista, o que não é muito legal (nesse caso pelo menos).



O que é preciso é que quando o personagem esteja se movendo no sentido contrário do que ele está mirando (andando pra cima, mirando pra baixo, por exemplo) eu preciso trocar da animação "Correr" para "Correr-de-Costas". Assim, o personagem vai estar inteiro virado para trás, e andando de costas na direção de movimento estabelecida. Pronto, problema resolvido!!

Mas.... mais ou menos. Como saber se a direção de movimento é oposta à direção de mira? Bom, eu infelizmente não sou o matemático que gostaria de ser (ou que deveria ser...) mas, com ajuda do Sr Google, descobri que usando Vector3.Dot(direção-1, direção-2) retorna um valor entre 1 e -1. Se o resultado for 1, quer dizer que as duas direções estão apontando exatamente para o mesmo lugar, e se for -1, as duas estão apontando exatamente em direções opostas.


Maravilha, então se eu disser Vector3.Dot(direção-de-movimento, direção-de-mira), e o resultado for menor que 0, quer dizer que existe uma diferença maior do que 90 graus entre a direção de movimento e a direção de mira, logo, o personagem já está num ponto em que é melhor ele andar de costas do que correr pra frente.

Vixe, mas deu alguma coisa errada. Quando eu estou andando pra frente, e olhando marginalmente pra frente (um angulo menor que 90 graus de diferença), beleza. Quando eu olho pra trás (qualquer angulo maior que 90 graus) o personagem pisca de costas correndo de costas... e isso é feio... muito feio... e ai a primeira coisa que se pensa é usar Quaternion.Lerp pra que as pernas se virem pra trás gradualmente. E realmente funciona. No entanto, depois de testar por 10 segundos, você percebe que solucionou sim o problema de piscar de costas... mas criou outro problema. Como as pernas se rotacionam ao todo 180 graus (porque ou o personagem anda pra frente com as pernas pra frente, ou pra trás com as pernas pra trás), as vezes as pernas vão girar 180 graus pelo lado direito, e as vezes pelo esquerdo... só que o problema é que se o personagem estiver olhando pra direita, a 100 graus de diferença, a perna pode girar pra trás pela esquerda... criando novamente o efeito exorcista... -.-

"Po mas como assim você tem ai o valor de 1 a -1..." pois é, o problema é que se a diferença entre os angulos for 90 graus OU -90 graus, o valor é o mesmo (0), não é possível saber pra que lado que o infeliz ta olhando desse jeito -.-. O motivo pra essa infelicidade é que Vector3.Dot resulta numa função cossena.


Ok, de toda forma, estamos meio caminho andados. Pra resolver essa maravilha de problema, tivemos de fazer algo que eu não estava morrendo de vontade. Criar animações de strafe (andar de lado) uma para a direita e uma para a esquerda, e assim, quando o infeliz estiver olhando pra esquerda, eu troco pra animação "Correr olhando pra esquerda" e quando for pra direita, a mesma coisa. Mas óbviamente criar essas animações não adianta porcaria nenhuma, porque como o valor da função é sempre 0 quando ele estiver olhando pra direita OU esquerda, como vou saber que animação tocar??

E é ai que minha deficiência matemática me fez demorar pra encontrar a solução, e graças a documentação fenomenal, maravilhosa do Unity (sem sarcasmo) eu achei o que eu queria. A p**** do Vector3.Cross(direção-1, direção-2), que por sua vez retorna uma função de seno. Isso é, agora eu tenho uma outra função que quando compara a direção de movimento e a direção de mira, me retorna um valor entre 1,35 e -1,35, só que de outra forma.


Ok, acho que não é muito facil de entender de primeira, principalmente se como eu você não é lá um grande matemático. Tudo o que eu disse até agora, se resume brevemente nessa imagem.


Como eu tenho uma função que é capaz de me dizer se o personagem ta olhando pra frente ou pra trás (Vector3.Dot) e uma que é capaz de me dizer se o personagem está olhando pra direita ou pra esquerda (Vector3.Cross), eu já tenho como detectar pra onde exatamente o arrombado está olhando!


Agora, tudo que eu preciso fazer é o seguinte:


E, finalmente -.-, tudo isso resulta no tipo de rotação vista nos vídeos ai pra cima!

Um link muito útil que encontrei e recomendo pra entender essa história de Dot, Cross... é esse aqui.

Bom, antes de mais nada, para os que leram até aqui, meus parabéns pela paciência =P. Como disse ai no meio, não sou nenhum matemático e sempre tenho problema nos calculos de ângulos e tudo o mais, por isso, se você leu tudo isso só pra dar risada do meu embromation haha, eu ficaria MUITO feliz em saber se há uma solução mais fácil/correta pra esse problema. Se você já teve problema parecido e isso aqui te ajudou, fico muito feliz de saber que fui útil. Qualquer dúvida, deixe um comentário que respondo assim que possível, qualquer correção na minha metodologia, digo o mesmo.

Obrigado pela atenção,
Abraços!

quinta-feira, 17 de janeiro de 2013

Knight's Trial - Spell Combos

E ai pessoal, tudo bem?

Mais de uma semana atrás eu fiz o ultimo post nesse  blog dizendo que "amanha" eu faria um post mais técnico falando sobre as combinações de spells presentes em Knights Trial... haha por isso, antes de mais nada, peço desculpas pelo atraso.

Então, antes de mais nada, o que eu quero dizer com Spell Combos? Bom, recentemente pra quem jogou Guild Wars 2, é o mesmo princípio, onde algumas magias criam campos que transformam outras mágias que passam pelo campo em magias mais poderosas. Por exemplo...


Repararam na diferença? Na segunda imagem não só tem uns campos de fogo no meio do mapa em pontos aleatórios, mas os projéteis atrás da explosão verde pegaram fogo ao passar pelo campo. Ou, pra ficar mais fácil, fizemos esse video abaixo.



Olha, eu não sei a opinião geral sobre poder combinar as magias (alias se achar um feature legal/interessante/tosco, deixa um comentário!) mas sério... é divertido =P. Não tem nada melhor que atirar na boca do bixo uma pedra flamejante que da o dobro do dano normal... ou uma pedra eletrificada que joga ele duas vezes mais longe, tem hora que parece um jogo de basebal de tão longe que você isola o pobre orc =P.

A verdade é que essa é uma feature que eu acho muito legal, e é muito fácil de implementar (devido à maneira que o jogo funciona). Resumidamente, o que acontece dentro do jogo é que quando um projétil qualquer passa por dentro da área do campo de fogo por exemplo, ele recebe um buff e os efeitos são ativados, e o resto do comportamento dele continua como normal.

É, eu sei... é meio óbvio, mas na prática, é isso aqui, no jogo aparece assim:


Mas o que define o que acontece de verdade é isso aqui:


O circulo verde indica a área real de efeito do campo de fogo (práticamente igual á área do efeito visual) e os quadradinhos verdes indicam a área de efeito dos tiros. Se em qualquer momento do trajeto de cada tiro, ele simplesmente encostar na área do campo de fogo, ele é incendiado.

O maior problema do "é incendiado" é que o evento que diz "ok, esse projétil passou por dentro desse campo de fogo" acontece no campo de fogo, e não no projétil. Então eu preciso fazer com que o Campo de Fogo fale pro Projétil "você está queimando, e seu dano foi mágicamente dobrado". Até ai ok, só que eu preciso que qualquer projétil, seja da skill Rockburst, Frostbolt, Shadowbolt, Flamethrower... qualquer um precisa receber a mesma mensagem e consiga criar um mesmo efeito, e até então, como o comportamento de cada skill é muito diferente da outra (Shadowbolt precisa puxar os inimigos para perto, Flamethrower atravessa os inimigos, Frostbolt reduz a velocidade dos inimigos...), cada projétil tinha um comportamento diferente (uma classe diferente).

A solução foi fazer o que eu já devia ter feito desde o começo, criar uma classe com as características padrão de todos os projéteis (dano, alcance, etc) e fazer com que todas as classes específicas dos projéteis herdassem a inicial. Dessa forma, o Campo de Fogo pode sempre chamar a Classe Pai e dizer "Seja la o que você for, dobre o dano". A parte mais chata na realidade foi criar o efeito visual. Para diminuir a quantidade de trabalho nesse sentido, fizemos um efeito padrão para cada combo, e esse efeito precisa ser aplicado a cada projétil. O jeito fácil e óbvio seria criar um prefab com o efeito visual e simplesmente instancear quando a magia acontecer, posicionar na mesma posição do projétil e tornar o novo objeto filho do projétil. No entanto, como instancear é péssimo pro desempenho, fui obrigado a colocar todos os efeitos visuais de todos os combos em todos os projéteis, assim, quando instancear o projétil, ele já contem todos os efeitos, mas todos desativados. Assim que o projétil atravessa um campo (seja ele de fogo, raio, veneno), o efeito visual equivalente é ativado novamente.

Bom, acho que é isso. Não quis ir muito a fundo até porque não é uma feature das mais complexas de se fazer, mas se tiverem interesse em saber mais, ou só falar sobre o que acham da feature, por favor deixem um comentário!

Abraços,

quarta-feira, 9 de janeiro de 2013

Knight's Trial - Estágio de Desenvolvimento

E ai pessoal, tudo bem?

Bom, hoje começa oficialmente a parte "DEV" do nosso blog =P. Estamos trabalhando novamente em cima do jogo Knight's Trial, depois de mais tempo do que desejaríamos. Até agora o jogo teve uma ótima aceitação com os testers, concursos e até mesmo possíveis parceiros.

Antes de mais nada, este post é dedicado a mostrar o estado atual do jogo, que está aproximadamente apenas 30% completo. Vou postar dados e screenshots de grande parte do conteúdo atual do jogo abaixo, lembrando que todas as imagens são renders dos modelos usados in-game, otimizados para celulares como iPhone 3GS.


Atualmente, existe no jogo o seguinte:
- 3 Arenas (Desejamos implementar no mínimo 8)
- 15 fases (Desejamos implementar no mínimo 32, com muito mais diferenciação do que atualmente)



- 7 Inimigos Básicos (Este número ainda é meio indefinido, mas num mundo ideal gira em torno de 15 a 20)


- 3 Chefes (Queremos chegar a 8, mesmo número de arenas, cada um bem diferenciado, exigem que o jogador descubra o jeito de lutar e não apenas rolar a cabeça no teclado)


- 18 Habilidades (Com certeza esse número deve crescer muito, queremos que o jogador possa jogar de inúmeras maneiras diferentes)


- 24 Armas (São poucas e a mecânica de como elas dão benefícios ainda não é ideal, a progressão é muito linear, queremos explorar muito mais esse aspecto)


- 60 Achievements (Esse número está prestes a crescer nos próximos dias, com missões mais dificeis/especificas)


- 1 Personagem jogável (Queremos implementar no mínimo 4 personagens diferentes)


Como podem ver, nada está no ponto que queremos. Na verdade, isso é o que está implementado, mas existem outras features adicionais que queremos implementar, não apenas melhorar as que já estão presentes. No próximo post (se tudo der certo amanha =P) vou detalhar uma delas que já está implementada e é muito legal, Spell Combos (habilidades que podem ser usadas de forma que uma potencializa a outra).

Abraços,