Vamos abrir o arquivo "Terrain.cs" e adicionar o seguinte método depois do método Draw().
public void addRotation(float amount)
{
effect.World *= Matrix.CreateRotationY(amount);
}
Esse método recebe um argumento, "amount", que será a velocidade em que o eixo Y ratacionará, caso esteja confiante você pode mudar a "Matrix.CreateRotationY" para qualquer tipo de rotação que você queira.
Agora no Arquivo "Game1.cs", vá até o método Update() e adicione o seguinte código antes de base.Update();
//Pega o estado das teclas de nosso teclado de do pad do XBOX 360
KeyboardState keyState = Keyboard.GetState();
GamePadState padState = GamePad.GetState(PlayerIndex.One);
//Se a Tecla Right ou o botão RigthTrigger estiverem pressionadas então ordenaremos ao objeto
//terrain executar o metodo addRotation e passamos um valor como argumento
if(keyState.IsKeyDown(Keys.Right) || padState.IsButtonDown(Buttons.RightTrigger))
terrain.addRotation(-0.01f);
//O mesmo de cima mas agora para a esquerda
if (keyState.IsKeyDown(Keys.Left) || padState.IsButtonDown(Buttons.LeftShoulder))
terrain.addRotation(0.01f);
As linhas estão comentadas e o que elas fazem são bem intuitivas, "EstadoDaTecla.EstaPressionada(Tecla.Direita)". "||" seguinifica "ou"´, se a tecla está pressionada ou se um botão está pressionado.
Você pode alterar o "0.01f" que passamos como parametro para qualquer outro valos, diminuindo ou aumentando a velocidade de giro.
A classe Terrain atual:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Tutorial1.GameBase.Shapes
{
class Terrain : DrawableGameComponent
{
//Variaveis de Renderização
VertexBuffer vertexBuffer;
IndexBuffer indexBuffer;
BasicEffect effect;
public Terrain(Game game)
: base(game)
{
}
public void Load()
{
//Cria o efeito que será usado para desenhar os eixos
effect = new BasicEffect(Game.GraphicsDevice);
//Aspect Ratio da nossa janela Largura/Altura
float aspectRatio = (float)Game.GraphicsDevice.Viewport.Width / (float)Game.GraphicsDevice.Viewport.Height;
//Tamanho dos eixos 3D
float axisLenght = 2f;
//Numero de Vertices Usados
int vertexCount = 22;
//Os indices de nossas linhas
int[] indices = new int[6];
//Nossa declaração de Vertex
VertexDeclaration decl = new VertexDeclaration(VertexPositionColor.VertexDeclaration.GetVertexElements());
//Criando os nossos vertices
VertexPositionColor[] vertices = new VertexPositionColor[vertexCount];
//Vamos preencher nossos vertices e nossos indices
//Eixo x
vertices[0] = new VertexPositionColor(new Vector3(-axisLenght, 0.0f, 0.0f), Color.White);
vertices[1] = new VertexPositionColor(new Vector3(axisLenght, 0.0f, 0.0f), Color.White);
indices[0] = 0;
indices[1] = 1;
//Eixo y
vertices[2] = new VertexPositionColor(new Vector3(0.0f, -axisLenght, 0.0f), Color.Red);
vertices[3] = new VertexPositionColor(new Vector3(0.0f, axisLenght, 0.0f), Color.Red);
indices[2] = 2;
indices[3] = 3;
//Eixo z
vertices[4] = new VertexPositionColor(new Vector3(0.0f, 0.0f, -axisLenght), Color.White);
vertices[5] = new VertexPositionColor(new Vector3(0.0f, 0.0f, axisLenght), Color.White);
indices[4] = 4;
indices[5] = 5;
//Mais grades X
vertices[6] = new VertexPositionColor(new Vector3(-axisLenght, 0.0f, -2.0f), Color.White);
vertices[7] = new VertexPositionColor(new Vector3(axisLenght, 0.0f, -2.0f), Color.White);
vertices[8] = new VertexPositionColor(new Vector3(-axisLenght, 0.0f, -1.0f), Color.White);
vertices[9] = new VertexPositionColor(new Vector3(axisLenght, 0.0f, -1.0f), Color.White);
vertices[10] = new VertexPositionColor(new Vector3(-axisLenght, 0.0f, 1.0f), Color.White);
vertices[11] = new VertexPositionColor(new Vector3(axisLenght, 0.0f, 1.0f), Color.White);
vertices[12] = new VertexPositionColor(new Vector3(-axisLenght, 0.0f, 2.0f), Color.White);
vertices[13] = new VertexPositionColor(new Vector3(axisLenght, 0.0f, 2.0f), Color.White);
//Mais grades Y
vertices[14] = new VertexPositionColor(new Vector3(-2.0f, 0.0f, -axisLenght), Color.White);
vertices[15] = new VertexPositionColor(new Vector3(-2.0f, 0.0f, axisLenght), Color.White);
vertices[16] = new VertexPositionColor(new Vector3(-1.0f, 0.0f, -axisLenght), Color.White);
vertices[17] = new VertexPositionColor(new Vector3(-1.0f, 0.0f, axisLenght), Color.White);
vertices[18] = new VertexPositionColor(new Vector3(1.0f, 0.0f, -axisLenght), Color.White);
vertices[19] = new VertexPositionColor(new Vector3(1.0f, 0.0f, axisLenght), Color.White);
vertices[20] = new VertexPositionColor(new Vector3(2.0f, 0.0f, -axisLenght), Color.White);
vertices[21] = new VertexPositionColor(new Vector3(2.0f, 0.0f, axisLenght), Color.White);
//Preencher o vertexBuffer com os vértices
vertexBuffer = new VertexBuffer(Game.GraphicsDevice, decl, vertexCount, BufferUsage.WriteOnly);
vertexBuffer.SetData
//Preenche o indexBuffer com os indices
indexBuffer = new IndexBuffer(Game.GraphicsDevice, IndexElementSize.SixteenBits, 20 * sizeof(int), BufferUsage.WriteOnly);
indexBuffer.SetData
//Criamos nossa câmera, com posição, alvo e indicando para câmera onde fica o "pra cima"
effect.View = Matrix.CreateLookAt(new Vector3(5.0f, 5.0f, 5.0f), Vector3.Zero, Vector3.Up);
//Criamos a nossa Projeção, com aspectRatio, nearPlane e farPlane
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 15.0f);
effect.VertexColorEnabled = true;
}
public override void Draw(GameTime gameTime)
{
//Adicionamos o nossos indices e vertices ao nosso dispositivso para desenhar
Game.GraphicsDevice.SetVertexBuffer(vertexBuffer);
Game.GraphicsDevice.Indices = indexBuffer;
//Essa linha procura por todos os efeitos que vamos aplicar aos eixos
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
//Adiciona e aplica o efeito
pass.Apply();
//Desenha a lista de linhas
Game.GraphicsDevice.DrawPrimitives(PrimitiveType.LineList, 0, 50);
}
base.Draw(gameTime);
}
public void addRotation(float amount)
{
effect.World *= Matrix.CreateRotationY(amount);
}
}
}
Nenhum comentário:
Postar um comentário