terça-feira, 26 de julho de 2011

XNA 4.0 - Imput de teclado e de Controle do XBOX

Tutorialzinho básico sobre Imputs. No meu exemplo vou fazer com que o nosso mundo gire para a esquerda ou para a direita de acordo com a tecla que é pressionada.

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(vertices);

//Preenche o indexBuffer com os indices
indexBuffer = new IndexBuffer(Game.GraphicsDevice, IndexElementSize.SixteenBits, 20 * sizeof(int), BufferUsage.WriteOnly);
indexBuffer.SetData(indices);

//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