Envie Artigos e Concorra a Prêmios
 
Artigos
Article List
Desenhando texto centralizado no XNA
aprenda a centralizar textos de seu jogo XNA em relação a um ponto específico da tela
Enviado por André Furtado em 9/10/2007 1:46:56

 

  centeredfont.zip 44206 bytes

O cenário é simples: você quer desenhar um texto no meio da tela.

Vamos supor que:

·       ÂVocê já sabe desenhar textos com fontes no XNA (caso não, leia o artigo do Shinji sobre isso e volte para cá depois)

·       ÂVocê adicionou uma spritefont ao seu jogo chamada, por exemplo, Arial.

·       ÂVocê já carregou um objeto SpriteFont e SpriteBatch para o desenho, como mostra o código abaixo:

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

      Â

 ÂSpriteBatch spriteBatch;

 ÂSpriteFont arialFont;

    Â

 Â...

 

 Âprotected override void LoadGraphicsContent(bool loadAllContent) {

    ÂspriteBatch = new SpriteBatch(graphics.GraphicsDevice);

    ÂarialFont = content.Load<SpriteFont>("Arial");

 Â}

 

 Â...

}

 

Qual o código a ser inserido no método Draw do seu jogo para desenhar um texto no meio da tela? O primeiro passo é descobrir o ponto central da tela: basta obter a largura e altura do viewport de desenho e dividir cada um deles por 2:

protected override void Draw(GameTime gameTime) {

 Âfloat posX = graphics.GraphicsDevice.Viewport.Width / 2;

 Âfloat posY = graphics.GraphicsDevice.Viewport.Height / 2;

 ÂVector2 position = new Vector2(posX, posY);
 Â...
}

Entretanto, o ponto position acima representa o começo do desenho (canto superior esquerdo do mesmo) . Fazer o desenho passando esse ponto como parâmetro não causará o efeito de centralização desejado:

protected override void Draw(GameTime gameTime) {

 Â...

 Âstring text = "Text to be centralized";

 Âgraphics.GraphicsDevice.Clear(Color.CornflowerBlue);

 ÂspriteBatch.Begin();

 ÂspriteBatch.DrawString(arialFont, text, position, Color.White);

 ÂspriteBatch.End();

 Âbase.Draw(gameTime);

}

 

 


Está claro que deveríamos ter começado a desenhar o texto em uma posição mais à esquerda. O problema é: o quanto mais a esquerda? Através de tentativa e erro, você poderia chegar a uma posição fixa, hard-coded, que fosse satisfatória. Porém, se considerarmos que o texto a ser desenhado pode mudar, teremos um problema e tanto.

A solução para isso está no método MeasureString, da classe SpriteFont. Esse método recebe um texto como parâmetro e retorna, em uma estrutura Vector2, a largura e altura desse texto nessa fonte.

Vector2 textSize = arialFont.MeasureString(text);

De posse dessa informação, basta agora recuar a posição inicial de desenho (position) pela metade da largura e metade da altura do texto a ser desenhado. Isso fará com que o meio do texto seja o meio do ponto desejado (que no nosso caso, é o ponto central da tela do jogo).

position.X -= textSize.X / 2;

position.Y -= textSize.Y / 2;

Confira o código completo abaixo:

protected override void Draw(GameTime gameTime) {

 Âfloat posX = graphics.GraphicsDevice.Viewport.Width / 2;

 Âfloat posY = graphics.GraphicsDevice.Viewport.Height / 2;

 ÂVector2 position = new Vector2(posX, posY);

 

 Âstring text = "Text to be centralized";

 ÂVector2 textSize = arialFont.MeasureString(text);

 Âposition.X -= textSize.X / 2;

 Âposition.Y -= textSize.Y / 2;

 

 Âgraphics.GraphicsDevice.Clear(Color.CornflowerBlue);

 ÂspriteBatch.Begin();

 ÂspriteBatch.DrawString(arialFont, text, position, Color.White);

 ÂspriteBatch.End();

 Âbase.Draw(gameTime);

}

E, por fim, o texto centralizado, como desejado:

 
Alterando o texto, o mesmo continua sendo desenhado de maneira centralizada:
 


É importante ressaltar que estamos desenhando o texto centralizado em relação ao centro da tela. Entretanto, o texto poderia estar centralizado em relação a qualquer outro ponto especificado por você através das coordenadas posX e posY do código acima.

Jogar bem!

[]s
-- AFurtado
http://afurtado1980.spaces.live.com


Sobre o Autor

???
Não Definido
Não Definido
Ocorreu um erro.
Ocorreu um erro.


Clique para avaliar:

Comentários
" Obrigado, AFurtado, pelo link. Muito bom."
Enviado por lucianoJose em 10/10/2007 11:04:02:
 
" Obrigado, Luciano. Tempo pra que te quero, enquanto o artigo de colisão não vem você pode conferir alguns tutoriais de colisão no link http://creators.xna.com/Education/Tutorials.aspx"
Enviado por AFurtado em 10/10/2007 8:52:20:
 
" Muito legal. AFurtado, vc vai fazer o artigo sobre colisão em XNA?"
Enviado por lucianoJose em 9/10/2007 22:00:53:
 
" Muito bom André! continue assim."
Enviado por leo em 9/10/2007 11:36:13:
 

Adicione seu Comentário
PrêmiosMinimizar

Envie um artigo para o Sharpgames e concorra a prêmios! Clique aqui e saiba mais.

AdSense

Amazon

Logos do XBox 360, XNA e Games For Windows
Copyright 2008 por SharpgamesPolítica de Privacidade  |  Termos de Uso