Arquivos

Arquivo para a categoria ‘Componentes’

[XNA] Componente Barra de Energia para seu jogo

Este tutorial foi movido para o site Ponto V.

Link para o tutorial clique aqui.

Abraços a todos!

[XNA] Componente Cronometro para seu jogo

Olá a todos, quando comecei a montar jogos sempre queria colocar algum cronometro para contar o tempo de jogo. Apesar de usarmos o XNA acabamos sempre tendo uma ou outra dúvida e no final não fazemos o cronometro. Então para você não se preocupar mais com isso, criei um componente chamado Chronometer que pode ser adicionado a qualquer jogo que possa fazer.

Segue código do cronometro:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
/// <summary>
/// Component cronometro para o seu jogo
/// </summary>
public class Chronometer : DrawableGameComponent
{
   #region Fields
   // Posição de centro do cronometro
   private Vector2 position;
   // Font para escrever o tempo
   private SpriteFont font;
   // Cor da font do tempo
   private Color color;
   // Tempo inicial
   private TimeSpan startTime;
   // Tempo final
   private TimeSpan finalTime;
   // Tempo total de execução do jogo
   private TimeSpan totalTime;
   // Tempo total do cronometro
   private TimeSpan time;
   // Variavel booleana do tempo, indica se esta parado ou não
   private bool stopped;
   // SpriteBatch para desenhar
   private SpriteBatch sBatch;
   #endregion

   #region Constructor
   /// <summary>
   /// Construtor do Cronometro
   /// </summary>
   /// <param name="game">Referência para o jogo que o chamou</param>
   /// <param name="centerPosition">Posicao do centro do texto</param>
   /// <param name="font">Font carregada</param>
   /// <param name="color">Cor da font</param>
   public Chronometer(Game game, Vector2 centerPosition, SpriteFont font, Color color)
      : base(game)
   {
      this.game = game;
      this.position = centerPosition;
      this.font = font;
      this.color = color;
      this.startTime = new TimeSpan();
      this.finalTime = new TimeSpan();
      this.totalTime = new TimeSpan();
      this.time = new TimeSpan();
      this.stopped = true;
      // Tenta receber a sprite batch do serviço caso esteja disponível
      sBatch = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));
      if (sBatch == null)
      {
         // Se o usuario não adicionou a sprite batch no serviço então criamos uma nova instância de sprite batch
         sBatch = new SpriteBatch(((GraphicsDeviceManager)Game.Services.GetService(typeof(IGraphicsDeviceManager))).GraphicsDevice);
      }
   }
   #endregion

   #region Update
   public override void Update(GameTime gameTime)
   {
      // Recebe o tempo passado do jogo
      this.totalTime += gameTime.ElapsedGameTime;
      if (!stopped) // Se o cronometro não esta parado, então somo o tempo
         this.finalTime += gameTime.ElapsedGameTime;
      // Atualiza o tempo do cronometro
      this.time = finalTime - startTime;
      base.Update(gameTime);
   }
   #endregion

   #region Draw
   public override void Draw(GameTime gameTime)
   {
      // Recebe o tamanho da escrita para calcular o centro
      Vector2 size = font.MeasureString(ToString());
      sBatch.Begin(SpriteBlendMode.AlphaBlend);
      // Escreve o cronometro no centro conforme a posição indicada no construtor
      sBatch.DrawString(font, ToString(), position - size / 2 , color);
      sBatch.End();
      base.Draw(gameTime);
   }
   #endregion

   #region Methods
   /// <summary>
   /// Inicia o cronometro, ou se estiver parado continua a contagem
   /// </summary>
   public void Start()
   {
      this.stopped = false;
      if (startTime == TimeSpan.Zero)
      {
         this.startTime = totalTime;
         this.finalTime = totalTime;
         this.time = new TimeSpan();
      }
   }
   /// <summary>
   /// Pausa o cronometro
   /// </summary>
   public void Stop()
   {
      this.stopped = true;
   }
   /// <summary>
   /// Reinicia a contagem do cronometro
   /// </summary>
   public void Restart()
   {
      this.stopped = false;
      this.startTime = totalTime;
      this.finalTime = totalTime;
      this.time = new TimeSpan();
   }
   /// <summary>
   /// Zera a contagem do cronometro
   /// </summary>
   public void Reset()
   {
       this.stopped = true;
       this.startTime = totalTime;
       this.finalTime = totalTime;
       this.time = new TimeSpan();
    }
    /// <summary>
    /// Método para tranformar o TimeSpan em String
    /// </summary>
    /// <returns>retorna o tempo em string</returns>
    public string ToString()
    {
       return time.ToString().Substring(0, 8);
    }
    #endregion
    #region Properties
    /// <summary>
    /// Posição central do cronometro
    /// </summary>
    public Vector2 Position
    {
       get { return this.position; }
       set { this.position = value; }
    }
    /// <summary>
    /// Tempo do cronometro
    /// </summary>
    public TimeSpan Time
    {
       get { return this.time; }
       set { this.time = value; }
    }
    #endregion
}

Modificações [02/02/2010]

  • Foi retirado a variável game da classe, por falta de utilidade.
  • Foi modificado a variável stoped pelo erro, o correto é stopped (2 ps)
  • Foi criado uma variável para armazenar a sprite batch
  • o construtor agora tenta receber a sprite batch de services caso não consiga ele cria uma instância nova de Spritebatch para o objeto.
  • Foi retirado do método Draw o recebimento do sprite batch, pois agora é executado uma unica vez durante a construção do objeto.

Para usar o componente em seu jogo:

  1. Inclua o arquivo Chronometer.cs junto com suas outras classes de seu jogo
  2. Declare em seu jogo um objeto do tipo Chronometer, Ex: Chronometer chronometer.
  3. Inicialize o objeto passando como parametros (Game game, Vector2 centerPosition, SpriteFont font, Color color)
  4. Adicione ele na sua coleção de componentes, Ex: Components.Add(chronometer);
  5. Pronto seu componente cronometro já esta funcionando em seu jogo, agora é só usar os métodos Start, Stop, Reset ou Restart para ter controle do cronometro.

Para fazer download de um exemplo usando o componente clique aqui.

Se você já sabe com usar clique aqui e abaixo só o componente.

Abraços, espero que seja util para vocês.

[XNA] Componente para calcular o FPS do seu jogo

Este tutorial foi movido para o site Ponto V.

Link para o tutorial: http://tinyurl.com/4hqqra2

 

 

Abraços a todo!

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 29 other followers