Buscar en bzk Gaming

Cargando...
miércoles 27 de octubre de 2010
Mas sobre XNA en bzk Gaming en la seccion de XNA crea tus propis videojuegos

Hola, bienvenidos sean de nuevo a este tutorial de XNA en 3D, lo que vamos hacer hoy es probar como introducir datos desde teclado y ratón a un juego en XNA. Para esto crearemos un nuevo proyecto, vamos a Visual Studio y de ahí Archivo->Nuevo->Proyecto->Visual C#->XNA Game Studio X.X (dependiendo de la versión, para este ejemplo usare la 3.0) y escogemos Windows Game, de nombre le pondré InputTecladoRaton, no muy original pero servirá para reconocerlo.




Antes de comenzar con el código debemos de saber que todo trabajo que tenga que hacerse con el teclado se va hacer con la clase Keyboard es muy fácil su uso ya que solo tiene un método propio, todos los demás son heredados de Object, nosotros usaremos el método GetState() que es un método estático que devuelve el estado actual de nuestro teclado, debemos usar la estructura KeyboardState para asignar o verificar los estados de nuestro teclado ya que posee métodos que nos ayudan a verificar que tecla esta presionada o no.

Como estándar se utilizan las teclas WASD para describir arriba, izquierda, abajo y derecha respectivamente, ya que utilizar las flechas de dirección complica el uso del ratón, por su cercanía.

Al igual que nuestro teclado nuestro ratón posee las mismas características, ya que la clase Mouse, tiene un método GetState() que nos devuelve el estado actual del ratón y la estructura MouseState donde que representa el estado del ratón, a diferencia del teclado el ratón tiene una posición en X y Y que nos representan su posición en pantalla, y además puede indicarnos el uso de la rueda de desplazamiento del ratón.

Para ver las estructuras y clases sigan estos vínculos hasta la referencia en MSDN

Keyboard

KeyboardState

Mouse

MouseState

Teniendo esto en cuanta volvamos a nuestro proyecto recién creado y lo primero que vamos a hacer es sustituir este código :



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

En el método Update() por el siguiente:

if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                this.Exit();

Así que ejecutaremos el proyecto y comprobaremos que cuando presionamos escape se cierre la ventana.

Ahora haremos nuevas pruebas para esto declararemos una variable de clase de tipo color y la iniciaremos con Aqua:

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//juesto despues
Color micolor = Color.Aqua; 

En el metodo Draw la instruccion:


GraphicsDevice.Clear(Color.CornflowerBlue);

La cambiaremos por

GraphicsDevice.Clear(micolor); 

Esto hará que se dibuje según el color que queramos, asi que en el método Update agregaremos este código:

//recuperamos estado del teclado
KeyboardState eTeclado = Keyboard.GetState();
if (eTeclado.IsKeyDown(Keys.A))
        micolor = Color.Aqua;//cambio de color
if(eTeclado.IsKeyDown(Keys.B))
        micolor=Color.Black;//cambio de color
if(eTeclado.IsKeyDown(Keys.C))
        micolor=Color.Crimson;//cambio de color

Con esto lograremos cambiar el color de nuestra pantalla según la tecla que presionamos.


Pero hay que recordar que ciertas acciones en un juego están prohibidas como el hecho que presionemos el botón de caminar hacia adelante y caminar hacia atrás al mismo tiempo, pasara algo extraño si no tenemos en cuenta esto. Así que podemos modificar nuestro código para que le digamos que cambie de color solo cuando una solo tecla esta presionada.

if (eTeclado.IsKeyDown(Keys.A) && eTeclado.IsKeyUp(Keys.B) 
    && eTeclado.IsKeyUp(Keys.C))
                micolor = Color.Aqua;//cambio de color
if (eTeclado.IsKeyDown(Keys.B) && !eTeclado.IsKeyDown(Keys.A)
    && !eTeclado.IsKeyDown(Keys.C))
                micolor=Color.Black;//cambio de color
if (eTeclado.IsKeyDown(Keys.C) && !eTeclado.IsKeyDown(Keys.A)
    && eTeclado.IsKeyUp(Keys.B))
                micolor=Color.Crimson;//cambio de color


 
Fíjense que la lógica que use en cada una es diferente, en A decimos: si A esta presionada y B esta suelta y C esta suelta. En B decimos: si B está presionado y A no está presionado y C no está presionado. En C decimos: si C está presionado y A no está presionado y B esta suelta. Claro que esto lo podemos hacer como nosotros queramos es por ello que se los muestro de esta manera.


Ya que terminamos con el teclado, ahora veremos cómo funciona el ratón, ya que el uso de los botones de ratón es el mismo que el de nuestro teclado, a diferencia que tenemos un método para cada botón: izquierdo y derecho, y por tanto no necesitamos pasarle ningún argumento.

Bien se me ocurre que haremos algo divertido con los colores, en XNA la estructura color tiene varias enumeraciones como ya vimos, ese azul pálido, el carmesí y el rojo. Pero el color también se puede hacer con los parámetros del RGB ósea rojo, verde y azul. Así que modificaremos esos parámetros en nuestro color en relación con la, posición de ratón para esto agregaremos dos variables a nivel de clase

MouseState edoActual;
MouseState edoPasado;

 
Estas no ayudaran a verificar si se desplazó hacia un lado o hacia el otro, ahora en el método Initialize() agregaremos


edoPasado = Mouse.GetState();

y en el método Update()

//recuperamos estado del mouse
edoActual = Mouse.GetState();
if (edoActual.X > edoPasado.X)
                micolor.R++;
if (edoActual.X < edoPasado.X)
                micolor.R--;
edoPasado = edoActual;

Si ejecutamos nos daremos cuenta de que los colores van cambiando según movamos el mouse, peo por que limitarnos a cambiar el rojo y podemos hacerlo a los tres, pero para esto incluiremos condiciones, para cambiar el Azul debemos presionar el botón izquierdo del ratón, para el Verde el derecho y para el rojo que el botón e en medio este presionado. Por lo que nuestro código quedaría más o menos así.


//recuperamos estado del mouse
edoActual = Mouse.GetState();
//condicion para rojo
if (edoActual.MiddleButton == ButtonState.Pressed)
{
if (edoActual.X > edoPasado.X)
      micolor.R++;
if (edoActual.X < edoPasado.X)
      micolor.R--;
            }
//condicion para azul
if (edoActual.LeftButton == ButtonState.Pressed)
{
        if (edoActual.X > edoPasado.X)
               micolor.B++;
        if (edoActual.X < edoPasado.X)
               micolor.B?
}
//condicion para verde
if (edoActual.RightButton == ButtonState.Pressed)
{
        if (edoActual.X > edoPasado.X)
               micolor.G++;
        if (edoActual.X < edoPasado.X)
               micolor.G--;
}            
edoPasado = edoActual;
Aquí tienen un video de cómo se debería ver. Espero que les haya gustado el tutorial y no olviden comentar.



Hasta la próxima

1 comentarios:

Anónimo dijo...

gracias por el post, me ayudo a comprender muy bien lo de las ordenes de mando en xna^^

Entradas populares en este Mes

Entradas populares Siempre

Comparte este Blog

Subscribe via email

Enter your email address:

Delivered by FeedBurner

Seguidores

FeedBurner FeedCount