jun 252007
 
Como mencionei anteriormente, foi criado um grupo de estudos sobre desenvolvimento de jogos na UFC, o DoG[1], e mensagens indo e vindo, foi sugerido pelo Felipe Ribeiro (Moderador do Grupo), que as pessoas participantes com ou sem experiência tentassem desenvolver um jogo/demo para que pudéssemos trocar idéias sobre implementação, dúvidas, curiosidades e dificuldades que surgissem no decorrer do desenvolvimento.
Para tentar encontrar pontos comuns para troca de experiência foi proposto dois temas, sendo eles o desenvolvimento de um “Pong” ou de um “Tetris”, e logo em seguida tivemos o primeiro post com o primeiro jogo, era o Pong do Charles[2], o qual de fato acabou servindo de incentivo para mim, e me levou a pensar:

Poderia desenvolver um, serviria tanto pra validar as últimas modificações no GBF[3], quanto a aprender algumas coisas legais e ainda ter a oportunidade de conversar de igual pra igual com as pessoas(já que também era uma experiência nova para mim).

E assim, motivado pela empolgação, desafio e pelo bate-papo, fui levado a desenvolver meu primeiro pong, meio tardiamente, mas fui, e realmente é como falo nas minhas palestras, é uma experiência legal, divertida, simples e viciante, pensei em adicionar mil coisas nele, como sistema de partículas e afins, mas resolvi deixa-lo o mais simples e fiel ao tradicional possível para que quem sabe sirva de exemplo para implementações de quem gostaria de começar a programar jogos.

Experiência

Apesar de já ter desenvolvido o framework GBF[3], e outros demos, não havia feito coisas de concepção simples e divertidas como o pong, e tive que pensar um pouco em como implementar um pong, algumas dúvidas que tive antes e durante o desenvolvimento foram:
  • Como fazer a bolinha rebater na tela;
  • Como fazer com que o CPU jogasse sem acertar todas e que não fosse totalmente burro;
  • Como delimitar a duração do jogo;

Respondendo as essas perguntas comecei então a procurar minhas saídas:

“Como fazer a bolinha rebater na tela”

Fazem anos que não via física, e cheguei a pensar em algo complexo como mudar a direção da bolinha por meio de ângulos, seno, cosseno e etc. Acabei procurando um livro de física para lembrar conceitos relacionados a mecânica, como movimentos uniformes, e etc, pois não lembrava mais nada disso, e nem sabia ao certo se isso resolveria, o fato é que o livro que recorri não era muito explicativo, na verdade era apenas exercícios (esses livros de hoje, parecem não serem feitos para que as pessoas aprendam sozinhas), comecei a ler, e reler, porém não consegui ver de fato a aplicação para o meu caso especifico, o qual seria apenas fazer a bolinha se desviar ou voltar. Sendo assim comecei a procurar pelo Google na esperança de achar alguns sources e acabei foi de fato achando um tutorial/apostila do Silveira Neto[7] (hehehe logo do Silveira, tão próximo e tão longe, ele também é daqui de Fortaleza, tive que ir na Internet para achar o que precisava), e lá tinha justamente o exemplo de uma bola sendo rebatida, aproveitei isso e adaptei para o pong. O fato é que a solução era super simples e eu procurando complicações físicas, bastava no caso inverter os valores de x e y para o que a bolinha voltasse na direção oposta exemplo:

if (bola.y>480){
velocidade.y = – velocidade.y;
}

bola.y+=velocidade.y;

Isso faz com que se a bolinha bater no fundo da tela, volte. Simples não ? pra mudar a direção de X, basta fazer a mesma operação com o eixo X.

“Como fazer com que o CPU jogasse sem acertar todas e que não fosse totalmente burro”

Minhas primeiras idéias foi tentar fazer algo randomico que, quando a bolinha passase do meio da “quadra”, fosse feito um random para determinar se o cpu iria ou não pegar a bola, porém isso pareceu que ia ser baseado muito na sorte e que não ficaria muito natural, então antes de testar, resolvi abandonar a idéia.
Acabei lembrando do PacZero[4], e que eu havia implementado um algoritmo de colisão circular para determinar quando os fantasmas podia “ver” o pacman, e resolvi aplicar o mesmo principio, sendo assim, resolvi criar uma circulo de visão para o cpu, assim, quando a bolinha entrasse em seu raio de visão ele moveria-se para rebate-la. Porém essa alternativa acabou mostrando que com um circulo de visão grande demais, o cpu não erra, e um pequeno demais ele erra muito, então por meio da tentativa, erro e estimativa defini que seu circulo de visão teria um raio de _VALOR_ pixel, e que conforme o cpu ganhe as partidas maior vai ficando seu circulo de visão para assim dificultar a vida do jogador, porém este ponto não ficou muito natural, tem certos macetes (jogadas) que fazem com que o cpu perca.
Esse é um ponto que está muito aberto as melhorias, visto que ficou altamente simplório o pseudo esquema de I.A. do CPU, pontos que eu talvez mude em versões futuras:
  • Fazer com que o cpu se “distraia”, ou que “fique confiante demais” e só vá atrás da bola na última hora, o que causaria o efeito de incerteza se ele acertaria ou não
  • Fazer com que ele decida onde bater na bola, use as três partes da raquete para provocar efeitos diferentes na bola;
  • Fazer com que a visão aumente quando ele perder uma partida, pois assim na será um desafio maior para o jogador;

“Como delimitar a duração do jogo”

Pensando um pouco em como determinar as partidas, acabei me baseando na experiência do projeto de jogo “Pancada”[5](O qual ainda não concluí), que me lembrou do principio de rounds, porém no pancada esses intervalos de partidas são baseados no tempo, e para o FZPong pensei em utilizar o principio de tempo para determinar a duração de cada set, porém acabei chegando a conclusão que seria mais interessante que fosse espelhado em regras como jogos de volley/tenis, assim determinei que para vencer um set, um jogador precisa de ter 5 pontos de vantagem sobre o outro, e para poder vencer a partida, é necessário que um jogador tenha 2 sets de vantagem sobre o outro.

É algo que pode parecerer estranho, a definição desses valores, visto que 5 pontos podem ora parecer muito, mas se levarmos em consideração a Inteligência do “CPU” é algo que fica plausível visto que a velocidade da bola está programada para ir aumentado gradativamente e assim oferecer um desafio mais equilibrado para o jogador.

FeedBack

Esse é um aspecto muito importante, principalmente quando estamos desenvolvendo nos primeiros jogos, protótipos ou quando queremos repassar o conhecimento para as pessoas, por meio deles podemos fugir um pouco da realidade “técnica” e ver quais as reações de jogadores ou de outros desenvolvedores.

Por meio de um desses feedback do Daniel R. Matos do grupo DoG, foi que caiu a ficha de como a figura(sprite) que eu estava usando para representar a bola no jogo estava fora de contexto, isso se deve pq quando iniciei pensei em recriar como o pong fosse um jogo de futebol, porém com meus “grandes dons artísticos”, acabei extrapolando e indo para outra idéia bem oposta, algo que fosse meio que técnico e meio rudimentar, tanto é que podemos observar que as partes da arena do jogo (parte de cima e de baixo) são feitas de pedra, e o fundo do jogo é algo meio confuso/abstrato porém lembra como se fosse um possível gramado e os dois bastões(jogadores/raquetes) são metálicos, e realmente a bola tradicional de futebol ficava destoando o contexto, então depois de receber esse apontamento, corri para o Google a procura de um tutorial(Esfera 3D)[6] que ensinasse como fazer esferas no gimp.

Isso resultou na nova versão do jogo 1.1 só por causa da bola do jogo que agora é uma “esfera metálica” ou similar, bem assim espero eu.
Espero que esse relato possa ajudar ou clarear um pouco o processo de criação do FZPong e que combinado com conversas e o source do jogo possam ajudar no processo de criação e aquisição de conhecimentos relacionados aos jogos.

E por fim temos o download do FZPong[8]:

Código Fonte: FZPong.1.1.src.zip
Versão Linux: FZPong.1.1.bin.linux.tar.gz
Versão MS-Windows e Linux: FZPong.1.1.bin.all.zip

T+!
Vida Longa e Próspera!

———————————————-

Referência

[1] Grupo DoG – http://groups.google.com/group/dog_/
[2] Pong do Charles – http://www.lia.ufc.br/~rockyspirit/pong.tar.bz2
[3] GBF – http://pjmoo.sourceforge.net/wiki/index.php/GBF
[4] PacZero – http://pjmoo.sourceforge.net/wiki/index.php/PacZero
[5] Pancada – http://pjmoo.sourceforge.net/wiki/index.php/Pancada
[6] Tutorial Esfera 3D – http://www.ogimp.com.br/modules/smartsection/item.php?itemid=7
[7] Blog do Silveira – http://www.eupodiatamatando.com
[8] PJMOO Downloads – http://sourceforge.net/project/showfiles.php?group_id=198186

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(requerido)

(requerido)