Anúncios

Games Com Café 004 Parte 2 – Zelda, Metroid e a fase criativa da SEGA

Games Com Café. Dois dos melhores prazeres da vida em um só vídeo.

Neste episódio, percebemos que precisamos de artistas apaixonados pelos jogos que fazem, nada mais…

Anúncios

Projeto Parallax – Engine Em Java Para Jogos 2D

Por Michel Montenegro

Olá turma do Cosmic Effect! Mais um fanático pelos jogos em 2D por aqui desejando compartilhar um pequeno projeto com vocês. Bom, uma rápida apresentação: sou daqueles que não deixa passar nenhum Final Fantasy, Pokémon e Chrono Trigger, tornando-me mais um enfeitiçado por estes títulos clássicos — mas não somente pelos jogos em si.

Sem conseguir desgrudar da estética dos retrogames em duas dimensões, tenho me deliciado com jogos online atuais que seguem aquele estilo visual, como o “épico e cômico” Dofus, o conhecido Tibia e mais recentemente o Club Penguin — este, um MMO em flash sob o selo de qualidade Disney, portanto, imaginem a qualidade da arte 2D.

Somando a paixão pelos velhos sprites com a mecânica do RPG old-school, comecei a ter um sonho recorrente: fazer o meu próprio MMORPG. Bom, já cheguei a administrar servidores com até 1000 pessoas online, através da utilização de um projeto de servidor open source em Java, o L2J. Tudo isso me motivou a uma pergunta: “será que é possível um MMORPG em 2D, recuperando o estilo de jogo clássico”?

Daí nasceu um pequeno projeto que havia batizado de “JMMORPG”. Após algum tempo aprendendo com este primeiro modelo que havia desenvolvido, caindo e levantando muito… nasceu o Projeto Parallax, que supera de longe seu antecessor e que gostaria de lhes apresentar neste pequeno artigo.

Uma engine em Java para RPGs em 2D

Percebi que não existem engines em java para desenvolver jogos: há somente o JMonkeyEngine, porém direcionado à confecção de jogos 3D. Existem muitas bibliotecas, mas nada que possa ser descrito como uma engine totalmente funcional. Então, por que não me ajudar e, no processo, ajudar também outras pessoas? Será que é possível conseguir contribuições e, como um projeto mútuo, ter seu desenvolvimento acelerado? Como diz o ditado, “em solo fértil, um povo unido não passa fome”. Pois bem, respirei Projeto Parallax nos últimos dois anos e no site http://www.einformacao.com.br/parallax/ você pode encontrar em que pé a engine está neste momento.

Um relato rápido: no início, alguns profissionais da área de TI/desenvolvimento de jogos até me desmotivaram com relação a esta ideia, por conta da existência do XNA (framework de jogos para PC/X360 e Windows Phone), o GameMaker e até mesmo o próprio HTML5. Dei uma espiada nelas e pude concluir que, para o meu objetivo, Java continuou como a opção mais interessante.

Enfim, o objetivo do projeto é criar uma engine que possibilite a criação de jogos 2D sem que haja a necessidade de digitar uma única linha de código por parte do desenvolvedor, assim como acontece com o RPG Maker, porém com as seguintes vantagens:

  • Projeto open source. O usúario da engine poderá, se assim desejar, fazer alterações personalizadas.
  • Compatibilidade. Possibilidade de rodar em qualquer sistema operacional que tenha uma JVM (Máquina Virtual Java) desde que atenda os padrões mínimos de hardware.
  • Sem programação. Não ter a necessidade de conhecer nenhuma linguagem de programação, apenas conceitos básicos de operação em qualquer sistema operacional.
  • Expansivo. Inicialmente, oferecer a capacidade de gerar jogos no mesmo estilo do RPG Maker para então expandir para outros modos. O Projeto Parallax é totalmente modular.
  • Offline e online. Oferecer suporte online, possibilitando MMOG ou MMORPG. Importante lembrar que o JMMORPG, protótipo do Parallax, obteve sucesso neste aspecto e suas estruturas estão sendo aproveitadas.
  • Custo zero. O Projeto Parallax somente faz uso de tecnologias 100% livres e de código aberto em sua construção.
  • Padronização no código e na criação final do produto. Utilização de técnicas modernas durante o desenvolvimento, garantindo compatibilidade com conceitos e tecnologias atuais.
  • Porta aberta para todos. Para quem deseja entrar na área de desenvolvimento de jogos, principalmente em Java, nosso projeto pode ser uma excelente escola.
  • Qualidade e simplicidade. Se for para qualquer um poder criar, não pode ser complexo. Procuro manter o código-fonte o mais objetivo, enxuto e padronizado possível.

Que tipo de apoio o Projeto Parallax precisa

  1. Designer/artista gráfico. Para desenhar as telas do jogo, personagens, etc.  Sei que podem ficar mais bonitas visualmente. Do ponto de vista operacional, é bem fácil, pois as telas funcionam no conceito de skin/template. A tela é composta por painéis, um dentro do outro. Os painéis têm uma imagem de fundo. Os botões carregam a imagem pré-estabelecida, se mudar a skin da imagem, muda no projeto. Fazer arte/design na engine é bem fácil, pode acreditar. Há um vídeo planejado para ser feito somente para desmistificar qualquer possível complexidade que por ventura o projeto possa passar no que se refere aos gráficos.
    .
  2. Desenvolvedor (para o database do projeto). Por exemplo, estou usando XML para os dados e isto deve se manter assim para os dados estáticos e de baixo volume baixo que fiquem no cliente (Um desenvolvedor só para fazer a tela de “cadastro e edição destes dados”). Como o projeto tem vários “flancos” a serem projetados e estou focado no código da engine, um outro desenvolvedor que possa cuidar dessa parte seria de grande ajuda. Futuramente, certamente haverá a necessidade para um banco de dados em um formato “X” (MySql, DBD ou outro…).
    .
  3. Desenvolvedor (Java): Ajudaria bastante para dividir as tarefas comigo, acelerando a parte da engine mesmo.
    .
  4. Music Composer: Alguém para compor músicas e sons, seria de grande ajuda. [Nota: o Eric Fraga “Cosmonal” já estará contribuindo conosco com game music e efeitos sonoros!]
    .
  5. Map Designer: Seria ótimo ter alguém para desenhar os mapas.

Para quem tiver curiosidade, dá uma olhadinha no vídeo que apresenta a engine funcionando, com o jogo “As Crônicas Do Aventureiro”.

O Projeto Parallax já incentivou outros a pensarem em fazer engines para Android e Symbian, uma outra vertente que gostaria de ver nossa engine se expandindo no futuro. Espero que gostem do trabalho e acreditem: foram 2 anos e “uns quebrados” de muito estudo e pretendo levar a frente, de verdade.

Peço que divulguem este artigo o máximo que puderem para seus amigos nas redes sociais e onde mais acharem relevante. Estarei contando o progresso da engine aqui no Cosmic Effect para vocês ( ^^ ) um abraço a todos e obrigado!

* * *

Torion 2 (PC)

Por Euler Vicente

O amigo que acompanha o Cosmic Effect lembra que, no post sobre Zanac, citei um jogo que havia desenvolvido em homenagem ao meu game de nave favorito. Acredito que algumas pessoas ficaram curiosas em conhecê-lo, saber como se deu o processo de desenvolvimento, minhas dificuldades e inspirações. Como Torion 2 é 100% retrô, acredito que possa render uma curiosa leitura para os nossos amigos. Afinal de contas, quem joga videogame sempre teve vontade de fazer seu próprio jogo, não é mesmo?

Quer saber como funciona um shooter 2D? Então, continue conosco!

Como tudo começou: o campeonato da UniDev!

Sempre tive como um hobby pessoal a programação de computadores. Desde o MSX, já codificava algumas coisas simples. Obviamente, como nesta época programava para me divertir (sim, isso é possível!), não me interessava em aprender a fazer aplicações sérias; só queria saber de fazer jogos, gráficos legais. À medida em que o conhecimento técnico foi progredindo, o sonho de fazer um shooter como Zanac tornava-se cada vez mais factível.

Até que um dia, um site brasileiro muito legal de desenvolvimento de jogos, o UniDev – Programação de Jogos, lançou um concurso para os leitores, em 2003. A proposta era de apresentar um projeto de um jogo (ou demo) dentro de de 6 meses. Não lembro qual era o prêmio, ou mesmo se era relevante para mim: só sei que aquilo havia me deixado animado a seguir em frente. Tinha chegado o momento de produzir o meu Zanac!

Lembro que os projetos iam surgindo em profusão no site, diversos bem mirabolantes (risos). Um beat’em up à la Streets of Rage; tinha até uma turma que pretendia desenvolver um RPG cheio de detalhes. pensava com meus botões: esses caras vão conseguir realmente fazer isso tudo em 6 meses?

Pelo prazo proposto pelo site, não quis me arriscar a começar algo que não conseguiria terminar. Pela experiência que já obtive através do desenvolvimento de dois outros jogos autorais menores (Torion e Meteoros), acreditava que jogos de nave seriam mais fáceis de produzir: não precisamos nos preocupar com física, as colisões são mais simples… e era o gênero que eu mais gostava!

Então, inscrição no site realizada e mãos à obra, Euler!

Hello World!

Minha base de programação sempre foi a linguagem Visual Basic. Foi a ferramenta que me acompanhou durante boa parte da minha vida profissional e, com o tempo, fiquei bem experiente na dita-cuja (fiz 90% na prova de certificação da Microsoft). Meu contato inicial com o DirectX foi, inclusive, através do próprio VB.

Observem que, em tese, qualquer jogo pode ser produzido em Visual Basic pois, na realidade, quem renderiza os gráficos, efeitos sonoros e entrada de dados é a extensão DirectX, não a linguagem de programação. Ela somente representa a interface para acessarmos a API do DirectX – precisa apenas fornecer suporte para tal. Por exemplo, já vi ótimos projetos em Delphi – outra linguagem “atípica” no desenvolvimento de games – para dar uma idéia para vocês.

Porém, eu andava entediado com o VB. Não seria uma boa oportunidade para aprender outra linguagem de programação? Que tal C++ para arrebentar de vez? Não é ela a tal linguagem de programação usada nos projetos profissionais? Decidi encarar o desafio.

É importante ressaltar que, apesar de boa parte do jogo ser de responsabilidade do DirectX, a lógica de programação, cálculos matemáticos e iterações (os loops) são confeccionadas na linguagem de programação. E, neste aspecto, o C++ faz toda a diferença do mundo. É muito mais rápido do que o VB, Java ou o Delphi. Por isso a predileção do C++ em situações mais profissionais. Eles poderiam fazer um Half-Life 2 em Visual Basic, mas ficaria tão lento…

O que me trouxe bastante confiança em começar meu projeto numa linguagem de programação que nunca tinha visto na vida foi um engine que havia encontrado: o CDX. Gratuita, com o código fonte disponível, lotada de exemplos práticos e altamente didáticos. Com um pouco de estudo, pude assimilar sem maiores dificuldades.

E, então, iniciei meu primeiro programa em C++. Normalmente quando começamos a aprender uma nova linguagem de programação, fazemos um programinha bem simples que imprime na tela os dizeres: “Hello World!”. Isso é uma espécie de tradição no mundo da informática. No meu caso, meu “Hello World!” foi logo Torion 2! (risos)

Gráficos & trilha sonora: quem aí pode me ajudar com isso?

Uma coisa que aprendi: jogos são projetos multi-disciplinares. Não é possível somente um indivíduo cuidar de tudo. Até mesmo porque as pessoas são diferentes, têm aptidões diferentes e, no meu caso, definitivamente não levo jeito para a parte artística da coisa.

A tal questão artística representava um grande limitador ao projeto. Por vezes, tinha uma boa idéia, sabia como implementá-la tecnicamente falando, mas… do que adiante se não tinha os sprites corretos? A coisa foi tão séria para mim no começo que o projeto foi tomando outro rumo: normalmente se planeja o gameplay, são esboçados os cenários e personagens e, somente depois, a equipe artística realiza o que foi imaginado. Em Torion 2 foi ao contrário! (risos) Fuçava sprites na Internet, efeitos sonoros, músicas, até achar algo que pudesse aproveitar. Daí, desenvolvia o gameplay em cima dos recursos artísticos encontrados. Acham que queria colocar aquela arma do bumerangue do Knightmare no jogo? Eu tive de aproveitá-la, pois o sprite estava lá disponível, todo arrumadinho esperando que eu pensasse em algo… (mais risos)

Para terem uma idéia do meu desespero, a nave Torion foi produzida a partir de um mesh (modelo 3D) feito para o 3D Studio. Baixei o modelo de um daqueles sites especializados em 3D Studio, abri o software e renderizei em 2D a nave vista de cima. Depois, inclinei-a para a direita e tirei outra foto. Fiz o mesmo para a esquerda e pronto: meu sprite da Torion estava lindo! A nave da abertura é o mesmo modelo renderizado, só que de frente! (risos)

E o que falar dos efeitos sonoros e música? A música, como podem notar pelos créditos, é de autoria de um sujeito chamado Wagner Carvalho. Ele era integrante de uma empresa nacional de desenvolvimento de jogos na época, a GreenLand Studios. No site deles, havia o portifólio com as músicas e eu tinha gostado de uma delas, casava com o tipo de jogo que eu queria fazer. Fiz contato com o Wagner, pedindo autorização para usá-la em Torion 2. Comentei que era para um projeto sem fins lucrativos, que seria divulgado em vários sites especializados. Acabei convencendo-o de que seria uma boa oportunidade de divulgação do trabalho dele que, então, permitiu a utilização da sua música.

Catei uns efeitos sonoros na rede, nem sabia a quem dar crédito. Até a música do boss de Streets of Rage usei ao chegar nos chefes de fase! (risos)

Com o passar do tempo o projeto foi ganhando forma, tornando-se bem interessante. Tinha o hábito de sempre atualizá-lo no site para que as pessoas pudessem acompanhar o andamento. Nisso, dois rapazes se ofereceram para contribuir. Acredito terem notado que o projeto era algo sério, que eu não estava para brincadeira. As aptidões deles casaram com minhas necessidades e eu os aceitei de bom grado. O Márcio Rogério fez uns sprites bem legais para o jogo. Sabe os chefes de fase? São dele. O Roberto Radke era bom em fazer músicas, então encomendei algumas composições. Aquela música executada ao passar de fase é dele. Muito obrigado rapazes!

Mas, a parte artística mais complexa do jogo foi, de longe, o mapa. Lembram que eu falei sobre tilling no post sobre Zanac, sobre o trabalhão que dá fazer aquilo? Pois bem, um grande companheiro de faculdade, Andrey Santana (não é o do Cosmic Effect) deu uma ajuda e tanto. No CDX, havia uma amostra de como fazer tilling, inclusive com um mapa pronto que exibia até mesmo parallax vertical. Tudo que precisava estava lá, naquele exemplo.

Então, Andrey pediu que eu lhe explicasse o funcionamento do editor de mapas, como isso funcionaria dentro do jogo e voilà: em poucas semanas ele produziu um mapa com cenário urbano que ficou de cair o queixo. Abusei: pedi para colocar um estádio no cenário, como aquele estádio de beisebol do Tokyo (Scramble Formation). Sempre babava com aquilo quando ia ao fliperama! Sabe o que ele fez? Pegou uma foto de satélite do Estádio Olímpico de Sydney e colocou no mapa (em tempos pré-Google Earth). Putz, esse cara é bom ou não é?

As armas… as armas!!!

Foi muito interessante programar essa parte. Quem já jogou Zanac percebeu que Torion 2 tem armas parecidas. Os tiros simples (até 3 no máximo) e as armas extras estão aqui! Isso foi descaradamente baseado em Zanac (risos)! Vou falar um pouco sobre elas:

– A arma do bumerangue. A mais chata do jogo e só a deixei ficar por não ter encontrado sprites melhores na Internet. Fiz a programação para que fosse e voltasse ao ponto inicial, dando até um efeito legal. Ficou parecido com Knightmare?

– As esferas que giram ao redor da nave. Era minha arma extra favorita em Zanac, não podia faltar em Torion 2. Fiz um upgrade baseado no que eu tinha visto em Super Aleste do SNES. Desta vez, as esferas giram em sentidos diferentes, em órbitas elípticas. Gostaram? Posteriormente, percebi que a arma era poderosa demais, tornando o jogo fácil. Então, implementei um sistema que descresce a força das esferas à medida em que ela colidia com os inimigos ou seus tiros. Percebem que elas vão clareando até desaparecer por completo? O nome deste efeito é alpha blending e o CDX já trazia de bandeja para nós.

– O laser. Foi o Andrey quem me cobrou esta. Todo jogo de nave precisa de uma arma laser destruidora. Por sorte, achei um sprite perfeito para os meus propósitos, foi só implementar.

– Os robôs que seguem a nave. Baseado numa arma que adorava no Super Aleste. Achava incrível a maneira como se movimentava, seguindo os passos da nave principal. Esta aqui foi a mais trabalhosa de implementar, mas a que trouxe mais satisfação pessoal quando pronta. Lembro que escrevi a lógica num pedaço de papel, depois de muito quebrar a cabeça. Mas, a lógica ficou tão boa que quando fui programar o que havia pensado, funcionou logo de primeira. Dei um pulo de alegria naquele instante, como se tivesse vencido um boss bem difícil!

A matemática está em toda parte.

Eu detestava matemática na escola. Pode parecer estranho para alguém que citou tudo isso sobre lógica, mas não suportava a disciplina. Inclui até uma recuperação no meu histórico escolar.

Quando comecei a programar Torion 2, percebi que não havia escolha, a matemática estava em todo lugar. Através da trigonometria, pude posicionar as esferas e fazê-las girar ao redor da nave. Calculando ângulos, fiz os tiros dos inimigos inteligentes. Eles sempre miram na nossa direção, não atiram de qualquer maneira.

Comecei até a gostar da “coisa” depois que vi uma utilidade prática. Ah, se a matemática fosse ensinada desta maneira nas escolas…

Colisões: o pesadelo!

Sabe quando a tela de um jogo torna-se cheia de inimigos e notamos um frame drop e vira aquela lerdeza? Não é o fato da tela estar cheia de sprites que torna o jogo mais lento, são os cálculos das colisões! O código testa o tempo inteiro se nossos tiros atingiram os inimigos, se os tiros inimigos nos atingiram, se as naves inimigas nos atingiram… imaginem que, se um jogo roda a 60 FPS, testamos 60 vezes em um segundo por todo tipo de colisão que possa ocorrer. O C++ faz isso mais rápido que as outras linguagens, por isso jogos feitos nessa linguagem costumam ter melhor desempenho. Games que rodam numa taxa de quadros estável normalmente tem um bom sistema de colisão.

Um dos motivos de um shoot’em up ser mais simples que um jogo de plataforma é o fato de não precisarmos testar as colisões com os cenários. Num plataforma isso é realizado o tempo inteiro, além das colisões com os inimigos. Isso não ocorre num shmup 2D.

Existem algumas técnicas de detecção de colisões. Em Torion 2, foram utilizadas dois tipos: colisão por sobreposição de retângulos e colisão pixel por pixel. Uma breve explicação:

– Sobreposição de retângulos. Um sprite é sempre retangular. Quando a figura é não-retangular, definimos uma cor no sprite como cor de transparência. Assim, quando o sprite é renderizado, aquela cor que definimos com cor de transparência não é exibida na tela. A detecção de colisão por sobreposição de retângulos testa apenas se 2 retângulos se sobrepuseram. É uma técnica pouco precisa, mas muito rápida.

– Pixel por pixel. É a técnica mais precisa, porém custosa em termos de processamento. Aqui, quando dois retângulos de sprites se sobrepõem, pegamos a área de interseção dos retângulos e testamos pixel por pixel se um determinado pixel é não transparente nos dois sprites em colisão. Complicado, não é? Mas é para isso que serve o engine: para nos livrar destas dores de cabeça!

Percebi que não dava para detectar todas as colisões do jogo usando pixel por pixel, isso tornaria Torion 2 lento. Na época, os PCs não eram tão potentes quanto os atuais, ainda tínhamos de espremer recursos. Optei em usar pixel por pixel apenas nas colisões em cima da minha nave, já que se eu usasse a sobreposição de retângulos, corria o risco de um tiro nem passar perto da nossa nave e nos matar. As colisões dos inimigos foram feitas com retângulos mesmo, pois se torna altamente aceitável para quem joga (risos).

Gameplay: a parte mais complexa!

Esta foi, disparadamente, a pior parte do projeto. Vocês não imaginam o trabalho que é fazer 30 segundos de jogo! Precisa realmente de gente especializada, não tinha mais dúvidas acerca disso.

Fazer um jogo que seja interessante, que não frustre o jogador, que o estimule pensar estratégias de combate; com a dificuldade progressiva… é uma arte. Percebi não ter o perfil para isso, pois a minha paciência é quase zero (risos).

Para que outra pessoa possa fazer o gameplay do jogo (tarefa que sobrou para o colega de faculdade Andrey), desenvolvi um layout para um arquivo em texto simples. O jogo estava pré-programado para ler esses TXTs. Bastava seguir o layout à rigor que o jogo se comportaria conforme desejado, dispensando recompilações. Então, foi só jogar a bomba nas mãos do Andrey (risos).

Lembro de um acontecimento engraçado. Ainda durante a implementação, pedi para uns amigos o testarem. Um colega de trabalho comentou ter um sobrinho vidrado em jogos. Ele, então, levou Torion 2 para o guri testar. No outro dia, trouxe o veredito do garoto: “o jogo é bom, tio, mas é fácil demais!”

Como assim “fácil demais”? Putz… podia começar meu dia sem essa, não é? Ferido no meu orgulho, disse para ele que iria dar um jeito nisso. Comecei a editar os TXTs, aumentando todos os valores, enchendo a tela de inimigos: queria ver aquele guri falar alguma coisa agora… Bom, só sei que o jogo ficou tão difícil que nem eu mesmo consigo terminar (risos)!

Conclusão: atingi meus objetivos?

Apesar de nunca ter terminado o jogo (só tem 2 fases), acho que fiquei satisfeito com o resultado. Torion 2 não ficou tão dinâmico quanto eu pretendia, o gameplay precisa de sérias melhorias, mas fiquei com a sensação de que poderia fazer qualquer jogo deste estilo, caso desejasse. A parte técnica está lá, bastava mais dedicação, experiência e as pessoas certas nos momentos certos do projeto.

Nunca mais vi os jogos 2D da mesma forma depois que participei deste projeto. A gente passa a ver as coisas com outros olhos, sabe?

E vocês? O que acharam de Torion 2?

Ah! E o resultado do concurso? Sei lá… o que eu queria, já havia conseguido!

[Nota do Cosmonal: Capturei o gameplay completo do Torion 2 para quem desejar vê-lo em ação (vídeo abaixo). Quem quiser, o jogo completo está disponível para download – link logo após o vídeo!]

Download Torion 2!
(Windows XP/7)

Basta descomprimir o arquivo baixado em qualquer pasta e executar “Torion2.exe”.
Iniciará automaticamente, em 640 x 480. Não há necessidade de nenhuma configuração.

* * *