Código final:
public class Et
{
///
/// Textura do Et
///
public Texture2D Textura;
///
/// posicao do Et na tela
///
public Vector2 Posicao;
///
/// Angulo de inclinacao do et em graus
///
private float angulo;
///
/// Este campo indica a Inclinacao do Et
/// sendo utilizado no metodo Draw, e sera
/// modificado apenas dentro da Propriedade Angulo
///
private float rotacao;
///
/// Direcao a qual o Et aponta, esse vetor, esse
/// Vetor sempre estará normalizado, tendo como comprimento,
/// tamanho, intensidade, etc, o valor 1
///
private Vector2 direcao;
public Vector2 Direcao
{
get { return this.direcao; }
}
///
/// A Rotacao do Et sera modificada apenas
/// por meio dessa propriedade, é aqui, também, aonde
/// será obtido a direcao do Et mediante ao angulo
///
public float Angulo
{
get { return this.angulo; }
set
{
this.angulo = value;
if (angulo < 0)
{
this.angulo = 360;
}
else if (angulo > 360)
{
this.angulo = 0;
}
// o campo angulo nesse momento estará entre 0 e 360
// entao, será necessario armazenar o seu valor
// em radianos, para ser utilizado no metodo draw
this.rotacao = MathHelper.ToRadians(angulo);
/*
* os metodos Math.Cos e Math.Sin recebem como parametro
* o angulo estando em radianos
* */
this.direcao.X = (float)Math.Cos(rotacao);
this.direcao.Y = (float)Math.Sin(rotacao);
}
}
public Missel Missel;
public void Atacar()
{
this.Missel.Direcao = this.direcao;
this.Missel.Posicao = this.Posicao;
this.Missel.Rotacao = this.rotacao;
}
public Et()
{
this.rotacao = 0;
this.Missel = new Missel();
this.direcao = new Vector2(1, 0);
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(
this.Textura, this.Posicao, null, Color.White,
this.rotacao, new Vector2(0, 0),
1f, SpriteEffects.None, 0);
}
}
public class Missel
{
///
/// Textura do Missel
///
public Texture2D Textura;
///
/// Posicao do Missel na Tela
///
public Vector2 Posicao;
///
/// Direcao a qual o Missel aponta, esse vetor, esse
/// Vetor sempre estará normalizado, tendo como comprimento,
/// tamanho, intensidade, etc, o valor 1
///
public Vector2 Direcao;
///
/// Este campo indica a Inclinacao do missel
/// sendo utilizado no metodo Draw, e sera
/// modificado apenas dentro da Propriedade Angulo
///
public float Rotacao;
public Missel()
{
this.Rotacao = 0;
this.Direcao = new Vector2(1, 0);
}
public void Update(GameTime gameTime)
{
this.Posicao +=
Vector2.Multiply(this.Direcao, 2);
}
public void Draw(SpriteBatch _spriteBatch)
{
_spriteBatch.Draw(
this.Textura, this.Posicao, null, Color.White,
this.Rotacao, Vector2.Zero, Vector2.One,
SpriteEffects.None, 0);
}
}
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Et et;
. . .
protected override void Initialize()
{
this.et = new Et();
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
this.et.Textura = this.Content.Load<Texture2D>("Et");
this.et.Missel.Textura =
this.Content.Load<Texture2D>("Missile");
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
KeyboardState kb = Keyboard.GetState();
if (kb.IsKeyDown(Keys.Space))
{
this.et.Atacar();
}
if (kb.IsKeyDown(Keys.Right))
{
this.et.Posicao +=
Vector2.Multiply(et.Direcao,
5);
}
if (kb.IsKeyDown(Keys.Left))
{
this.et.Posicao -=
Vector2.Multiply(et.Direcao,
5);
}
if (kb.IsKeyDown(Keys.Up))
{
this.et.Angulo += 1;
}
if (kb.IsKeyDown(Keys.Down))
{
this.et.Angulo -= 1;
}
this.et.Missel.Update(gameTime);
base.Update(gameTime);
}
. . .
}
Algumas fotos do Prototipo:
Prototipo para download:
anguloevetordiretor.zip 55062 bytes
Críticas, Dúvidas e Sugestões sao bem-vindas.
Obrigado!