Capturar teclado XNA – Texto multilínea


El siguiente tutorial puede ser útil para los que desarrollen juegos donde se le pide al usuario ingresar un texto, voy a mostrar un método donde podemos capturar y mostrar en pantalla lo que escriba el usuario (algunas teclas, ya que dependiendo del teclado, algunas teclas cambian).

Los pasos son:

1. Agregar el SpriteFont al proyecto.

2. Cambiar los caracteres iniciales y finales que se pueden mostrar en el SpriteFont:

3. Declarar una variable StringBuilder que será el que tendrá todo el texto que escriba el usuario y otra de tipo KeyboardState que guardará el último estado del teclado para que solo se muestre una letra o carácter al presionar la tecla una sola vez:

KeyboardState oldKeyState;
StringBuilder texto = new StringBuilder();

4. Crear un método que obtendrá el estado del teclado y guardará las teclas oprimidas en un array, también se verificará las teclas presionadas para que solo aparezca una sola vez y no varias veces si la tecla se encuentra presionada:

private void UpdateKeys()
{
  KeyboardState KeyState = Keyboard.GetState();

  Keys[] teclasAnteriores = KeyState.GetPressedKeys();
  Keys[] teclasAntiguas = oldKeyState.GetPressedKeys();
  Boolean encontrado = false;

  for (int i = 0; i < teclasAnteriores.Length; i++)
  {
    encontrado = false;

    // recorre todas las teclas de ambos estados para hacer que se muestre
    // una sola vez
    for (int y = 0; y < teclasAntiguas.Length; y++)
    {
      if (teclasAnteriores[i] == teclasAntiguas[y])
      {
        encontrado = true;
        break;
      }
    }
    if (!encontrado)
    {
      PressKeys(teclasAnteriores[i]);
    }
  }

  oldKeyState = KeyState;

}

5. Crear un método que convertirá cada tecla presionada en un carácter válido: El Enter en una nueva línea, la tecla BackSpace para que borre y así sucesivamente las teclas que vayamos a utilizar, las letras y números se muestra solo convirtiendo las teclas en Char, las teclas de CapsLock (las que cambian de mayúsculas y minúsculas) no funcionan, siempre se muestran las letras en mayúsculas a menos que las cambiemos, en este ejemplo muestro todos los caracteres en minúsculas:

private void PressKeys(Keys tecla)
{
  // verificar cada tecla, algunas cambian con los teclados
  if (tecla == Keys.Back)
  {
    // si hay texto, se remueve el último carácter
    if (texto.Length > 0)
    {
      texto = texto.Remove(texto.Length - 1, 1);
    }
  }
  else if (tecla == Keys.Enter)
  {
    // se agrega una nueva línea
    texto.Append(Environment.NewLine);
  }
  else if (tecla == Keys.Decimal)
  {
    texto.Append(".");
  }
  else
  {
    // las teclas de números y letras no cambian en los teclados
    texto.Append(((char)tecla).ToString().ToLower());
  }
}

6. Para finalizar hay que llamar el método UpdateKeys en el método Update() y dibujar el texto con algún color y en una posición, voy a adicionar un símbolo al final del texto para mostrar en que parte va.

spriteBatch.DrawString(fuente, texto.ToString() + "|", new Vector2(100, 100), Color.Black);

Al ejecutar el proyecto, podemos ver algo como lo siguiente:

Para conocer todas las opciones de la enumeración Keys, en el siguiente link: Enum Keys

Anuncios

Un pensamiento en “Capturar teclado XNA – Texto multilínea

  1. Pingback: Capturar teclado XNA – Texto multilínea « Escarbando Código | tecladosratones.com.es

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s