terça-feira, outubro 16, 2007

XNA Breakout

Esse é um joguinho no qual eu venho trabalhando nos últimos dias. Sim, trata-se de mais um Breakout, mas meu objetivo não é fazer o jogo em si, mas sim estudar a parte 3D do XNA pra um outro jogo que vou fazer com a galera da faculdade pra Imagine Cup 2008.

Falando sobre os estudos, o XNA é muito bom, mas dá pra ver que o Framework ainda é muito cru e ainda tem bastante pra evoluir. Eu tive dois grandes problemas na criação do meu jogo, um na parte das colisões e outro com os sons.

Primeiro, por mais estranho que pareça, o XNA não oferece uma maneira prática de se calcular uma caixa de colisão para objetos 3D. Você pode usar uma colisão por círculo, ou se virar pra encontrar outro jeito.

Bem, aqui vemos o lado positivo de um produto da Microsoft. A comunidade abraçou o XNA e já existem centenas de boas fontes de informações sobre o Framework por aí. Uma delas, o Andy's Blog, publicou uma maneira simples de se escrever um Content Pipeline personalizado que guarda informações sobre Bounding Box na hora de carregar o modelo. Não deve ter nem 50 linhas de código e aí fica a pergunta, porque a Microsoft não colocou isso direto no XNA?

Está com o mesmo problema? Veja a solução aqui.

O outro problema é ainda pior. Até o momento o XNA aceita somente sons no formato Wave (ou Aif o que dá na mesma) e sons nesse formato são enormes. Se um dos objetivos do XNA é atingir os jogadores casuais, ainda há muito trabalho para torná-lo viável. Um jogo que poderia ficar facilmente com uns 2 ou 3MB acaba ficando com dez ou mais graças aos arquivos de som. O jogador casual quer ter acesso rápido ao jogo, se ele precisar ficar horas baixando o arquivo, provavelmente vai buscar um site de jogos em Flash onde cada jogo demora só alguns segundos pra carregar.

Pra se ter uma idéia do exagero que o formato Wave causa no tamanho final do jogo, o Catapult é um minigame disponível no Creators Club com código-fonte completo, voltado para o aprendizado. É um jogo muito simples, mas tem 33,4MB sendo 30,2MB gastos somente por 9 arquivos de audio e o pior é que esse tamanho ainda aumenta quando os arquivos são transformados para o formato padrão compilado pelo XNA.

Como alternativa, se o desenvolvimento focar somente o Windows, pode-se usar uma biblioteca externa, como o IrrKlang, mas o XNA deveria empacotar esse tipo de solução nativamente.

No fim das contas eu ainda acho que o XNA é uma ótima plataforma de desenvolvimento, o suporte da Microsoft e da comunidade realmente fazem a diferença, mas vamos torçer para que a versão 2.0 do Framework traga mudanças relevantes em relação a estes problemas.

O jogo ainda não está disponível pra download, mas libero ele em breve. Enquanto isso, alguns screenshots do XNA Breakout 3D:

Menu principal do jogo. Fiz um Game Component bacana que quando você passa o mouse por cima do botão ele muda a imagem.

2 comentários:

CrociDB disse...

Vi que você está se dando muito bem com o XNA hein! =D

Gostei muito dessas imagens! Aproveitando, jogos com XNA (mesmo assim mais simples) rodariam com uma placa de vídeo onboard (64)? hehehe

Cara... boa sorte lá no Imagine Cup hein! =D

Flws

Diego disse...

Valeu pelo comentário cara.

Sobre sua pergunta, parece que o XNA exige uma placa com pelo menos Pixel Shader 1.1, mas eu não sei dizer se uma placa onboard tem esse recurso.

Uma coisa que você pode fazer é testar se esse meu Frogger funciona aí. Ele usa apenas recursos 2D do XNA, então dá pra saber se sua placa suporta ao menos o mínimo necessário.

Valeu e volte sempre.