061 - AmareloGameEngine[2]: Importando arquivos para o projeto
Autor: ...:::Saulo Ribeiro:::... | Publicado: 2011-10-19T17:02:00-02:00

Neste post, vamos aprender um pouco sobre os métodos abstratos da engine que devem ser implementados, a sua importância e como adicionar arquivos ao projeto.

3. Importância dos métodos abstratos
Anteriormente vimos que AmareloGameEngine possui quatro métodos abstratos que precisam ser implementados no projeto. Vejamos o que cada um desses métodos faz:

initialize() - É usado para carregar os arquivos que mais tarde serão utilizados no jogo [audio, sprites, fontes...]. Tais arquivos precisam ser importados, como será mostrado adiante.
loadContent() - É usado para inserir no jogo os arquivos carregados préviamente na initialize.
unloadContent() - Em teoria, é usado para remover do jogo os arquivos carregados na loadContent() [particulamente, não sabemos o seu verdadeiro propósito. Vamos deixar essa função um pouco de lado].
update(GameTime game) - é usado para atualizar as informações do jogo em andamento (posição do personagem, tempo de jogo...). Toda a lógica do seu jogo é adicionado a função update.

4. Importando os arquivos do jogo 
Todos os arquivos que serão usados em seu jogo [imagens, arquivos de audio, fontes] devem ser importados para a pasta Content de seu projeto






 Na aba SOLUTION EXPLORER, clique com o botão direito em cima de "(***projeto***)Content (Content)" // add // Existing Item






Na janela que se abrirá, navegue até a pasta onde estão os itens que
 você deseja adicionar e selecione - os [Mais de um arquivo podem ser 
adicionados a vez]. Aperte ENTER [ou clique em ADD] para adiciona - los.
 [ Como exemplo importarei 3 arquivos: "background_01.png", 
"char_black.png" e "qqr.wav"]
Os arquivos adicionados aparecem aqui





Para melhor organizar os arquivos, crie pastas no Content [(***projeto***)Content (Conent) //add //new folder]. Você pode criar uma pasta para IMAGENS, uma para SPRITES e uma para SONS e arrastar os arquivos importados às suas respectivas pastas.










5. Adicionando os arquivos importados ao jogo
Após importar os arquivos, você precisa agora mandar a engine carregar tais arquivos em seu jogo usando a função loadContent()

No escopo da classe crie uma lista de sprites




 List \Sprite/ s = new List\Sprite/()  
 //entre sinais de maior e menor - a formatação html do blogger não me permite adicionar tais símbolos  



Assim como Java, C# também tem a classe List e sua utilização é similar a Java.
Vamos usar "background_01.png" como imagem de fundo do jogo e "char_black.png" para representar o personagem. Use a função Add para carregar na lista tais imagens.

 s.Add(new Sprite("nomeUnico", Content.Load\Texture2D/("caminho\\do\\arquivoSemExtensao"), layer));  



O construtor da classe Sprite pede:
[*] Uma string "nomeUnico" para o arquivo adicionado. Como da para perceber, essa string deve ser única em todo o projeto;
[*] O caminho de Content.Load\Texture2D/("caminho\\do\\arquivoSemExtensao") é o caminho no Solution Explorer do arquivo da sprite a ser adicionada
[*] _layer_ é um valor float entre 0 e 1 que indica a posição da sprite quanto a profundidade da tela. 0 representa o fundo do seu monitor e 1 representa a tela do monitor;


Em nosso caso, para carregar o background e a sprite, usaríamos as seguintes linhas:

 s.Add(new Sprite("backg", Content.Load\Texture2D/("Imagens\\background_01"), 0));  
 s.Add(new Sprite("char1", Content.Load\Texture2D/("Sprites\\char_black"), 1));  



 Para fazer os arquivoas carregados no jogo aparecerem na tela use

 this.graphicsEng.addSprite(s[i])   



Onde:
[*] i representa o índice da lista. A engine acessará a posição s[i] e carregará qualquer arquivo que estiver lá.


Fique alerta a ordem de inserção dos itens na lista! Isto afeta o índice que você usará para fazer a chamada da engine e futuras alterações desses arquivos no jogo. Na ordem que inserimos, a chamada da engine seria feita da seguinte forma:

 this.graphicsEng.addSprite(s[0]); //adiciona o background  
 this.graphicsEng.addSprite(s[1]); //adiciona a sprite  



Se você não quiser memorizar quais são os índices que correspondem a cada arquivo, defina constantes no escopo da classe:

 public const int BACKGROUND = 0;  
 public const int CHAR1 = 1;  



E use - as como índice:

 this.graphicsEng.addSprite(s[BACKGROUND]); //adiciona o background  
 this.graphicsEng.addSprite(s[CHAR1]); //adiciona a sprite  


Neste tutorial, como usaremos poucos recursos gráficos, a definição de constantes é desprezível. Mas em jogos mais complexos, tais definições ajudam o programador a não se perder durante o processo de programação do jogo.
Agora o nosso código está desta forma:

1:   using System;  
2:  using System.Collections.Generic;  
3:  using System.Linq;  
4:  using Microsoft.Xna.Framework;  
5:  using Microsoft.Xna.Framework.Audio;  
6:  using Microsoft.Xna.Framework.Content;  
7:  using Microsoft.Xna.Framework.GamerServices;  
8:  using Microsoft.Xna.Framework.Graphics;  
9:  using Microsoft.Xna.Framework.Input;  
10:  using Microsoft.Xna.Framework.Media;  
11:  using Amarelo;  
12:  using Amarelo.GameEngine;  
13:  namespace testetutorial  
14:  {  
15:    ///  
16:    /// This is the main type for your game  
17:    ///  
18:    public class testetutorial : Amarelo.AmareloGame  
19:    {  
20:      public const int BACKGROUND = 0;  
21:      public const int CHAR1 = 1;  
22:      List s = new List(); //Cria uma lista de sprites  
23:      public testetutorial(GameConfig cg) : base(cg)  
24:      {  
25:        Content.RootDirectory = "Content";  
26:      }  
27:      ///  
28:      /// This is called when the game should draw itself.  
29:      ///  
30:      ///  
31:  Provides a snapshot of timing values.  
32:      protected override void Draw(GameTime gameTime)  
33:      {  
34:        GraphicsDevice.Clear(Color.CornflowerBlue);  
35:        // TODO: Add your drawing code here  
36:        base.Draw(gameTime);  
37:      }  
38:      protected override void initialize()  
39:      {  
40:        this.inputEngine.KeyPressed += tecla;  
41:        this.inputEngine.KeyReleased += teclaR;  
42:        //throw new NotImplementedException();  
43:      }  
44:      protected override void loadContent()  
45:      {  
46:        s.Add(new Sprite("backg", Content.Load("Imagens\\background_01"), 0)); //Carrega o background na lista  
47:        s.Add(new Sprite("char1", Content.Load("Sprites\\char_black"), 1)); //Carrega a sprite do personagem na lista  
48:        this.graphicsEng.addSprite(s[BACKGROUND]); //adiciona o background  
49:        this.graphicsEng.addSprite(s[CHAR1]); //adiciona a sprite  
50:      }  
51:      protected override void unloadContent()  
52:      {  
53:        //throw new NotImplementedException();  
54:      }  
55:      protected override void update(GameTime time)  
56:      {  
57:        //throw new NotImplementedException();  
58:      }  
59:    }  
60:  }  



Salve e teste
Agora essa é a nossa tela de jogo no momento: note que o seu personagem não vai cair em queda livre por enquanto. Ainda não colocamos a física do jogo, o que será feito mais adiante.






A seguir: captura de teclas de teclado