domingo, 20 de março de 2011

Estrutura Básica de um Projeto XNA

XNA é a sigla para “XNA's Not an Acronym” (XNA não é um acrônimo), que vem de uma brincadeira que a Microsoft decidiu fazer, pois muitos produtos dessa utilizam de acrônimos em seus nomes.

O XNA é um poderoso framework para desenvolvimento de jogos para as plataformas Windows, XBOX 360, Zune e, recentemente, Windows Phone 7. Utiliza a linguagem C# para a programação e atualmente encontra-se na versão 4.0, que é parte integrante do kit de desenvolvimento do Windows Phone 7.

Estrutura de um projeto
  
Um jogo consiste basicamente em preparar o ambiente onde o jogo irá rodar (carregar os recursos necessários, texturas, mapas...), manter o jogo em um laço de repetição até que uma condição seja alcançada, por exemplo algum jogador vencer, e finalmente descarregar os recursos utilizados no jogo. Podemos representar esta estrutura utilizando o seguinte pseudocódigo:

1- Inicializar recursos gráficos, dispositivos de entradas e dispositivos de áudio
2- Iniciar o laço de repetição, e em cada iteração:
    - Capturar entradas
    - Realizar cálculos, por exemplo: movimentos, colisões, I. A
    - Verificar se o jogo terminou (se atende o critério de fim estabelecido)
    - Redesenhar os objetos na tela, gerar as respostas para ações do jogador
3- Finalizar o laço
4- Liberar os recursos utilizados

O XNA possui recursos que agilizam o desenvolvimento, pois não é necessário lidar com recursos de mais baixo nível, é possível focar-se apenas nos detalhes referentes ao jogo, por exemplo não é necessário preocupar-se com detalhes de mplementação do laço de repetição anteriormente citado, pois o XNA possui toda a estrutura básica de um jogo em uma classe chamada Game.

Ao criarmos um novo projeto utilizando o template Windows Game já teremos uma classe (que herda da classe Game) que possui todos os métodos necessários para a estrutura básica apresentada anteriormente, são eles:

Initialize() - O ponto de partida para inicialização do jogo
LoadContent() - O carregamento dos recursos necessários
Run() - Inicio do laço de repetição
    Update() - Leitura de entradas, cálculos, teste para o critério de fim
    Draw() - Desenhar os objetos na tela
UnloadContent() - liberar os recursos utilizados

Agora vamos a uma explicação um pouco mais detalhada dos recursos apresentados nesta classe, por padrão chamada de Game1 (seu nome pode ser alterado sem qualquer problema).

No início da classe encontramos duas referências para as classes GrapchisDeviceManager e SpriteBatch, onde a primeira nos dá acesso a recursos da placa de vídeo e a segunda é utilizada para desenhar textos e imagens 2D no dispositivo gráfico. Abaixo encontramos o construtor que instancia a variável graphics com uma referência para o dispositivo padrão (nossa tela) e a definição do diretório onde serão armazenados os recursos (imagens, sons, texturas...) do projeto.
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

Após o construtor nós encontramos o método Initialize que é chamado logo que o jogo é iniciado, mas antes deste entrar no laço de repetição, é o local onde podemos carregar recursos que não estão ligados ao dispositivo gráfico, por exemplo a preparação de arquivos de áudio. Após este temos o método LoadContent onde são iniciados todos os recursos gráficos relacionados ao jogo, como o carregamento de textura para os mapas, inicialização dos objetos que representam os personagens e suas devidas texturas. Em seguida temos o método UnloadContent que simplesmente libera os recursos carregados pelo método LoadContent, como por exemplo texturas utilizadas para representação de personagens em um cenário.

        protected override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
        }

        protected override void UnloadContent()
        {
            // TODO
        }

Abaixo do método UnloadContent visualizamos os dois métodos que pertencem ao laço de repetição citado anteriormente. O primeiro, Update, é onde são inclusos os cálculos para posicionamento de texturas, algoritmos para verificação de colisões, verificação de entradas e verificação do critério para término, notamos que por padrão já foi criado um comando que verifica se o usuário apertou a tecla “Back” no controle, o que fechará o jogo. O segundo, Draw, é responsável por desenhar os componentes no dispositivo gráfico, ou seja, mostrar na tela o resultado do método Update, notamos ainda que há um comando que limpa o dispositivo gráfico e o preenche com uma única cor, no caso azul. Percebemos que ambos possuem algo em comum, um parâmetro do tipo GameTime que possui propriedades que representam o tempo desde a última iteração do laço de repetição, o tempo total desde que o jogo foi iniciado e verificação se o método Update está sendo chamado conforme o número de vezes definido na classe Game (por padrão é chamado 60 nas plataformas Windows e XBOX, e 30 vezes nas plataformas Zune e Windows Phone 7), estas propriedades podem ser utilizadas para o posicionamento de componentes de acordo com a velocidade do jogo, por exemplo.

        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

            // TODO

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO

            base.Draw(gameTime);
        }
    }

Encerramos então a apresentação de uma estrutura básica de um projeto XNA, informações mais detalhadas sobre estes procedimentos podem ser encontradas no livro Beginning XNA 3.0 Game Programming ou sem sua versão em português XNA 3.0 Para Desenvolvimento de Jogos No Windows, Zune e XBOX 360.



Nenhum comentário:

Postar um comentário