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.
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