A classe MouseCamera extende de BaseCamera então nossa classe está assim:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
namespace Tutorial1.GameBase.Cameras
{
class MouseCamera : CameraBase
{
}
}
Como a classe MouseCamera extende de BaseCamera, que é publica, então nossa nova classe será publica sem precisar especificarmos.
Nossa classe precisa de uma variável para definir o quando ela está rodando para os lados e outra para cima e precisa tambem de 2 constantes, uma de velocidade da câmera e outra de velocidade de rotação.
float leftrightRot = MathHelper.PiOver2;
float updownRot = -MathHelper.Pi / 10.0f;
const float rotationSpeed = 0.3f;
const float moveSpeed = 3.0f;
Use o procedimento "Encapsulate Field" para as 4, as duas ultimas que são constantes não terão o método set{}, pois são constantes e esses valores não devem mudar.
Vamos agora criar o método construtor da nossa classe.
public MouseCamera(float aspectRatio)
: base()
{
SetLookAt(new Vector3(8.0f, 0.0f, 0.0f), Vector3.Zero, Vector3.Up);
SetPerspectiveFov(MathHelper.ToRadians(this.Fovy), aspectRatio, this.NearPlane, this.FarPlane);
}
Nós já passamos por essas linhas algumas vezes e já sabemos o que elas fazem, cria a posição de visão e tudo o que será visto. E pra finalizar vamos sobreescrever os métodos Update() e addcameraPosition(), usaremos "override" para sobreescrever.
public override void Update(GameTime gametime)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);
Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);
Vector3 cameraFinalTarget = Position + cameraRotatedTarget;
Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);
Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);
SetLookAt(new Vector3(Position.X, Position.Y, Position.Z), cameraFinalTarget, cameraRotatedUpVector);
base.Update(gametime);
}
E aqui novamente já sabemos o que cada linha faz. A primeira linha cria a rotação nos eixos X e Y e o restante das linhas atualizão a câmera. Agora o método addToCameraPositio()
public override void addToCameraPosition(Vector3 vectorToAdd)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);
Vector3 rotatedVector = Vector3.Transform(vectorToAdd, cameraRotation);
Position += moveSpeed * rotatedVector;
}
Esse método recebe um valor e atualiza a posição da câmera de acordo com o que é passado.
O código de Nossa Camêra fica assim:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
namespace Tutorial1.GameBase.Cameras
{
class MouseCamera : CameraBase
{
#region Variáveis
float leftrightRot = MathHelper.PiOver2;
float updownRot = -MathHelper.Pi / 10.0f;
const float rotationSpeed = 0.3f;
const float moveSpeed = 3.0f;
#endregion
#region Propriedades
public float LeftrightRot
{
get { return leftrightRot; }
set { leftrightRot = value; }
}
public float UpdownRot
{
get { return updownRot; }
set { updownRot = value; }
}
public float RotationSpeed
{
get { return rotationSpeed; }
}
public float MoveSpeed
{
get { return moveSpeed; }
}
#endregion
#region Método Construtor da Classe
public MouseCamera(float aspectRatio)
: base()
{
SetLookAt(new Vector3(8.0f, 0.0f, 0.0f), Vector3.Zero, Vector3.Up);
SetPerspectiveFov(MathHelper.ToRadians(this.Fovy), aspectRatio, this.NearPlane, this.FarPlane);
}
#endregion
#region Métodos Update e addToCameraPosition
public override void Update(GameTime gametime)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);
Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);
Vector3 cameraFinalTarget = Position + cameraRotatedTarget;
Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);
Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);
SetLookAt(new Vector3(Position.X, Position.Y, Position.Z), cameraFinalTarget, cameraRotatedUpVector);
base.Update(gametime);
}
public override void addToCameraPosition(Vector3 vectorToAdd)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);
Vector3 rotatedVector = Vector3.Transform(vectorToAdd, cameraRotation);
Position += moveSpeed * rotatedVector;
}
#endregion
}
}
Nenhum comentário:
Postar um comentário