Artigo
Usando um banco ou grid de imagens com o XNA
O XNA permite facilmente o uso de apenas um único arquivo no qual estão todas as imagens do seu jogo. Veja como.
Enviado por André Furtado em 7/7/2007 13:14:45

 

Introdução

É muito comum a situação em que as imagens do nosso jogo não estão espalhadas em vários arquivos, cada um com uma imagem, e sim em apenas um único arquivo, que exibe todas as imagens lado a lado na forma de um grid, como mostra a figura abaixo.

 

 


Tal cenário é especialmente interessante em jogos para dispositivos móveis, como celulares, em que o espaço de armazenamento é escasso e não se deseja ocupá-lo com vários cabeçalhos de arquivos (se for apenas um único arquivo, haverá apenas um único cabeçalho).

 

Solução

O XNA suporta facilmente a utilização de tais bancos ou grids de imagens, talvez mais fácil do que você imagina. O método Draw, da classe SpriteBatch, possui uma versão (overload) que permite escolher qual o retângulo da imagem de origem que será desenhado na tela.

Vejamos isso na prática. Supondo que você possui a imagem acima, vamos desenhar o monstro vermelho que aparece na primeira linha do grid, assim como o monstro verde logo abaixo dele. Os passos são:

1. Crie um novo Windows Game no XNA Game Studio Express. Chamei-o de “BancoImagens”.
2. Adicione ao seu projeto (Windows Game) o arquivo de imagem (no meu caso ele se chama imagens.bmp).
3. Adicione como atributo do seu jogo um objeto Texture2D, para carregar a imagem, e um objeto SpriteBatch, para desenhar a imagem, como mostra o código abaixo.

public class Game1 : Microsoft.Xna.Framework.Game {

GraphicsDeviceManager graphics;

ContentManager content;

Texture2D txBancoImagens;

SpriteBatch sBatch;
...

}

4. No método Initialize, inicialize os objetos Texture2D e o SpriteBatch.

protected override void Initialize() {

    base.Initialize();

txBancoImagens = content.Load<Texture2D>("imagens");

sBatch = new SpriteBatch(graphics.GraphicsDevice);

}

5. Agora é chegado o ponto-chave do código. Entre chamadas dos métodos Begin e End do objeto SpriteBatch, invoque chamadas ao método Draw desse mesmo objeto. Porém, use uma versão dele que recebe o retângulo de origem como parâmetro. Irei utilizar uma versão que recebe, na seguinte ordem: a textura, a posição final do desenho na janela do jogo, o retângulo de origem e a “cor de tingimento” do desenho (no caso, nenhuma em especial, ou seja, branca).

protected override void Draw(GameTime gameTime) {

graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

 

sBatch.Begin();

sBatch.Draw(txBancoImagens, Vector2.Zero, new Rectangle(275, 0, 140, 90), Color.White);

sBatch.Draw(txBancoImagens, new Vector2(200, 200), new Rectangle(275, 90, 140, 75), Color.White);

sBatch.End();

base.Draw(gameTime);

}

O monstro vermelho está situado, na imagem original, em uma área retangular que começa no ponto (0,275) e possui como dimensões (largura,altura) 140 pixels por 90 pixels. Estou desenhando esse monstro vermelho começando da origem da janela, ou seja, ponto (0,0).

Já o monstro verde está situado em uma área retangular que começa no ponto (275,90) e possui como dimensões 140 pixels por 75 pixels. Esse segundo mostro é desenhando em um ponto mais para o meio da janela do jogo (200,200).

A figura abaixo exibe o resultado:


 

 

 

Conclusão

Esse simples artigo mostrou como desenhar várias imagens no seu jogo a partir de um único arquivo, que na verdade contém um banco (ou grid) de imagens. Coloquei explicitamente cada ponto e dimensão das áreas retangulares de origem das figuras. Entretanto, uma lógica mais inteligente e menos trabalhosa pode ser utilizada, como laços for aninhados que têm seus índices (os famosos i e j) incrementados de acordo com as dimensões e posições das imagens dentro do grid.

Agora é com você: experimente carregar outras regiões do grid de imagens para, por exemplo, animar os monstros desenhados.

Jogar bem!

[]s
-- AFurtado

  bancoimagens.zip 90076 bytes
Código-fonte do projeto utilizado para exemplificar esse artigo


Sobre o Autor

AFurtado
André Furtado
Não Definido

Clique para avaliar:

Comentários
" Belo artigo, simples e eficiente! "
Enviado por joqus em 21/5/2008 9:26:41:
 
" oi AFurtado, eu ainda não parei para analisar nenhuma game engine, por isso que eu perguntei a você - já que eu quero analisar alguma num futuro próximo.

Pelo que deu pra notar da FlatRedBall, é que ela oferece um suporte bem legal aos seus usuarios; ela tem chat, forum e muito material para a pessoa aprender.

Quem estiver querendo analisar outras Game Engines, neste link, tem concentrada várias Game Engines:

http://www.ziggyware.com/weblinks.php?cat_id=10

No CodePlex(www.codeplex.com), também é possivel achar algumas Game Engines.
"
Enviado por lucianoJose em 20/4/2008 11:49:41:
 
" Achei que ela satisfaz melhor minhas necessidades para jogos arcade e oferece uma baixa curva de aprendizado. Voce tem outras para sugerir? Caso sim gostaria de analisa-las tambem!"
Enviado por AFurtado em 19/4/2008 19:15:40:
 
" AFurtado, quais foram os motivos que levaram você a ter escolhido a game engine FlatRedBall? Há algum diferencial dessa game engine para as outras?"
Enviado por lucianoJose em 19/4/2008 13:43:20:
 
" Apenas dando um update: em vez de implementar tais features na SharpEngine, estou focando meus esforços no FlatRedBall game engine: www.FlatRedBall.com"
Enviado por AFurtado em 16/4/2008 18:56:14:
 
" Estarei no aguardo! "
Enviado por Nilo em 1/10/2007 6:44:53:
 
" Oi Nilo,

Estou dando um gás na SharpEngine, um game engine básico, inicialmente para jogos arcade nos quais proverei facilidades para sua demanda acima. Espero conseguir lançar algo próxima semana.

[]s
-- AFurtado
"
Enviado por AFurtado em 28/9/2007 15:52:46:
 
" André, Eu já fiz algumas coisas e eu queria ver se alguém já fez um "Manager" de Sprite. Deixa eu explicar melhor. Tenho um grid com toda movimentação (Andando, Parado, Pulando e atirando) os sprites estam com as mesmas dimensões e continuo, exemplo Quadro 1 -> 1º passo, Quadro 2 -> 2º passo etc... e de acordo com os input's seria selecionado uma imagem diferente (quadro 1, quadro 2, etc...).Ficou confuso, mas espero que vcs entendam "
Enviado por Nilo em 28/9/2007 14:24:48:
 
" Geralmente quem faz/usa o grid tem uma noção da largura/altura de cada célula do mesmo, de antemão.

[]s
-- AFurtado
"
Enviado por AFurtado em 9/8/2007 8:40:39:
 
" bom souza, ai vc tera que usar um editor tipo o Paint.NET ou Microsoft Visual Studio, ou um outro editor qualquer que possa lhe passar a coordenada, para tanto selecione o retangulo da imagem marcando-a com a opção retangulo, e observe as posições dos eixos que serão passadas da área delimitada por voce... geralmente fica no rodapé da página."
Enviado por manoel em 8/8/2007 7:41:04:
 
" eae... como e que eu sei que naquele ponto, (TIPO) "Já o monstro verde está situado em uma área retangular que começa no ponto (275,90)"...

como e que eu sei... tenho que ir adivinhando ou ten um geito mais simples??
"
Enviado por sousa em 8/8/2007 4:40:42:
 
" Da forma como eu mostrei, as dimensões da imagem são usadas apenas diretamente na hora do desenho, dessa forma não ficam armazenadas.

Uma coisa que eu faço, entretanto, é encapsular a imagem em uma "entidade" do jogo, e essa sim terá os atributos de largura e altura previamente definidos por você (e quem sabe até usados para carregar a própria imagem do grid, aém da colisão?)

[]s
-- AFurtado
"
Enviado por AFurtado em 25/7/2007 16:14:45:
 
" outra pergunta: como recupero o tamanho da imagem retirada do banco de imagens para que eu possa controlar no evento de colisão, pois até então eu estava recuperando a imagem desta forma:
imagem = Texture2D.FromFile(graphics,nomeImagem());
ai eu usava posicao.X >= (800 - imagem.Width), como posso fazer a mesma coisa usando o SpriteBatch?
"
Enviado por manoel em 25/7/2007 12:48:22:
 
" Parabens pela materia, muito util!"
Enviado por manoel em 10/7/2007 8:49:15:
 

Adicione seu Comentário  Voltar
Translator
Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso