Programação de jogos com XNA em C# - Acompanhamento 2D → ângulo entre vetores

O programa abaixo é uma versão XNA do exemplo Acompanhamento.


SpriteBatch → criar um sprite.

Content.Load<Texture2D> → carregar uma textura pruma variável.

Content.Load<SpriteFont> → carregar uma fonte pruma variável.

Draw → desenhar um sprite no buffer gráfico. Dependendo dos parâmetros é usado pra desenhá-lo já rotacionado.

DrawString → desenhar uma string no buffer gráfico.



Programa.cs
namespace Acompanhamento

{
  static class TPrograma

  {
    static void Main (string[] args)

    {
      using (TAcompanhamento Jogo= new TAcompanhamento ())
        Jogo.Run ();
    }
  }
}


Principal.cs
namespace Acompanhamento

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

  {
    protected bool                  Atirou;
    protected double                Decorrido, Tempo;
    protected float                 Angulo;
    protected GraphicsDeviceManager Dispositivo;
    protected int                   TiroInc;
    protected MouseState            Dispositivo_Ponteiro;
    protected SpriteBatch           Titulo, UFO, UFOTiro;
    protected SpriteFont            TituloFonte;
    protected Texture2D             UFOTextura, UFOTiroTextura;
    protected Vector2               Destino, Direcao, Olhando, Origem, OrigemTiro, Posicao, TituloPosicao;
    protected Viewport              Dispositivo_VP;
    public TAcompanhamento_Base ()

    {
      Dispositivo          = new GraphicsDeviceManager (this);
      Content.RootDirectory= "Content";
    }
    protected override void Initialize ()

    {
      base.Initialize ();
      this.IsMouseVisible= true;
      Atirou             = false;
      Decorrido          = 0.0f;
      Destino            = new Vector2 (0, 0);
      Direcao            = new Vector2 (0, 0);
    }
    protected override void LoadContent ()

    {
      Dispositivo_VP= Dispositivo.GraphicsDevice.Viewport;
      UFO           = new SpriteBatch (GraphicsDevice);
      UFOTiro       = new SpriteBatch (GraphicsDevice);
      Titulo        = new SpriteBatch (GraphicsDevice);
      TituloFonte   = Content.Load<SpriteFont> ("Courier New");
      UFOTextura    = Content.Load<Texture2D> (@"objeto\ufo");
      UFOTiroTextura= Content.Load<Texture2D> (@"objeto\ufotiro");
      TituloPosicao = new Vector2 (0, 0);
      Posicao       = new Vector2 (Dispositivo_VP.Width/2, Dispositivo_VP.Height/2);
      Origem        = new Vector2 (UFOTextura.Width/2, UFOTextura.Height/2);
      Olhando       = new Vector2 (Posicao.X, Dispositivo_VP.Height-1);
      OrigemTiro    = new Vector2 (Olhando.X-UFOTiroTextura.Width/2, Posicao.Y-UFOTiroTextura.Height/2);
    }
    protected override void Update (GameTime AGT)

    {
      if (GamePad.GetState (PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit ();

      Tempo              += AGT.ElapsedGameTime.TotalMilliseconds;
      Dispositivo_Ponteiro= Mouse.GetState ();

      base.Update (AGT);
    }
    protected override void Draw (GameTime AGT)

    {
      Dispositivo.GraphicsDevice.Clear (Color.Black);

      Disparar_AoDesenhar ();

      base.Draw (AGT);
    }
    protected virtual void Disparar_AoDesenhar ()

    {
    }
  }
}


Maquina.cs
namespace Acompanhamento

{
  class TAcompanhamento: TAcompanhamento_Base

  {
    protected override void Disparar_AoDesenhar ()

    {
      Destino.X= Dispositivo_Ponteiro.X;
      Destino.Y= Dispositivo_Ponteiro.Y;
      Angulo   = OlharPara (Posicao, Olhando, Destino);

      MostrarTitulo ();
      MostrarUFO ();
      MostrarTiro ();
    }
    protected virtual void MostrarTiro ()

    {
      Vector2 P;

      if (Atirou) {
        P       = new Vector2 (OrigemTiro.X + Direcao.X*TiroInc, OrigemTiro.Y + Direcao.Y*TiroInc);
        TiroInc+= 10;

        UFOTiro.Begin (SpriteBlendMode.Additive);
        UFOTiro.Draw (UFOTiroTextura, P, Color.White);
        UFOTiro.End ();

        if ((P.X < 0) || (P.X > Dispositivo_VP.Width) || (P.Y < 0) || (P.Y > Dispositivo_VP.Height))
          Atirou= false;
      }
      else if (Tempo - Decorrido >= 500.0f) {
        TiroInc  = 0;
        Atirou   = true;
        Decorrido= Tempo;
        Direcao  = Destino-Posicao;
        Direcao.Normalize ();
      }
    }
    protected virtual void MostrarTitulo ()

    {
      string TituloTexto;

      TituloTexto= "Ponteiro (" + Destino.X.ToString () + ", " + Destino.Y.ToString () + ") " + 
                   Math.Truncate (MathHelper.ToDegrees (Angulo)).ToString () + " graus";

      Titulo.Begin ();
      Titulo.DrawString (TituloFonte, TituloTexto, TituloPosicao, Color.LightGreen);
      Titulo.End ();
    }
    protected virtual void MostrarUFO ()

    {
      UFO.Begin (SpriteBlendMode.Additive);
      UFO.Draw (UFOTextura, Posicao, null, Color.White, Angulo, Origem, 1.0f, SpriteEffects.None, 0.0f);
      UFO.End ();
    }
    protected virtual float OlharPara (Vector2 APosicao, Vector2 APosicaoOlhando, Vector2 APosicaoDesejada)

    {
      Vector2 Direcao, Origem;

      Origem = APosicaoOlhando-APosicao;
      Direcao= APosicaoDesejada-APosicao;

      // Ângulo entre vetores
      return (float) (Math.Atan2 (Direcao.Y, Direcao.X) - Math.Atan2 (Origem.Y, Origem.X));
    }
  }
}



Clique aqui pra baixar o código (22,9 Ko)





http://transeberiano.brinkster.net