terça-feira, 28 de outubro de 2008

Tutorial - Nosso Primeiro Jogo 2D - Parte 3

Neste tutorial veremos, passo a passo, como criar um jogo 2D simples. Este tutorial foi baseado nos videos Begginers Guide 2D encontrados no site creators.xna.com.

Esta é a terceira parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio. Aqui veremos como criar e desenhar os mísseis que o canhão do nosso navio irá disparar para acertar as aeronaves inimigas. Veremos também o conceito de array, como declarar uma constante e alguns tipos de loop que a linguagem C# nos oferece.

Adicionando e Inicializando Mais Algumas Variáveis

Para a criação dos mísseis que o nosso canhão irá disparar contra as aeronaves inimigas teremos que adicionar novas variáveis a nossa classe GameObject, no arquivo GameObject.cs. Se esse arquivo não estiver aberto, dê um duplo clique nele no Solution Explorer. Uma das variáveis que iremos adicionar é do tipo Vector2 e a chamaremos de velocity, ela tem o objetivo de armazenar a velocidade do deslocamento do míssil disparado. A segunda variável que iremos adicionar será do tipo bool e a chamaremos de alive, sua função é identificar se o missil ainda está "vivo", ou seja, se ele ainda pode ser vusualizado em nossa tela.


Como fizemos com nossas outras variáveis, vamos inicializa-las no construtor da nossa classe GameObject. Logo abaixo da inicialização da nossa variável center, vamos inicializar nossas variáveis velocity e depois a nossa variável alive. Como tanto o missil como o canhão são objetos do tipo GameObject devemos ter o cuidado de inicializar as variáveis com valores "neutros" que não causem nenhum efeito indesejável no jogo e podemos muda-las mais adiante, fora da classe GameObject, pelo objeto a que pertence. Iremos inicializar a nossa variável velocity como um vetor Zero e nossa variável alive com o valor false.


Instanciando e Carregando Nossos Mísseis

Agora poderemos voltar ao nosso arquivo Game1.cs e declarar na classe Game1, uma constante do tipo int e de nome maxCannonMissiles, que indicará o número máximo de mísseis que poderão aparecer na tela ao mesmo tempo, e um array GameObject[] de nome cannonMissiles, que conterá nossos mísseis. Ao declararmos uma constante usamos antes de seu tipo a palavra reservada const que caso por engano tentemos mudar o valor dessa constante durante a codificação do nosso jogo nos proporcionará erros. O tipo GameObject[] indica um array que nada mais é do que um conjunto de elementos do tipo GameObject organizados de forma sequencial e que podem ser acessados por um indice.


Depois disso vamos até o método protected override void LoadContent() e abaixo de onde inicializamos a posição do nosso canhão vamos instanciar nosso array de mísseis. Esse array terá tamanho maxCannonMissiles. Logo abaixo inicializaremos cada missil utilizando um loop para percorrer o array do início ao fim. Para aqueles que não conhecem, o loop for(,,) funciona da seguinte forma. Fornecemos a ele um inteiro que usaremos como contador que geralmente é o i, depois ele compara o contador com uma condição, que no nosso caso o loop vai acontecer enquanto i for menor que o tamanho do nosso array, e em seguida realizamos um incremento ou decremento do contador, no nosso caso o incrementamos fazendo i++. Quando a condição se torna falsa, no nosso caso quando i for maior ou igual ao tamanho do array o loop é quebrado. Dentro do nosso for vamos inicializando cada elemento do array pelo seu indice cannonMissiles[i] sabendo que o i vai variando de 0 até o tamanho do nosso array.


Atualizando Misseis, Tratando Entradas e Disparos

Tendo instanciado e inicializado nosso array e nossos misseis podemos ir ao método protected override void Update(GameTime gameTime) e dentro dele chamaremos o método UpdateCannonMissiles() logo abaixo do trecho de código onde limitamos a rotação do nosso canhão e acima do base.Update(gameTime).


O método UpdateCannonMissiles() ainda não existe e nós iremos implementá-lo. Nele faremos a atualização da posição de nossos mísseis. Então, no final do método protected override void Update(GameTime gameTime), abaixo da chave que indica seu fim, iremos implementar nosso método. Utilizaremos o loop foreach() que percorre todos os elementos do nosso array sem necessitarmos de um contador. A diferença entre ele e o loop for(,,) é que o foreach() incondicionalmente percorre o array do início ao fim e no for(,,) podemos estabelecer uma condição de parada.


Temos que criar também o método que irá disparar nossos mísseis. Para isso necessitamos de mais duas variáveis na classe Game1 e iremos declara-las logo abaixo de onde declaramos nosso array cannonMissiles. Essas variáveis que iremos declarar são do tipo GamePadState e KeyboardState e usaremos elas para guardar o ultimo estado em que o controle do xbox360 ou o teclado se encontravam a cada quadro.


Podemos voltar ao método protected override void Update(GameTime gameTime) e logo abaixo de onde limitamos a rotação do canhão e acima do método UpdateCannonMissiles() vamos checar se o jogador pressionou o botão A do controle do xbox360 ou a barra de espaço do teclado. Para que fique mais interessante, vamos impedir que hajam disparos continuos caso o jogador mantenha pressionado qualquer um desses botões checando se o estado anterior do botão A do controle do xbox360 ou a barra de espaço era "não pressionado". Caso ele pressione qualquer um desses botões de disparo chamaremos a função FireCannonMissile() que realizará o disparo do missil. Devemos também ao final de tudo atualizar o valor das nossas variáveis de estado do controle e do teclado para que funcionem corretamente a cada quadro.


Vamos agora implementar nosso método FireCannonMissile() logo abaixo do fim do método protected override void Update(GameTime gameTime) e acima do método UpdateCannonMissiles(). Ele verifica se os misseis do nosso array ainda estão na tela, caso algum não esteja podemos disparar outo missil. Assim ele define a posição inicial do missil como sendo a posição do canhão, a rotação da imagem do míssil como sendo a mesma rotação da imagem do canhão (por isso fizemos as duas imagens no mesmo sentido), e a velocidade junto a direção que o missil será atirado.


Temos que fazer uma atualização no método UpdateCannonMissiles() para que possamos "matar" os mísseis que estiverem fora da nossa tela. Logo abaixo de onde atualizamos a posição do nosso missil no método UpdateCannonMissiles() vamos checar se o missil ainda está na tela, o que é uma tarefa bem simples por termos o nosso viewportRect.


Desenhando os Mísseis na Tela

Para finalizarmos temos que desenhar os nossos misseis na tela. Assim no método protected override void Draw(GameTime gameTime), para termos os misseis desenhados antes do canhão e dar a impressão que eles estão saindo de dentro do canhão temos também que colocar o código para desenha-los antes do código para desenhar o canhão. Então usaremos um loop para desenhar cada missil do nosso array na tela.


Se não nos esquecemos de nenhum detalhe e não cometemos nenhum erro podemos rodar nosso jogo e já ver nosso canhão atirando os misseis ao pressionarmos a barra de espaço do teclado ou o botão A do controle do xbox360.


Resumo

Nesta terceira parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio vimos como criar e desenhar os mísseis que o canhão do nosso navio irá disparar para acertar as aeronaves inimigas. Vimos o conceito de array, como declarar uma constante e alguns tipos de loop que a linguagem C# nos oferece.

Na quarta parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio veremos como criar as aeronaves inimigas para que apareçam de posições randomicas do canto direito da tela.

terça-feira, 21 de outubro de 2008

Tutorial - Nosso Primeiro Jogo 2D - Parte 2

Neste tutorial veremos, passo a passo, como criar um jogo 2D simples. Este tutorial foi baseado nos videos Begginers Guide 2D encontrados no site creators.xna.com.

Esta é a segunda parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio. Aqui veremos como criar uma nova classe para representar os outros objetos do nosso jogo. Com essa classe iremos carregar o canhão do navio no nosso projeto. Iremos também desenha-lo na tela e faze-lo girar com os comandos do teclado ou de um controle do xbox360.

Criando e Modificando a Classe GameObject

Vamos criar uma nova classe que representará os objetos do nosso jogo. Vamos clicar com o botão direito do mouse no nó que representa nosso projeto, o Belonave no Solution Explorer, clicando em Add->New Item..., selecionaremos o Template: Class na janela que aparece, daremos o Name: GameObject.cs e clicamos em Add.


Vemos que o XNA Game Studio criou para nós um arquivo praticamente vazio chamado GameObject.cs. Voltaremos então ao arquivo Game1.cs e bem no começo do arquivo temos os using. Iremos copiar todos os using de Game1.cs e coloca-los no lugar dos using que foram criados no GameObject.cs. Como cada objeto que criaremos em nosso jogo tem sua própria imagem, posição, rotação e centro, nós criaremos em nossa classe GameObject essas variáveis. A variável que representa a imagem do objeto será do tipo Texture2D e seu nome sprite, a que representa a posição do nosso objeto será do tipo Vector2 e seu nome position, assim a que representa a rotação do objeto será do tipo float e seu nome rotation e a que representa o centro da imagem é do tipo Vector2 e seu nome center.


Em seguida vamos declarar o construtor da nossa classe GameObject. O construtor é o método que chamamos ao criarmos um novo objeto. Em geral esse método inicializa tudo o que for necessário para a utilização do objeto. No caso do nosso construtor da classe GameObject, além de inicializarmos todos os seus parametros, ele irá receber uma Texture2D que será a imagem do objeto que desejamos desenhar na tela. Iniciaremos a posição como sendo zero, a rotação como sendo zero, atribuiremos a imagem que recebemos a nossa variável sprite e calcularemos o centro tendo esse as coordenadas metade da largura da imagem em X e metade da altura da imagem em Y.


Instanciando, Carregando e Desenhando o shipCannon

Agora vamos voltar ao Game1.cs. Logo abaixo de onde declaramos a backgroundTexture e o viewportRect vamos declarar nossa variável shipCannon, que será o canhão do nosso navio, e é do tipo GameObject.


Iremos inicializa-lo para podermos desenha-lo na tela do nosso jogo. No método protected override void LoadContent(), logo abaixo do Load<>() que fizemos para o backgroundTexture vamos instanciar o shipCannon como um novo GameObject que recebe um Load<>() da imagem do shipCannon e logo após isso vamos inicializar a posição do nosso canhão para posiciona-lo junto ao nosso navio desenhado no backgroundTexture.


Vamos ao método protected override void Update(GameTime gameTime) do Game1.cs, adicionaremos o código necessário para rotacionar o nosso canhão e assim podermos mirar nos nossos inimigos. Como vimos no nosso primeiro tutorial o método Update(GameTime gameTime) é o responsável por atualizar nosso jogo a cada quadro, é nele que codificamos todas as alterações de lógica que queremos fazer em cada objeto do jogo. Vamos adicionar primeiramente o código pare entrada do controle do xbox360 e após o código para entrada do teclado. Esses códigos farão nosso canhão rodar tendo seu centro como eixo. No caso do controle do xbox360, a rotação ocorre de acordo com a variação da alavanca para a esquerda e para a direita. No caso do teclado ocorre quando as teclas da direita ou da esquerda forem pressionadas. O código #if !xbox e #endif faz com que o trecho de código entre eles seja compilado em caso de atender a condição que no caso é ser diferente de xbox. O método Clamp() do MathHelper serve para limitarmos a rotação do nosso canhão.


Para desenharmos o canhão de nosso navio na tela, vamos ao método protected override void Draw(GameTime gameTime) mas não usaremos o mesmo Draw() do spriteBatch que usamos para o backgroundTexture, usaremos um overload do método que aceita outros argumentos. A versão que usaremos nesse caso recebe a imagem, a posição, o retangulo que é um argumento opicional, a cor, a rotação, a origem da rotação, a escala, efeitos e a profundidade.


Se não nos esquecemos de nada e nem cometemos nenhum erro podemos rodar nossa aplicação. Veremos o nosso navio já com seu canhão e esse atende as entradas do teclado e do controle do xbox360.


Resumo

Nesta a segunda parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio vimos como criar uma nova classe para representar os outros objetos do nosso jogo. Instanciamos essa classe e carregamos o canhão do navio no nosso projeto. Também o desenhamos na tela e o fizemos girar com os comandos do teclado ou de um controle do xbox360.

Na terceira parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio veremos como criar e desenhar os mísseis que o canhão do nosso navio irá disparar para acertar as aeronaves inimigas. Veremos também o conceito de array, como declarar uma constante e alguns tipos de loop que a linguagem C# nos oferece.


sexta-feira, 17 de outubro de 2008

XNA Challenge Brasil - O que é?

Neste post falarei um pouquinho sobre o XNA Challenge Brasil.

O XNA Challenge Brasil

É o maior concurso brasileiro de desenvolvimento de jogos para PCs e XBOXs utilizando a plataforma XNA Game Studio. Organizado pela Microsoft, incentiva estudantes, professores e entusiastas a criarem jogos com o XNA Game Studio abordando determinados temas.


Atualmente este concurso encontra-se em sua terceira edição e as inscrições para esta edição estão abertas.

- 3° XNA Challenge Brasil

A temática desse ano é "Resolver os problemas mais difíceis do Mundo" que são baseados nos desafios identificados pela ONU:
  • Pobreza
  • Saúde Materna
  • Desenvolvimento Colaborativo
  • Educação
  • Igualdade entre Gêneros
  • Aids e outras Enfermidades
  • Mortalidade Infantil
  • Sustentabilidade
Ao participar do XNA Challenge Brasil, a equipe também poderá participar do Imagine Cup 2009 na categoria Desenvolvimento de Jogos, com o mesmo projeto pois o tema é o mesmo e os critérios de classificação são similares.

O Concurso


O XNA Challenge Brasil é dividido em três etapas.

A primeira etapa é classificatória onde 10 equipes serão selecionadas para as semifinais. O prazo de submissão do jogo será até o dia 15/12/08 as 23:59.

A segunda etapa é a fase semi final onde 5 equipes serão selecionadas para a final. Essas equipes devem submeter um resumo da implementação do jogo, demo do jogo no formato, video do jogo e o código-fonte do jogo até o dia 26/01/09 as 23:59.

A terceira etapa é a fase final do concurso. Nela, as 5 equipes finalistas deverão apresentar seus jogos pessoalmente para a comissão julgadora. Deverão também enviar no dia da apresentação final um resumo descritivo da implementação, o jogo final e o codigo-fonte do mesmo, alé de uma apresentação em powerpoint.

A Premiação


Haverá premiação para os três primeiros lugares e para um escolhido do juri popular. O escolhido pelo juri popular será escolhido pela platéia no dia da apresentação dos cinco finalistas e receberá um kit com um controle do Xbox360 sem fio e um jogo Microsoft para PC para cada participante da equipe. O terceiro lugar recebe um kit contendo Lifechat VX 3000 e um jogo Microsoft para PC para cada participante da equipe. O segundo lugar da competição recebe um kit contendo mouse SideWinder e Lifechat VX 3000 para cada integrante da da equipe. O prêmio para a equipe que vencer o XNA Game Challenge é uma viagem internacional para um representante da equipe conhecer a sede da Microsoft em Seattle e um Xbox para cada outro integrante.

terça-feira, 14 de outubro de 2008

Tutorial - Nosso Primeiro Jogo 2D - Parte 1

Neste tutorial veremos, passo a passo, como criar um jogo 2D simples. Este tutorial foi baseado nos videos Begginers Guide 2D encontrados no site creators.xna.com.

Esta é a primeira parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio. Aqui vamos rever como criar um novo projeto e como adicionar imagens ao nosso projeto. Vamos ver também como carregar e desenhar na tela uma imagem de fundo no nosso jogo.

No nosso jogo teremos basicamente um navio, seus mísseis e aviões. O objetivo do jogo é, controlando o canhão do navio, conseguir acertar o maior número de aviões que passarem voando na tela.

Criando um Novo Projeto

Primeiramente vamos começar criando um novo projeto. No Visual C# 2005 Express Edition vamos no menu File->New Project..., ou apenas Ctrl+Shift+N. Selecionaremos como Project Type: XNA Game Studio 2.0 e como Template: Windows Game. O Name do projeto eu chamei de Belonave e procurando na Wikipédia temos a seguinte definição: "Belonave é a designação de qualquer tipo de embarcação, fluvial ou marítima, para utilização em combate.", o que tem muito a ver com nosso jogo. Também selecionaremos o Location que acharmos melhor para armazenarmos nosso projeto em nosso PC. Em Solution escolheremos a opção Create a new Solution, deixaremos a opção Create directory for solution marcada e clicaremos em OK.


Salvando as Imagens e Adicionando ao Projeto

Agora que criamos nosso novo projeto, já podemos ver no Solution Explorer os arquivos que o compõem. Ainda não modificaremos nenhum arquivo. Antes vamos baixar e adicionar ao projeto as imagens que usaremos em nosso jogo. Clique em cada imagem abaixo e, com o botão direito do mouse, salve elas em seu PC com os seguintes nomes:

backgroundTexture:

shipCannon:

cannonMissile:

enemyPlane:



Para organizarmos melhor nossas imagens, após telas salvo em nosso PC, vamos voltar ao Visual C# 2005 Express Edition e vamos clicar com o botão direito do mouse em Content, no Solution Explorer, Add->New Folder e nomearems essa nova pasta como Sprites. Mais uma vez na Wikipédia encontramos a seguinte definição: "Sprite é um objeto gráfico bi ou tridimensional que se move numa tela sem deixar traços de sua passagem.". Nessa pasta ficarão armazenadas todas as imagens que usaremos em nosso projeto.
Clicando com o botão direito do mouse na pasta recém criada, no Solution Explorer dentro de Content, Add->Existing Item e vamos ao local onde salvamos nossas imagens. Selecionaremos e adicionaremos cada uma delas.


Carregando e Desenhando a Imagem de Fundo

Depois que já tivermos todas as imagens adicionadas ao projeto na pasta Sprites vamos começar a modificar nosso código. Caso ainda não esteja aberto, abriremos o arquivo Game1.cs clicando duas vezes nele no Solution Explorer. Com o arquivo aberto, procuraremos a classe Game1 dentro dele. Abaixo de GraphicsDeviceManager graphics; iremos declarar a variável que será responsável pela imagem de fundo do nosso jogo. Essa variável será do tipo Texture2D e se chamará backgroundTexture. Abaixo de nossa variável backgroundTexture vamos declarar outra variável, que será responsável por definir a área máxima que um objeto poderá ter. Esta será do tipo Rectangle e a chamaremos de viewportRect. Essas variáveis que acabamos de declarar ficaram acima do SpriteBatch spriteBatch; que é uma classe do XNA framework que utilizaremos para desenhar todas as imagens que usamos nesse tutorial.


Para carregarmos nossa imagem de fundo no nosso jogo, vamos ao método protected override void LoadContent() que como vimos em nosso primeiro tutorial, é um método que é chamado quando o jogo inicia e ele carrega todas as imagens que precisamos durante o jogo. Logo abaixo de spriteBatch = new SpriteBatch(GraphicsDevice); vamos carregar nossa imagem de fundo na nossa variável backgroundTexture. Para isso vamos usar o método Load<>() da classe Content Manager.


Ainda no método protected override void LoadContent(), abaixo da atribuição que acabamos de fazer para carregar nossa imagem de fundo, vamos instanciar nosso viewportRect atribuindo a ele as nossas medidas da tela começando em (0, 0) e termonando em (width, height) da Viewport.


Agora que a carregamos, desenharemos a nossa imagem de fundo na tela. Para isso usaremos a classe SpriteBatch spriteBatch; e nosso Rectangle viewportRect; que acabamos de inicializar. Vamos então ao método protected override void Draw(GameTime gameTime). Como vimos no nosso primeiro tutorial o método Draw() é o responsável por redesenhar a tela a cada quadro. É nele que a tela é limpa e que desenhamos cada objeto que desejamos que apareça no nosso jogo. Abaixo do graphics.GraphicsDevice.Clear(Color.CornflowerBlue); vamos acrescentar o bloco que nos permite desenhar na tela.
Iniciamos com o método Begin() do spriteBatch, desenhamos com o método Draw() do spriteBatch e ao terminarmos finalizamos com o método End() do spriteBatch. No método Begin() podemos passar como parametro o SpriteBlendMode.AlphaBlend que nos permite desenhar imagens com transparencia. No método Draw() iremos passar como parametros nossa textura, um retangulo que especifica onde a sprite será desenhada, e uma cor que por default estamos usando o branco. O método End() não recebe parametros.


Se não tivermos esquecido de nada, podemos rodar nossa aplicação sem erros e conseguiremos ver a janela do nosso jogo já com a nossa imagem de fundo no lugar.


Resumo

Nesta primeira parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio revimos como criar um novo projeto e como adicionar imagens ao nosso projeto. Vimos como carregar e desenhar na tela uma imagem de fundo no nosso jogo.

Na segunda parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio veremos como criar uma nova classe para representar os outros objetos do nosso jogo. Com essa classe iremos carregar o canhão do navio no nosso projeto. Iremos também desenha-lo na tela e faze-lo girar com os comandos do teclado ou de um controle do xbox360.


sábado, 11 de outubro de 2008

Imagine Cup - O que é?

Neste post falarei um pouquinho de uma das maiores competições de desenvolvimento de jogos com o XNA Game Studio.

A Imagine Cup

É uma competição anual patrocinada e organizada pela Microsoft. Ela une jovens interessados em tecnologia ao redor do mundo com o objetivo de resolver alguns desafios. Ela tem diversas categorias e uma delas é a de desenvolvimento de jogos.

- Imagine Cup Website

Essa competição foi iniciada em 2002 e tem aumentado rapidamente no número de competidores. Em 2008 houveram 210.000 inscritos de mais de 100 países para competir em uma das nove categorias da competição.



A Categoria Desenvolvimento de Jogos

Nessa categoria a equipe competidora deve inventar um jogo usando o XNA Game Studio e o Visual Studio. A cada ano mudam os temas que os jogos devem ilustrar. Para 2009 o tema é "Imagine um mundo onde a tecnologia ajude a resolver os problemas mais dificeis que enfrentamos hoje."

Em 2008 o tema foi Sustentabilidade Ambiental e a equipe vencedora foi brasileira. A equipe Mother Gaia Studio venceu a final do Imagine Cup que ocorreu em Paris com seu jogo City Rain.


City Rain é um jogo de pixel art 2D isométrico que mistura um puzzle criativo com um simulador de planejamento urbano focado na ecologia e na sustentabilidade ambiental. No jogo você é o prefeito de uma cidade que deve decidir qual é a melhor maneira de construir uma cidade lucrativa e também ambientalmente sustentavel.

A Competição

O Imagine Cup acontece em três etapas sendo a primeira qualificatória, a segunda as semi finais e a terceira as finais. Em 2009 as finais ocorrerão no Egito. Na primeira etapa as equipes criam e enviam o material de seu jogo que deve consistir basicamente em um demo jogável com pelo menos uma fase implementada que consiga passar a jogabilidade do jogo, a descrição do jogo e as instruções. Na segunda etapa a equipe deve submeter o jogo completo e um sumário do jogo. E na terceira etapa cada equipe terá 30 minutos para apresentar seu jogo a uma banca que irá julga-lo.


A Premiação

Os premios para os semifinalistas é um Premium Membership de 12 meses no Creators Club para cada integrante da equipe. Caso a sua equipe vá para a final ela ganha uma viagem para a cidade onde será realizada a final incluindo passagens, estadia e alimentação. A equipe que vencer a final ainda leva 25 mil dolares para serem divididos igualmente entre os integrantes da equipe, e um pacote com livros e um voucher para Certificação da Microsoft. A equipe na segunda posição recebe 10 mil dolares e a que fica em terceiro 5 mil dlares.

Eu já me empolguei de participar, e você?

quarta-feira, 8 de outubro de 2008

Tutorial - Nossa Primeira Aplicação - Extra

Hoje estou postando aqui no blog uma parte extra do nosso tutorial Nossa Primeira Aplicação. Recebi alguns pedidos e algumas perguntas de como tratamos entradas do teclado e do controller do XBOX360. Nesse post mostrarei como trata-las fazendo nosso aviãozinho voar mais alto ou mais baixo, ou seja, daremos uma movimentação vertical a ele além da movimentação horizontal que ele já possui. Em seguida faremos com que ele não saia da tela nos limites superiores e inferiores.

Abriremos novamente o Visual C# 2005 Express Edition e o nosso projeto, ou pela Start Page em Recent Projects, ou em File->Open Project... se sabemos onde salvamos nosso projeto.

Voltamos a ter nosso Game1.cs aberto. Caso o Game1.cs não esteja aberto é só dar um duplo clique em Game1.cs no Solution Explorer.

Movimentando de Acordo com o Input

Com o XNA Game Studio podemos ter diversos inputs diferentes, seja ele o controller do XBOX360, o teclado do PC ou até mesmo os botões do Zune. Aqui, por enquanto, cobriremos somente as duas primeiras entradas, o teclado e o controller. Caso você não tenha um controller do XBOX360 em casa, não será possivel testar se o código que você fez para o controller funciona corretamente, caso tenha é só conectar o controller do seu XBOX360 em uma porta USB do seu PC e testar o código que escreveremos aqui.

Vamos ao método Update() da nossa classe Game1 pois é nesse método que quando pressionada a tecla Up ou Down do teclado ou do Dpad do nosso controller atualizaremos a posição do nosso avião. Como ainda lembramos do nosso sistema de coordenadas da tela, sabemos que ao pressionarmos o botão Down do teclado ou do Dpad temos que incrementar de um valor o Y da posição do nosso avião e ao pressionarmos o botão Up do teclado ou do Dpad temos que decrementar de um valor o Y da posição do nosso avião.


Devemos inserir o código no método Update() acima das modificações que haviamos feito anteriormente. Assim fazemos o teste com o if onde nossa condição é se o estado do teclado ou do Dpad tiver pressionado os botões Down ou Up fazemos planePosition.Y += ou -= 2.5f.



Se rodarmos nossa aplicação e pressionarmos o Down ou o Up veremos que o avião se move para baixo ou para cima ainda respeitando os limites laterais da nossa tela mas ultrapassando seus limites superiores e inferiores. Como corrigir isso?

Respeitando os Limites da Tela

Uma das opções é fazermos uma checagem da posição do aviãozinho com relação ao limite superior ou inferior da tela.


Se sua posição em Y for maior ou menor do que os limites da tela em Y igualaremos sua posição em Y ao limite em Y da tela.

Talvez, para ficar mais interessante, fosse legal darmos uma pequena rotação na nossa imagem no sentido horário caso esteja descendo e no sentido anti-horário caso esteja subindo.

Rotacionando nossa Imagem

Para realizarmos essa rotação precisaremos de uma outra variável na nossa classe. Iremos declarar a nossa variável do tipo float, planeRotation, junto com as outras variáveis da nossa classe. Não iremos inicializá-la ainda.


Essa variável receberá um valor em radianos da anlgulação que queremos que a nossa imagem gire.

Agora novamente no início do método Update() iremos inicializar nossa variável planeRotation com o valor 0.0f, para que a cada loop se não pressionarmos Down ou Up nossa imagem seja desenhada da maneira original.


E dentro de cada bloco em que checarmos se pressionamos Down ou Up do teclado ou do Dpad do controller iremos atribuir uma angulação de acordo com o movimento que estamos fazendo.


Ainda temos que passar para o spriteBatch essa atualização na rotação que fizemos da nossa imagem para que ele possa desenha-la levando em consideração essas modificações. Então no método Draw():


Agora está quase tudo ok. Se rodarmos e mexermos um pouquinho veremos o porque nossa aplicação ainda não está 100%.


Ao vermos essa imagem até parece que está tudo bem com nossa aplicação, se algum de vocês já tiver rodado sua aplicação verá que não está tudo bem pois a imagem a esquerda mostra a posição do aviãozinho subindo após sua imagem estar flipada e a da direita mostra ele descendo após sua imagem estar flipada, deveria ser o contrário!

Corrigiremos isso invertendo a rotação caso a imagem estaja flipada, ou seja, ao desenharmos, quando fazemos o check se a imagem está flipada, antes iremos fazer com que o nosso planeRotation = -planeRotation.


Agora tudo estará rodando como desejamos. Podemos rodar e ver os resultados.

Resumo

Nesta parte extra do nosso tutorial Nossa Primeira Aplicação vimos como tratar a entrada do teclado e tembém uma entrada vinda do controller do XBOX360. Vimos também um pouquinho de como rotacionamos uma imagem que estamos desenhando na tela além de masi alguma pratica com blocos condicionais.

Espero que gostem e que estejam conseguindo fazer coisas interessantes a partir das noções que foram dadas aqui nesse primeiro tutorial que nos dá uma visão bem básica do XNA Game Studio e de aplicações 2D utilizando essa ferramenta.


XSI Mod Tool - O Que é?

Neste post estaremos falando um pouco sobre a SOFTIMAGE|XSI Mod Tool, mais uma vez uma sugestão muito interessante de conteúdo vindo da nossa comunidade no Orkut.

A XSI Mod Tool

É uma aplicação gráfica 3D da SOFTIMAGE onde podemos desenvolver conteúdo para nossos jogos e para mods de jogos. Traz as mesmas ferramentas de modelagem e animação 3D do XSI 6, que é a ferramenta usada pelos profissionais no mercado para criar o conteúdo gráfico dos jogos AAA como Half Life 2. A grande vantagem do Mod Tool é que além de sua qualidade ela é grátis.


A Mod Tool é uma ferramenta muito interessante para nós que desenvolvemos jogos usando o XNA Game Studio pois nos fornece total integração com o framework através de um plug-in. Assim o conteúdo criado é exportado facilmente para os nossos projetos e usados no nosso código da mesma maneira que usamos imagens.

Como começar?

Para começa o desenvolvimento de assets para nossos jogos devemos fazer o download da ferramenta. É recomendado o download de além da Mod Tool, do Mod Tool 6.X Motor, que é um patch para a Mod Tool, e do CROSSWALK, que ajuda a importar e exportar conteúdo do 3DS Max e Maya para o Mod Tool.

É necessário um rápido registro para a ativação e o download da ferramenta.

- SOFTIMAGE|XSI Mod Tool Download

Após o dowload, no site da Mod Tool existem diversos recursos de aprendizado da ferramenta, dentre eles alguns video tutorials muito interessantes. Tem um tutorial especialmente para desenvolvedores XNA e um arquivo de documentação de como integrar o XSI Mod Tool e o XNA.

- Quick Start: XNA Development Video
- XNA Game Studio Integration in SOFTIMAGE|XSI

Esse pdf de como integrar o XNA no XSI é bem explicativo e aborda desde uma explicação e como preparar o ambiente junto ao projeto do XNA até como mostrar o modelo, passando por sua modelagem, animação e importação.

Para Saber Mais

Maiores informações podem ser obtidas no site da Mod Tool.

- SOFTIMAGE|XSI Mod Tool Website

Agradecimento

Gostaria de agradecer ao Renan Recapix pela sugestão e dica e fica aqui o convite de futuramente desenvolvermos juntos uma série de tutoriais que abordem desde a modelagem no Mod Tool, sua inclusão no projeto, até a programação e desenvolvimento do jogo.

Abraços a todos
Leo Camello

domingo, 5 de outubro de 2008

A Linguagem C# e o XNA Game Studio

Este post é para auxiliar os iniciantes a entender um pouco mais sobre a linguagem de programação C#(c sharp) e a relação que ela tem com a nossa ferramenta de desenvolvimento, o XNA Game Studio.

O que é C#?

C# é uma linguagem de programação orientada a objetos da Microsoft que tem como objetivo combinar o poder do C++ com a facilidade do Visual Basic, foi criada baseada no C++ e tem muitas similaridades ao Java.

Algumas razões que a torna importante no desenvolvimento de jogos é o fato de ser gratuita, podendo ser baixada diretamente do site da Microsoft, e além disso ser uma ferramenta poderosa no desenvolvimento de jogos para PC, XBOX360 e agora também para o Zune.

Onde aprender mais sobre essa linguagem

Na web existem muitos sites que contém informações sobre o C#. Como é uma linguagem de programação da Microsoft podemos conseguir a grande maioria das informações além de treinamento online no site do msdn.

- http://msdn.microsoft.com/en-us/vcsharp/

Na sessão "Learn C#" do site temos muitos recursos interessantes como video aulas, kits para iniciantes e os catálogos mais tradicionais de aprendizagem.

Para aqueles que sabem pouco de C# ou que viram somente a linguagem nesses nosso primeiros tutoriais o link abaixo dá uma visão bem introdutória as principais caracteristicas da linguagem como a estrutura de um programa em C#, fluxo de execução, classes, loops e o famoso hello world.

- http://msdn.microsoft.com/en-us/library/zkxk2fwf.aspx

Para aqueles que já tem um bom conhecimento da linguagem, os proximos dois links(C# Programming Guide e C# Reference) são muito importantes caso precisemos fazer alguma pesquisa ou no surgimento de alguma dúvida.

- C# Programming Guide
- C# Reference

Fica aqui essa dica para aqueles que se interessarem em aprofundar seus conhecimentos na linguagem de programação que usaremos no desenvolvimento de jogos usando o XNA Game Studio.

Abraços a todos.
Leo Camello

quinta-feira, 2 de outubro de 2008

Mono.XNA - O que é?

Atendendo a pedidos feitos na nossa comunidade no Orkut, hoje estarei falando um pouco sobre o Mono.XNA.

O que é o Mono.XNA?

O Mono.XNA é uma implementação multi plataforma e open source do XNA framework. Essa implementação roda no Windows, Linux e MacOS usando o OpenGL para suporte a gráficos tridimensionais. O projeto teve início no final de 2006 e ainda está andamento tendo seus contribuidores encontrado muitas dificuldades com relação a esssa portabilidade e esse suporte a gráficos 3d. Desde julho de 2007 parece não haver um avanço significativo no projeto.

Página do projeto: http://code.google.com/p/monoxna/

Mono.XNA e seu Desenvolvimento

O Mono.XNA ainda está em fase inicial mas seu objetivo é permitir que um projeto em XNA seja compilado e rode em plataformas que não sejam Windows sem a necessidade de qualquer modificação em seu código.

Qualquer pessoa que se interessar pode contribuir com o desenvolvimento dessa plataforma. Para isso basta checar a lista do que ainda falta implementar, se registrar no forum e notificar aos outros colaboradores do projeto seu interesse.

O código fonte do Mono.XNA está disponível no repositório do Google Code.

Código Fonte do Mono.XNA: http://monoxna.googlecode.com/svn/trunk/

Pong e Mono.XNA

No dia 19 de abril de 2007, um dos colaboradores do projeto, Stuart Carnie postou em seu blog que com o Mono.XNA foi possível rodar o joguinho Pong tanto no Windows quanto no Mono runtime.
Esse é o screenshot que o Stuart postou em seu blog.

O código fonte do projeto já está com as alterações que possibilitaram esse funcionamento básico do Mono.XNA.

O último post do Blog do Stuart a respeito do assunto é "MonoXNA - what version of OpenGL?", do dia 15 de maio de 2007.

Resumo

O Mono.XNA seria uma ótima alternativa ao desenvolvimento com XNA para os amantes do Linux e do Código Aberto mas devido as dificuldades encontradas no caminho o projeto encontra-se não muito movimentado. As implementações do suporte a 3d não parecem ter vingado e o que é realidade ainda é a possibilidade dos joguinhos 2d mais simples.

Espero ter conseguido deixar mais claro com este post o que é o Mono.XNA, em que fase se encontra seu desenvolvimento e quais são as reais possibilidades de uso dessa ferramenta.

Abraços
Leo Camello